Skip to content

Commit 1f41645

Browse files
mpstatonclaude
andcommitted
new(context-v, issues, plans): three usability findings from the first real workbench session, plus the didi-chat team-page plan stub
The first working session on the Org Workbench (Lumina Foundation card) surfaced three Usability issues, each screenshot- or live-case-grounded: pulse streams need an editable kind and a user-facing name (Today's Credentials is not a bare classifier); a person's bio on another org's domain (Merisotis on bipartisanpolicy.org) is an affiliation signal the card silently drops — the promote-to-affiliation affordance is missing; and corpus items are invisible on person cards (count-only, a Phase 4 contract decision now disproven in practice) with no coverage view anywhere — you can't assure what you can't see. Also stubs the first agent-action plan: didi chat scoped to the workbench view, proving action = verify an org's team page → staged people objects in STATE → operator alters/verifies → on approval the agent writes persons + affiliations. The stub names the prior art it composes (chat_propose gating, the person.* write path, crawl-fetch-ingest's team-page cascade, Response-Reviewer staging grammar) and leans small-spec-first. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014zrFkWSVgTkoQyiobdBjrd
1 parent c98ab83 commit 1f41645

4 files changed

Lines changed: 295 additions & 0 deletions
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
---
2+
title: "Corpus items aren't visible on person cards — and corpus coverage across entities is hard to assess anywhere"
3+
lede: "The person card says 'Corpus items 3' and shows nothing — a count with no list, no titles, no URLs. Since a core purpose of this work is assuring corpus items exist for every relevant organization and person, the operator can neither inspect what the 3 are nor assess coverage across the entity graph."
4+
date_created: 2026-07-24
5+
date_modified: 2026-07-24
6+
authors:
7+
- Michael Staton
8+
augmented_with:
9+
- Claude Code on Claude Fable 5
10+
semantic_version: 0.0.0.1
11+
tags:
12+
- Issue
13+
- Usability
14+
- Augment-It
15+
- Corpus
16+
- Org-Workbench
17+
- Persons
18+
- Coverage
19+
status: Open · Jotted
20+
---
21+
22+
# Corpus items invisible on person cards; coverage unassessable
23+
24+
## The symptom (screenshot-confirmed, 2026-07-24)
25+
26+
On the Lumina card → People → Jamie Merisotis: **"Corpus items 3"** — a
27+
count, a 🔍, a ➕, and no list. The operator can add a fourth item without
28+
ever seeing the three that exist. Links render in full; corpus doesn't.
29+
30+
## Why this happened (a Phase 4 contract decision, now disproven)
31+
32+
`organization.affiliations` deliberately returns `personal_corpus_count`
33+
only — the Augment-from-DB spec's Phase 4 scoped entry-listing out
34+
("entries ride `affiliation.detail` in a later pass if the operator wants
35+
it"). The operator wants it. First real session with the surface proved
36+
count-only wrong: **assuring corpus coverage is a core purpose of the
37+
workbench**, and you can't assure what you can't see.
38+
39+
## Two layers to the fix (jotted)
40+
41+
1. **Per-card visibility (the direct fix).** Either extend
42+
`organization.affiliations` to return `personal_corpus[]` entries
43+
(payload is small; 8MB NATS ceiling is nowhere near), or lazy-fetch
44+
per-person on expand via the existing `affiliation.detail` (already
45+
returns `person.personal_corpus` — zero new verbs). Render with the
46+
same list shape as links: kind badge · host/title · date. Same
47+
question applies to `content_items` hydration — org corpus rows
48+
render bare URLs today; titles live in the ledger unused.
49+
2. **Coverage assessment (the real job).** A view that answers "which
50+
relevant orgs/people have NO corpus items (or none newer than X)?" —
51+
a sortable roster of entities with link/stream/corpus counts, thin
52+
rows, red-zero highlighting. Could be a lens over the canonical layer,
53+
a workbench mode, or a didi verb (`/coverage`). This is what "hard to
54+
assess" actually asks for; the per-card fix alone doesn't answer it.
55+
56+
## Open questions
57+
58+
- [ ] Eager (extend affiliations reply) vs lazy (affiliation.detail on
59+
expand) — lazy ships with zero service changes; eager is one query.
60+
- [ ] Do corpus rows want titles from `content_items` (a join) or is
61+
URL+kind enough for v1?
62+
- [ ] Where does the coverage roster live — and does it fold into the
63+
usability-iteration sweep alongside
64+
[[No-Component-Library-UI-Improvised-Not-Component-Based]]?
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
---
2+
title: "A person's bio page on another org's site is an affiliation signal, not just an identity link — the UI should offer the promotion"
3+
lede: "Jamie Merisotis has a bio on bipartisanpolicy.org — filed today as an 'other' identity link, full stop. But that URL is really three facts: a static profile (identity link — correct), evidence of an affiliation with an org we may not have yet (Bipartisan Policy Center), and an observation with a source. The card captures the first and silently drops the other two."
4+
date_created: 2026-07-24
5+
date_modified: 2026-07-24
6+
authors:
7+
- Michael Staton
8+
augmented_with:
9+
- Claude Code on Claude Fable 5
10+
semantic_version: 0.0.0.1
11+
tags:
12+
- Issue
13+
- Usability
14+
- Augment-It
15+
- Affiliations
16+
- Persons
17+
- Identity-Links
18+
- Org-Workbench
19+
status: Open · Jotted
20+
---
21+
22+
# Person bio pages are affiliation signals
23+
24+
## The rule of thumb the operator already uses
25+
26+
**If it's static, it goes in identity.** Profiles, bios, involvement pages
27+
`personal_links[]`. That instinct is right and stays.
28+
29+
## What gets dropped today
30+
31+
A bio hosted on *someone else's* org domain carries more than identity.
32+
The live case: Jamie Merisotis (Lumina Foundation card) has links to
33+
linkedin, luminafoundation.org, forbes.com, **bipartisanpolicy.org**, and
34+
wikipedia — every non-linkedin one badged `other`. The bipartisanpolicy.org
35+
link is really:
36+
37+
1. an identity link (captured ✓)
38+
2. **evidence of an affiliation** with the Bipartisan Policy Center — an
39+
organization worth its own record, which may not exist yet (dropped ✗)
40+
3. **an observation**`affiliated_with`, source: that URL (dropped ✗)
41+
42+
The schema handles all three today (`person.affiliate` is N-per-person and
43+
match-or-CREATES the org; observations ride along automatically). Only the
44+
UI path is missing: from a person's link row, there's no "this is also an
45+
affiliation" affordance.
46+
47+
## Direction (jotted)
48+
49+
- **A "promote to affiliation" action on person link rows** — takes the
50+
link's domain as the org seed → org match-or-create (the
51+
`AddPersonInline` gate pattern, inverted: person is fixed, org is being
52+
resolved) → `person.affiliate` with optional role → observation cites
53+
the bio URL as source. Three clicks, no retyping.
54+
- Composes with the existing candidate machinery: `resolver.search` by
55+
domain (D4 already matches `domains[*].domain`) makes the org
56+
suggestion nearly free.
57+
- Same promotion logic belongs in the search-and-add rail eventually —
58+
a result row that IS a bio page could offer add-link *and*
59+
promote-to-affiliation.
60+
- Sibling fact: those `other` badges show `inferLinkKind` needs richer
61+
vocabulary (org-bio / press-profile / wikipedia), or the same
62+
editable-kind treatment as [[Pulse-Streams-Need-Editable-Kind-And-User-Facing-Names]].
63+
64+
## Open questions
65+
66+
- [ ] Where does the affordance live — a per-row action on the person
67+
card's link list, a didi-chat verb, or both?
68+
- [ ] When the org doesn't exist: create thin (name + domain from the
69+
bio page) or route through a full org-resolution gate first?
70+
- [ ] Should the observation's free-text predicate distinguish
71+
`has_bio_at` from `affiliated_with`, letting the human upgrade later?
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
---
2+
title: "Pulse streams need an editable kind and a user-facing name — 'Today's Credentials' is not an 'updates_index'"
3+
lede: "The auto-inferred stream kind is wrong often enough to need a correction path, and streams have no name field at all — but real publication streams have titles. Lumina's https://www.luminafoundation.org/topics/todays-credentials/ is called 'Today's Credentials', and the operator can neither fix its classifier nor record what it's called."
4+
date_created: 2026-07-24
5+
date_modified: 2026-07-24
6+
authors:
7+
- Michael Staton
8+
augmented_with:
9+
- Claude Code on Claude Fable 5
10+
semantic_version: 0.0.0.1
11+
tags:
12+
- Issue
13+
- Usability
14+
- Augment-It
15+
- Pulse-Streams
16+
- Org-Workbench
17+
- Media-Streams
18+
status: Open · Jotted
19+
---
20+
21+
# Pulse streams need editable kind + user-facing names
22+
23+
## The two symptoms (same list, same row)
24+
25+
1. **Wrong kind, no correction path.** `inferStreamKind` guessed a
26+
classifier for Lumina's Today's Credentials stream that doesn't fit
27+
(a `/topics/...` path isn't a blog index in the usual sense, and the
28+
operator reading the row can see it's mislabeled). The org card's
29+
streams list renders the kind badge but offers no way to change it —
30+
the additive-only write discipline (`organization.streams.add`,
31+
`shapeStream`) has add and nothing else. The ➕ form does accept a
32+
manual kind at add time, but a stream that arrived with a wrong
33+
inferred kind is stuck with it.
34+
2. **No name at all.** `media_streams[]` entries carry
35+
`{url, kind, party, url_domain, added_at}` — no `name`/`title` field.
36+
Many organizations title their publication streams ("Today's
37+
Credentials", "Insights", named newsletters); the operator knows the
38+
name at add time and has nowhere to put it. The card then renders a
39+
bare hostname, which reads as noise once an org has three streams on
40+
the same domain.
41+
42+
## Directions (jotted)
43+
44+
- **Schema is SCHEMALESS — adding `name` is free** on the entry shape;
45+
the work is the verb + UI, not migration. `shapeStream` gains an
46+
optional `name`; the ➕ form gains a name input.
47+
- **An update verb**`organization.streams.update` (match by URL,
48+
patch `kind`/`name`) breaks new ground: the entity-list discipline so
49+
far is strictly additive. Precedent for careful updates exists
50+
(`resolver.update_org` edits name/slug with the old slug pushed into
51+
aliases). The same match-by-URL + patch shape presumably extends to
52+
`org_links` kinds later (same misclassification risk there —
53+
see the person-card 'other' badges).
54+
- **UI**: kind badge and name become click-to-edit on the stream row —
55+
the view-AND-edit-in-place ruling already governs this card.
56+
- **Naming convention check**: confirm the observed classifier value and
57+
whether `inferStreamKind`'s vocabulary (blog_index / newsroom / rss /
58+
youtube_channel / substack …) wants a `topic_hub` or `publication`
59+
member, or whether operator-set names make finer kinds unnecessary.
60+
61+
## Open questions
62+
63+
- [ ] Does `kind` even matter once `name` exists, beyond scan-mode
64+
routing (rss/blog_index get the dependable scan path)? Maybe kind
65+
collapses to "scannable-how" and name carries the meaning.
66+
- [ ] Update semantics vs the additive discipline — is match-by-URL patch
67+
acceptable, or does correction mean remove+re-add with provenance?
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
---
2+
title: "Didi chat joins the Org Workbench — first agent action: verify a team page and turn it into approved people objects"
3+
lede: "Integrate the didi chat rail with the Org Workbench so agents can take view-scoped actions. The proving action: point didi at an organization's team page; it returns people objects INTO STATE (not the DB), the user alters or verifies them on the card, and only on approval does the agent write person + affiliation records — to SurrealDB, or CSV, or whatever backend the workspace is using."
4+
date_created: 2026-07-24
5+
date_modified: 2026-07-24
6+
authors:
7+
- Michael Staton
8+
augmented_with:
9+
- Claude Code on Claude Fable 5
10+
semantic_version: 0.0.0.1
11+
tags:
12+
- Plan
13+
- Augment-It
14+
- Org-Workbench
15+
- Didi-Chat
16+
- Agent-Actions
17+
- Team-Page
18+
- Persons
19+
- Affiliations
20+
status: Draft · Stub
21+
---
22+
23+
# Didi chat in the Org Workbench — team page → people objects
24+
25+
<!-- stub — captured 2026-07-24 from the operator's dictation; to be
26+
developed before execution. Sequenced AFTER the jotted usability issues
27+
or alongside them; not yet slotted against a spec. -->
28+
29+
## The ask, verbatim-adjacent
30+
31+
1. Integrate didi chat into the Org Workbench view so agents can take
32+
certain actions scoped to what the operator is looking at.
33+
2. The proving action: **verify the team page of an organization**
34+
didi fetches/parses it and returns **people objects in STATE**,
35+
presented on/next to the card.
36+
3. The user **alters or verifies** the staged people (names, roles,
37+
dedupe against candidates).
38+
4. **On approval**, the agent creates the person objects — and their
39+
affiliations to the org — in the DB instance (or CSV if that's the
40+
active backend) for everyone on that team page.
41+
42+
## Prior art this composes (don't reinvent)
43+
44+
- **Chat verb registry + propose/approve gating**
45+
`services/workspace/src/chat.ts` (`chat_answer` / `chat_propose` /
46+
`chat_invoke`); the CURATOR_CHAT_VERBS slab is the template for an
47+
ORG_WORKBENCH_CHAT_VERBS sibling. The propose step IS the approval
48+
gate this flow needs.
49+
- **The write path exists end-to-end**`person.candidates`
50+
`person.apply``person.affiliate` (N-per-person, org pre-bound,
51+
observations ride along). The agent loops it per approved row; nothing
52+
new below the capability line except maybe a batch wrapper.
53+
- **Team-page parsing** — the `crawl-fetch-ingest` skill's
54+
firm-anchored cascade (team pages → people + headshots + LinkedIn
55+
URLs) is the extraction playbook; Firecrawl/Jina are already wired.
56+
- **Staged-state-then-approve** — the Response Reviewer triage model and
57+
the AddPersonInline candidate gate are the UI grammar: staged rows,
58+
per-row accept/edit/skip, batch approve.
59+
- **Chat rail is already adjacent** — the shell mounts chat as the
60+
persistent left rail; "didi knows what card you're on" needs the
61+
active-entity context (org_slug) in the chat envelope, akin to the
62+
active-client context the inbox verb already carries.
63+
64+
## Rough shape (to be developed)
65+
66+
1. Context plumbing: org-workbench broadcasts its active org
67+
(`augment-it:active-entity` or a workspace frame) → chat includes it.
68+
2. Verb: `org.team_page.scan` (propose-shaped) — input: team-page URL
69+
(from org_links or operator-pasted); output: staged
70+
`people: [{name, role, headline?, linkedin?, bio_url}]` in state.
71+
3. Staging UI on the workbench: the people reveal grows a "staged"
72+
section (distinct chrome) with per-row edit/verify/skip.
73+
4. Approval → batch `person.candidates/apply/affiliate` with
74+
per-row candidate gates ONLY where matches are ambiguous
75+
(exact-no-candidates rows can flow; the gate-every-step thesis
76+
applies to writes, and approval WAS the gate).
77+
5. Provenance: every created person's observation cites the team-page
78+
URL as source.
79+
80+
## Open questions (for the development pass)
81+
82+
- [ ] Where does staged state live — org-workbench runes state, a
83+
workspace frame (survives remount), or chat-turn state?
84+
- [ ] Ambiguous-match policy: inline per-row gates vs. kick ambiguous
85+
rows to AddPersonInline?
86+
- [ ] "or CSV" — does the record-set backend variant matter for v1, or
87+
is canonical-DB-only acceptable first?
88+
- [ ] Relationship to [[../issues/Person-Bio-Pages-Are-Affiliation-Signals-Not-Just-Identity-Links]]
89+
— the team-page scan mass-produces exactly the promotion that issue
90+
wants one-at-a-time.
91+
- [ ] Does this want a spec first (it crosses chat + workbench + state
92+
staging), or is it plan-sized? Leaning: small spec, per the
93+
developing-a-spec rhythm — this stub is the pre-spec capture.

0 commit comments

Comments
 (0)