|
| 1 | +--- |
| 2 | +date_created: 2026-07-24 |
| 3 | +date_modified: 2026-07-24 |
| 4 | +title: "Create an organization from the workbench — behind the 'be sure there is no match' gate" |
| 5 | +lede: "The workbench could only find orgs that already exist. '+ New organization' opens a gated create: scored candidates from every match signal surface first, picking one just opens it, and creating is an explicit choice past the gate — with the new org's domain seeded so it's matchable from birth." |
| 6 | +publish: true |
| 7 | +authors: |
| 8 | + - Michael Staton |
| 9 | +augmented_with: |
| 10 | + - Claude Code on Claude Fable 5 |
| 11 | +files_changed: |
| 12 | + - services/record-surrealdb-resolver/src/resolver.ts |
| 13 | + - apps/org-workbench/src/OrgCreateInline.svelte |
| 14 | + - apps/org-workbench/src/App.svelte |
| 15 | + - apps/org-workbench/src/app.css |
| 16 | + - apps/org-workbench/src/lib/org-client.ts |
| 17 | + - apps/org-workbench/src/lib/types.ts |
| 18 | +tags: |
| 19 | + - Org-Workbench |
| 20 | + - Organizations |
| 21 | + - Candidate-Gate |
| 22 | + - Usability |
| 23 | +--- |
| 24 | + |
| 25 | +# Create an organization from the workbench |
| 26 | + |
| 27 | +## What shipped ([#29](https://github.com/lossless-group/augment-it/issues/29)) |
| 28 | + |
| 29 | +A **+ New organization** button beside the org search opens |
| 30 | +`OrgCreateInline` — the third member of the gate family |
| 31 | +(`AddPersonInline`, `AddAffiliationInline`). The operator types a name and |
| 32 | +optionally a website/domain, and "Find matches" runs the **scored** |
| 33 | +candidate path (`resolver.candidates`: slug 100 · domain 90 · fuzzy name |
| 34 | +60, with per-candidate link/stream/corpus counts) — not the autocomplete's |
| 35 | +lighter name-contains. The gate always shows: picking a candidate simply |
| 36 | +opens that org's card (no write); "No match — create" is an explicit |
| 37 | +choice past the evidence, never a silent submit. |
| 38 | + |
| 39 | +A created org seeds its `domains[]` from the given site (domain-matchable |
| 40 | +from birth, per the bio-promotion precedent) and the website URL lands as |
| 41 | +its first `org_links` entry. |
| 42 | + |
| 43 | +## Zero new verbs, one access fix |
| 44 | + |
| 45 | +Creation rides `person.affiliate`'s documented org-only path (no |
| 46 | +`person_uuid` → resolve the org, no edge, no observation) — the |
| 47 | +"independent decisions" design earning its keep. The one service change is |
| 48 | +a fix the flow surfaced: `resolveOrgRow`'s create branch, when the slug |
| 49 | +already exists (minted by another client), returned the org without |
| 50 | +granting the caller's client access — the follow-up card load couldn't see |
| 51 | +its own result. Create-intent now unions `client_access`, consistent with |
| 52 | +the shared-canonical / per-workspace-visibility model. |
| 53 | + |
| 54 | +## Verification |
| 55 | + |
| 56 | +Resolver typecheck clean; org-workbench svelte-check 92 files / 0 errors; |
| 57 | +org-workbench + shell builds green; resolver container rebuilt and |
| 58 | +reconnected to NATS. Operator walk-through: ➕ → type a known org's name |
| 59 | +(candidates surface, top one opens on click) → type a genuinely new org |
| 60 | +with its domain → gate shows none → create → the card opens with the |
| 61 | +website already in its links. |
0 commit comments