← Changelog

The search-and-add remote ships β€” editable search terms, a provider palette, and one-click add wired back to the org card

The flow's second microfrontend: every πŸ” on the org card opens a paired search rail with the term in an always-editable bar, providers a chip away (SearXNG preselected, Exa/Tavily/SerpApi as peers), and every result row one βž• from landing on the launching entity's list β€” with the card refetching the instant it does.

Phase 3 of Augment From DB Flow: apps/search-and-add (:3016) exists, and the spec's searchβ†’add sequence diagram is now real chrome. Click πŸ” next to any list on the org card β†’ the shell opens the orgWorkbench+searchAndAdd pairing (card keeps 55%) β†’ the seeded term sits in an editable bar β†’ results land β†’ one βž• per row adds to exactly the list that launched the search β†’ the card refetches via augment-it:entity-updated.

What shipped

The remote. TermBar is the standing constraint made chrome β€” the term is always visible, always editable, Enter re-fires. ProviderPalette renders connectors.inventory as chips (short_label + cost tier, paid tiers dash-bordered, needs-env dark and unclickable, "auto" = registry free-tier-first). ResultRow carries the one-click βž• with per-row added/error state β€” re-adds are server-side dedup'd anyway. Auto-fires once per fresh envelope: searches are reads; the gating thesis governs writes, and every write here is one deliberate click.

The launch contract, hardened (D2 refinement). The augment-it:search-request CustomEvent alone is racy β€” search-and-add mounts asynchronously when its pairing first opens, so a dispatch-then-mount ordering would drop the payload. The envelope therefore ALSO persists to localStorage['augment-it:search-request'] (the repo's established cross-remount pattern); the remote reads it on mount, then listens live. org-workbench's requestSearch() does all three writes in order: localStorage β†’ search-request event β†’ augment-it:navigate {remoteId:'searchAndAdd'}.

Verb routing. org: links/streams/corpus β†’ the three organization.*.add verbs; person: links/corpus β†’ the two person.*.add verbs (persons have no streams β€” the combination is guarded at both the client and App level). Person-shaped envelopes are fully wired but nothing dispatches them until Phase 4's people reveal.

Seed terms, hardcoded v1 (spec open question stands): links "<name>" LinkedIn Β· streams "<name>" blog Β· corpus "<name>" news. The operator rewrites them freely β€” that's the point of the TermBar.

Proof

svelte-check 0/0 on both remotes; both build plus the shell; :3016/remoteEntry.js β†’ HTTP 200; Phase 1 proof re-run 7/7 (the search.fire + inventory paths this remote consumes). The full browser loop β€” πŸ” β†’ pairing opens β†’ edit term β†’ swap to Exa β†’ βž• β†’ card refreshes β†’ dedup on second βž• β€” is the operator's walk-through; every scriptable leg beneath it is scripted.

What's next

Phase 4: the people reveal β€” organization.affiliations rendered as person rows under the org card, nested person links/corpus with their own βž• and πŸ” (the person-shaped envelopes this remote already routes), and add-person-with-automatic-affiliation via person.affiliate.