Lossless Changelog
product

Workbench usability sweep — corpus entries visible, streams named and correctable, bio links promotable to affiliations

The first real workbench session filed seven issues; the three in today's scope ship together: person cards list their corpus entries instead of a bare count, pulse streams gain a user-facing name and an in-place kind/name editor, and a bio page on another org's site can be promoted to an affiliation in three clicks.

Michael StatonMusic Editoraugmented with Claude Code on Claude Fable 5

Workbench usability sweep — three of the 2026-07-24 issues ship

The first real session with the org workbench (2026-07-24) produced seven jotted issues. Three made today's scope — the plan that evaluated them against the codebase is [[context-v/plans/Workbench-Usability-Sweep-Corpus-Visibility-Stream-Editing-Affiliation-Promotion|the sweep plan]], and each shipped as its own commit, closing GitHub issues #20, #26, and #25.

Corpus entries are visible on person cards (#20)

"Corpus items 3" with no list is a count you can't assure coverage with. organization.affiliations now carries personal_corpus[] alongside the count (eager, symmetric with personal_links), and the person card renders it with the same AdditiveList the links use — kind badge, host, date, plus the existing ➕ and 🔍. The Phase 1 count-only contract is formally disproven and retired. Entries render URL+kind for v1: content_items holds no titles today, so title hydration is a content-ingest rider, and the coverage roster ("which entities have NO corpus?") folds into the component-library sweep.

Pulse streams get a name and an editable kind (#26)

"Today's Credentials" is not an updates_index. Stream entries gain an optional operator-facing name (hostname stays the display fallback), the ➕ form takes it at add time, and a new organization.streams.update capability — the first patch on an entity-list entry — corrects kind/name on an existing row, matched by its de-facto key, the exact URL. Entries stay additive (no delete); fields on them are now correctable, with the same client_access/last_touched stamping resolver.update_org models. Safe because stream kind is descriptive-only today: stream-scan routes every kind down the same path. inferStreamKind also learns topic_hub, so /topics/… paths stop landing as updates_index in the first place.

Jamie Merisotis's bipartisanpolicy.org bio was filed as an other identity link — correct, and two facts short: the affiliation it evidences, and the observation citing it. Person link rows now carry a → affiliation action opening AddAffiliationInline: AddPersonInline's gate inverted, person fixed and org being resolved. Candidates load from the bio's domain via resolver.search (D4 already matches domains[*].domain); the gate always shows — pick an existing org or create a thin one. person.affiliate does what it always did (match-or-create, N-per-person dedupe, automatic affiliated_with observation), now with the bio URL as the observation's source and one new input: org_domain, seeded into domains[] on create so a promotion-born org stays domain-matchable forever after.

Verification

Resolver + workspace typechecks clean; org-workbench svelte-check 0/0; org- workbench and shell builds green. The write paths are not exercised headlessly per the additive-writes discipline — the operator walk-through is: Lumina → People → Jamie Merisotis → see the three corpus entries; rename the Today's Credentials stream and fix its kind; promote the bipartisanpolicy.org link and watch the affiliation + observation appear.