Skip to content

Commit a89cb47

Browse files
mpstatonclaude
andcommitted
ship(feature, org-relations): organizations know their family tree — relate, tag, walk, and file by aboutness
The full arc is live: parent/child/peer relations with typed kinds and free-text context, the first org tag mechanism, the Org Workbench surface to work both, didi + triage integration, and the pilot untangle that proved the whole thing on the case that demanded it — which turned out to be two distinct entities all along (UpMobility Foundation peer/ partners_with Urban Institute, not initiative-of). First complete run of context-v/loops/Implement-Feature-Loop.md: init 570d0b6 → tickets #49-#57 all closed (cedf12b, 62ab198, 2e10cdd, afbfa21, d4371d5, f66116e, 73a508e; pilot disk half in reach-edu 30e0453) → agent drives green → operator walk-through passed, spawning one fix-ticket (#57, corpus-kind datalist) and the superseding peer ruling → this closing bracket. This commit: changelog polished for the reader (pilot beat, What's next, full files_changed), plan → Shipped with post_ship_note, issue worklist A-1 + section C checked with the ruling recorded. The surrealdb-canonical-layer skill snapshot updated in its own repo (lossless-agent-skills ed8ebd7). Remaining welds (Truist↔LiftFund, Beacon, Koch edges, USDA, Harvard chain) untangle lazily at filing pressure, tracked in the issue file. Files changed: - changelog/2026-07-27_01_Organizations-Learn-Their-Family-Tree-Parent-Child-Peer-Relations-Plus-Org-Tags.md - context-v/plans/Org-Relations-Parent-Child-Peer-Plus-Org-Tags.md - context-v/issues/Parent-Child-Nested-Organizations-Not-Modeled.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RW28dw3kQAKXr2ZNefCukE
1 parent 73a508e commit a89cb47

3 files changed

Lines changed: 88 additions & 29 deletions

changelog/2026-07-27_01_Organizations-Learn-Their-Family-Tree-Parent-Child-Peer-Relations-Plus-Org-Tags.md

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,30 @@ augmented_with:
1111
files_changed:
1212
- context-v/plans/Org-Relations-Parent-Child-Peer-Plus-Org-Tags.md
1313
- context-v/loops/Implement-Feature-Loop.md
14+
- context-v/issues/Parent-Child-Nested-Organizations-Not-Modeled.md
15+
- context-v/agent-skills/triage-inbox-w-suggestions/SKILL.md
16+
- services/record-surrealdb-resolver/src/org-relations.ts
17+
- services/record-surrealdb-resolver/src/resolver.ts
18+
- services/record-surrealdb-resolver/src/handlers.ts
19+
- services/record-surrealdb-resolver/src/domains.ts
20+
- services/record-surrealdb-resolver/src/server.ts
21+
- services/workspace/src/capabilities.ts
22+
- services/workspace/src/chat.ts
23+
- apps/org-workbench/src/RelatedOrgs.svelte
24+
- apps/org-workbench/src/OrgCard.svelte
25+
- apps/org-workbench/src/App.svelte
26+
- apps/org-workbench/src/AdditiveList.svelte
27+
- apps/org-workbench/src/lib/types.ts
28+
- apps/org-workbench/src/lib/org-client.ts
29+
- scripts/prove-org-relations.mjs
1430
---
1531

1632
# Organizations Learn Their Family Tree
1733

18-
> **Stub note:** this entry is being written *as the work lands*, per the
19-
> [[../context-v/loops/Implement-Feature-Loop|Implement-Feature-Loop]] (its
20-
> first run). `## What landed` accumulates a beat per closed ticket; the
21-
> polish pass happens at ship. Tickets: augment-it #49#56.
34+
> Written beat-by-beat *as the work landed* — the first run of the
35+
> [[../context-v/loops/Implement-Feature-Loop|Implement-Feature-Loop]]
36+
> (tickets #49#57, `init(feature, org-relations)`
37+
> `ship(feature, org-relations)` in one day, human gate included).
2238
2339
## Why Care?
2440

@@ -191,3 +207,33 @@ across the client's orgs — 19 in reach-edu on first fire (`annual_report`,
191207
Autocomplete, never enforcement: a non-match creates exactly what the
192208
operator typed, the same open-vocabulary philosophy as relation kinds.
193209
Refreshed per card load, so a kind minted on one org suggests on the next.
210+
211+
### The pilot untangle — and the conflation confesses (#56)
212+
213+
The acceptance test was the case that started it all:
214+
`funders/upmobility-foundation-urban-institute/`. Walking it through the
215+
live workbench produced the run's best finding: **the weld was never a
216+
parent and its initiative — it was two distinct entities.** UpMobility
217+
Foundation (upmobility.org, a nonprofit donor) and Urban Institute's
218+
*Upward Mobility* initiative (upward-mobility.urban.org) had been fused by
219+
a host-family match. The operator ruled them **peers** (`partners_with`
220+
edge), minted `urban-institute` (+`Think-Tank` tag) through the UI, and
221+
the 17-file sweep split the folder by aboutness: seven UpMobility captures
222+
into the renamed `funders/upmobility-foundation/`, six Urban files into
223+
`think-tanks/urban-institute/` (including the three captures parked since
224+
triage batch 1, now registered as `content_items`), two fetch-blocked
225+
profiles gated, two mis-packed third parties re-inboxed — and **zero
226+
`reference_of:` pointers**, because the DB edge itself is the connection.
227+
reach-edu commit `30e0453`.
228+
229+
The issue's remaining welds (Truist↔LiftFund, Beacon, the Koch
230+
constellation edges, USDA↔Rural Development, the Harvard chain) untangle
231+
lazily at filing pressure, now with the tools this ship built.
232+
233+
## What's next
234+
235+
- The rest of the reconciliation worklist, case by case, in triage sessions.
236+
- Corpus roll-up lenses (child content surfacing on the parent) — deferred
237+
until the edges earn it.
238+
- Multi-hop chains (Project on Workforce ⊂ HKS ⊂ Harvard) render one hop
239+
today; walking is click-through.

context-v/issues/Parent-Child-Nested-Organizations-Not-Modeled.md

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ authors:
77
- Michael Staton
88
augmented_with:
99
- Claude Code on Claude Fable 5
10-
semantic_version: 0.0.0.2
10+
semantic_version: 0.0.1.0
1111
revisions:
12+
- 2026-07-27 — **Model shipped + pilot untangled (0.0.1.0).** Section C fully checked (edges in `affiliations`, six capabilities, workbench surface, triage step 5b); pilot case A-1 done with a superseding ruling — UpMobility Foundation and Urban Institute's Upward Mobility initiative are DISTINCT entities, related peer/`partners_with`, not initiative-of. All three parked captures filed. Remaining: worklist A-2..4 and B, untangled lazily at filing pressure per the standing ruling.
1213
- 2026-07-25 — Initial draft, written mid-triage-run when the Urban Institute event page (batch 1 item 18) was parked rather than filed into the conflated funder folder.
1314
- 2026-07-27 — **Reconciliation worklist added (0.0.0.2).** After the DB-slug-is-source-of-truth pass renamed every cleanly-renamable folder, the welded slugs are the last disk↔DB divergence — operator directed: build this in and track it. Full per-case inventory with current state and untangle steps; gh issue opened for the work trail.
1415
tags:
@@ -100,14 +101,19 @@ pointers across the seam, (4) re-home any parked inbox captures.
100101

101102
### A. Welded disk folders (4)
102103

103-
- [ ] **`funders/upmobility-foundation-urban-institute/`** — Upward Mobility
104-
Foundation (initiative) welded to Urban Institute (parent). Clean
105-
`upmobility-foundation` row EXISTS (operator-created); `urban-institute`
106-
row does not. Three inbox captures parked on this case (event page,
107-
homepage, 2025 impact report). Untangle: mint `urban-institute`
108-
(think-tank), edge `upmobility-foundation —initiative_of→
109-
urban-institute`, split folder content by aboutness, file the three
110-
parked captures. **The pilot case — do this one first.**
104+
- [x] **`funders/upmobility-foundation-urban-institute/`** — UNTANGLED
105+
2026-07-27 (the pilot case, run through the live Org Workbench +
106+
operator-confirmed sweep). **Ruling supersedes the original framing:**
107+
the weld conflated two DISTINCT entities — UpMobility Foundation
108+
(upmobility.org, a nonprofit donor) and Urban Institute's Upward
109+
Mobility *initiative* (upward-mobility.urban.org). The operator ruled
110+
the relation **peer / `partners_with`**, not initiative_of — the
111+
initiative is Urban's, not the foundation's. `urban-institute` minted
112+
via the workbench (+`Think-Tank` tag); edge live in `affiliations`;
113+
folder split by aboutness (7 files → `funders/upmobility-foundation/`,
114+
6 → `think-tanks/urban-institute/` incl. the three parked captures,
115+
2 gated, 2 re-inboxed) with NO `reference_of:` pointers — the DB edge
116+
carries the connection. reach-edu commit `30e0453`.
111117
- [ ] **`funders/truist-foundation-liftfund-us/`** — Truist Foundation welded
112118
to LiftFund (a CDFI grantee/partner, not a sub-org — the edge here is
113119
`funds`/`partners_with`, not `initiative_of`). Clean `truist-foundation`
@@ -142,23 +148,27 @@ pointers across the seam, (4) re-home any parked inbox captures.
142148

143149
### C. The build (what "model lands" means)
144150

145-
- [ ] Ratify the edge shape: a typed `org_relations` RELATE edge
146-
(`kind: initiative_of | fund_of | program_of | agency_of | chapter_of |
147-
funds | partners_with`), queryable both directions.
148-
- [ ] Capabilities: `organization.relate` (+ list/remove) on the wire, so
149-
edges never need direct writes.
150-
- [ ] Surface: entity card shows parent/children; corpus lenses can roll a
151-
child's content up to the parent.
152-
- [ ] Triage integration: the skill's aboutness routing gains a "parent or
153-
child?" step once edges exist; the four welded folders above get
154-
untangled as the acceptance test.
151+
- [x] ~~Ratify the edge shape~~ — SHIPPED 2026-07-27, with one deliberate
152+
deviation from the candidate shape: org→org edges live in the
153+
existing **`affiliations`** table (`edge_type: 'org_org'`,
154+
`rel: 'child_of' | 'peer'`, open-vocabulary `kind`, free-text
155+
`description`, `client_access`), not a new `org_relations` table.
156+
Per [[../plans/Org-Relations-Parent-Child-Peer-Plus-Org-Tags]].
157+
- [x] ~~Capabilities~~ — `organization.relate / relations / unrelate /
158+
relation.update` + `organization.tag.add / tag.remove` live; proof
159+
script `scripts/prove-org-relations.mjs` 22/22 green.
160+
- [x] ~~Surface~~ — Org Workbench card shows Part of / Contains / Peers
161+
with click-through navigation + a Tags row. (Corpus roll-up lenses
162+
deliberately deferred — named out-of-scope in the plan.)
163+
- [x] ~~Triage integration~~ — aboutness routing landed as step 5b in the
164+
triage skill + didi's slabs; pilot untangle done (worklist A-1 above).
155165

156166
## Parked pending this issue
157167

158-
- `inbox/2026-06-10_apprenticeship-industry-driven-made-to-scale.md` (Urban
159-
Institute event; batch 1 #18)
160-
- `inbox/2026-06-10_driving-impact-by-equipping-changemakers-with-evidence-and-s.md`
161-
(Urban Institute homepage; batch 2)
168+
~~All three parked captures filed 2026-07-27~~ (event page, homepage, AND
169+
the 2025 impact report) → `think-tanks/urban-institute/`, registered via
170+
`organization.corpus.add`, reach-edu commit `30e0453`. Nothing remains
171+
parked on this issue.
162172

163173
## See also
164174

context-v/plans/Org-Relations-Parent-Child-Peer-Plus-Org-Tags.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ authors:
77
- Michael Staton
88
augmented_with:
99
- Claude Code on Claude Fable 5
10-
semantic_version: 0.0.0.2
10+
semantic_version: 0.0.1.0
11+
date_first_published: 2026-07-27
1112
issue_reference: "[[../issues/Parent-Child-Nested-Organizations-Not-Modeled]]"
13+
post_ship_note: "Executed same day as authored, first run of [[../loops/Implement-Feature-Loop]] (tickets #49–#57, init 570d0b6 → ship). Proof script caught two real relation.update bugs; the browser drive caught a keyboard-unreachable affordance; the human gate added #57 (corpus-kind datalist) and a superseding pilot ruling — UpMobility Foundation and Urban Institute are DISTINCT entities, peer/partners_with, so the pilot needed no reference_of pointers at all."
1214
revisions:
15+
- "2026-07-27 — v0.0.1.0 — Shipped. All four phases landed; pilot untangled with the peer ruling; #56 worklist tracked in the issue file."
1316
- "2026-07-27 — v0.0.0.2 — status → Implementing at loop start ([[../loops/Implement-Feature-Loop]] first run). Superseded by reality: `tag.suggest` / `tag.apply` verbs already exist (capabilities.ts:240-241, domains.ts) — §1.4's 'add a thin tags.vocab' is unnecessary; the UI datalist rides `tag.suggest`, and the org tag handlers reuse `ensureTagInVocab` + `toDashed` from domains.ts. (`tag.apply` itself is source_usages-scoped, not reusable for orgs.)"
1417
tags:
1518
- Plan
@@ -18,7 +21,7 @@ tags:
1821
- Canonical-Layer
1922
- Org-Workbench
2023
- Data-Modeling
21-
status: Implementing
24+
status: Shipped
2225
---
2326

2427
# Org Relations (parent/child/peer) + Org Tags

0 commit comments

Comments
 (0)