← Corpus / augment-it / issue
Capability Gaps Surfaced by the First Triage Co-Pilot Run — One Collective Ledger, Not Five Tickets
Five gaps from the first triage run — including direct SurrealDB writes whose string-typed ids silently failed to join their org rows.
- Path
- issues/Capability-Gaps-Surfaced-by-First-Triage-Run.md
- Authors
- Michael Staton
- Augmented with
- Claude Code on Claude Fable 5
- Tags
- Issue · Augment-It · Capabilities · Corpus-Triage · SurrealDB
Capability Gaps Surfaced by the First Triage Run
Run manifest with full context: clients/reach-edu/corpus/inbox/_triage-runs/2026-07-24_1.md.
Sibling issue: [[Parent-Child-Nested-Organizations-Not-Modeled]] (the one gap big
enough for its own file).
1. No org-side observation capability
person.add_observation exists; organizations have nothing. The operator’s
“flag it association and network” / gov-entity flags had to be direct
SurrealDB writes mirroring createObservation(). Wants an
organization.add_observation twin.
Why it’s worse than inconvenient — the typing hazard: the direct writes
initially stored subjects as string-typed record ids
(organizations:⟨uuid⟩) while org rows use uuid-typed ids
(organizations:u"uuid"). The observations were self-consistent but did not
join to their org rows — silently. Discovered and repaired 2026-07-25 (9
observations re-typed). This is exactly the class of bug the capability wire
exists to prevent; every future direct write risks reintroducing it.
2. conventional_name has no edit affordance in the entity card
resolver.update_org sets it (and does slug renames, preserving old slugs as
aliases), but the UI’s chip editors cover only aliases/domains (per
Entity-Card-Edit-And-Remove-Affordances). Related: the create flow mints all
name fields from one string (“Stanford-PACS” became both complete_name and
conventional_name), so every UI-created org needs a post-create enrichment
pass. The ratified naming model (slug derived / conventional_name /
complete_name / greedy aliases) lives in the triage skill.
3. source.add has no slug override for fetch-hostile URLs
The capability Jina-fetches metadata to derive the source slug/filename. When
the fetch hits a wall, the slug is garbage: a ccdaily.com article slugged
https-match-adsrvr-org-track-cmf-google (ad-tracker redirect), a
bizneworleans.com article slugged 403-forbidden. Disk files were renamed by
hand; DB source_usages.corpus_path still records the junk paths for
those two (workforce-development sources). Wants a slug/title override
arg, or a post-hoc path-patch capability.
4. source.fetch clobbers merged canonical bodies
The triage mechanics ruling (inbox-file-is-canonical) merges the already-
fetched inbox body over the metadata-only stub, but the DB registry still says
metadata-only. Running source.fetch on such a source would refetch and
overwrite the canonical verbatim body. Interim rule: never run it on merged
sources. Real fix: a registry-status patch, or a source.add variant that
accepts a provided body (which would also fix half of gap 3).
5. No org delete/merge capability
The duplicate bhef org row could not be removed over the wire. Resolution
used (2026-07-25, non-destructive, reversible): corpus entries moved to the
keeper via remove/add; keeper aliased BHEF/bhef; orphan row updated in
place — slug renamed to bhef-merged-duplicate, merged_into pointer set to
the keeper, client_access cleared (original value recorded in
merged_note) so it vanishes from workspace reads without losing data. Wants
a first-class organization.merge that does exactly this.