Repository navigation
Conversation
The stored `status: 'reviewed' | 'auto'` never earned its keep. Viewers were told "unreviewed" about text nobody was going to fix mid-service — noise they can't act on — and in practice what decides whether a slide gets a human's attention is a *note*, not a tier. Deleted: - `SlideStatus`, `status` and `reviewedAt` from `SlideTranslationEntry`, the library record, and `PerSlideTranslation`. `provenance` stays; nothing branches on it. - the "unreviewed" badge in the slide viewer. - `resolveSlideTranslation`'s two-pass quality walk — it now returns the first entry along the fallback chain. Behavior change: a Creole viewer with no Creole text now sees the French one whatever produced it, where before an unreviewed French text was withheld and the slide read "(not translated)". - the Python work-ahead translator's protected-entry check. It now writes only keys that are *missing*, so it can't clobber anyone. Keys are content-addressed, so an existing entry already translates this exact text. The per-cell chip in the review grid now says "Saved", which is what it always meant: the draft matches what is in the library. Surfaced instead: `set_translations` has always let the model attach a per-segment `note` — "a genuine ambiguity or judgement call worth flagging" — and we dropped it on the floor. Notes now ride on the conversation (`SlideConversation.notes`, content-addressed by language + source text, seeded into each agent run and replaced wholesale by its result), and the review screen is organized around them: the service-item list is a row of chips badged with each item's note count, flagged rows are tinted and marked, and a flagged cell leads with its note above the textarea. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RuD8vmbn9ku8wbVQYMH5BH
It existed only for Phase C-import's `firstDraftBySlide` path, which the alignment rethink removed — the value outlived its writer and was never stored by anything. `'bible'` and `'creed'` stay, unwritten, with a note on what they are for: the agent claiming a slide is the published wording rather than its own rendering. That claim is worth storing because it is checkable — the canonical text `lookup_bible_passage` returns is what a harness would check it against. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RuD8vmbn9ku8wbVQYMH5BH
The docstrings on the Python worker, its tests, and the agent prompt helpers still said the worker protected `reviewed` entries and that the library was the "already-reviewed" context. The tier is gone: the worker fills missing keys only, and the library is just what a human saved. Three test fakes were still returning a `status` field nothing reads. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`llm` was the initial draft and `llm-agent` a follow-up revision — but the initial draft is the same agent, so the split named nothing. Nothing read it. The button ran the same agent the Proclaim service already ran for every item, without the French-screen grounding the service passes, and replaced the service's conversation. Calling it "Suggest" hid that; "Re-draft" (or "Draft" when nothing has drafted the item yet) says what it does. Removing it altogether is #153. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
A follow-up plan once 169/170 land: Credit Scripture versions on translated slidesContextThe slide agent ( Decisions made: the model declares the credit, and the viewer shows version + license Design1. Sources registry:
|
What
Two halves, same idea: stop tracking a quality tier nobody acts on, and start showing the per-slide notes that actually say "look at this one."
Deleted — the
reviewed/autostatusSlideTranslationEntryis now{ text, provenance }. Gone:SlideStatus,status,reviewedAt, and the viewer's "unreviewed" badge.resolveSlideTranslationcollapses from a two-pass quality walk to "first entry along the fallback chain."slideLibrary.tsno longer stampsstatus: 'reviewed'/reviewedAt. It rebuilds records on load rather than storing them verbatim, so the dropped fields don't ride along into the next write of the on-disk library.slide_translator.py(the Python work-ahead worker) no longer needs to recognize a protected entry._store_translationsnow writes only keys that are missing. Keys are content-addressed, so an entry that exists already translates this exact text — whoever wrote it knew at least as much as this run does.Surfaced — the model's per-slide notes
set_translationshas always had an optional per-segmentnote("a genuine ambiguity or judgement call worth flagging").applySetTranslationsthrew it away, and the conversation panel summarized the call as✍️ set translations: French (5)— so the notes existed and were visible nowhere.Now they ride on the conversation:
SlideConversation.notes, content-addressed by language + source text. Each agent run is seeded with the item's current notes and returns the whole set, so the server replaces rather than merges, and a follow-up touching one slide can't silently drop the notes on the others. A rewrite with no note withdraws the note it had; arevise_translationdeliberately leaves notes alone.The review screen is reorganized around them:
<select>, each badged📝 nwith its note count — the "at a glance, which things have notes" view;The
set_translationstool description now tells the model its note is displayed and marks the item — so it has a reason to be sparing.Behavior change worth a look
A Haitian Creole viewer with no Creole text for a slide now sees the French one, whatever produced it. Previously an unreviewed French text was withheld and the slide read "(not translated)". With the tier gone this is the only coherent reading of the fallback chain, and in practice the gap only opens on a surprise slide the work-ahead worker hasn't reached — but it is a real change, not a refactor.
Smoke test
Touches §3 Proclaim sync — "Slide translations show for the on-air item; review screen loads its conversation." Worth adding to that pass: open an item with notes from the picker and confirm the badge count matches the flagged rows.
Verification
npm run typecheck,npm run lint,npm test(600 passed),uv run pytest— all green. New tests cover the note lifecycle in the agent (attach, withdraw, carry across an untouched follow-up, drop when the source text is gone) and the note rendering inSlideReview.docs/slide-translations-plan.mdgets an amendment at the end recording the removal, in the style of the existing post-build corrections, rather than a rewrite of 385 lines that describe the old design.🤖 Generated with Claude Code
https://claude.ai/code/session_01RuD8vmbn9ku8wbVQYMH5BH
Generated by Claude Code