diff --git a/JOURNAL.md b/JOURNAL.md index fdd38d5..6425ff7 100644 --- a/JOURNAL.md +++ b/JOURNAL.md @@ -121,3 +121,35 @@ The remaining `['Blur']` beat is a true positive that still halts the whole chap `caveats/speaker-attribution.md#one-word-halts-chapter`. Neither fix is live. The orchestrator container is not rebuilt and the workers are not restarted. + +## 2026-08-11 Rerun from dialogue: the honest speaker number is 9% + +Command: `/job/cancel`, `/stage/clear dialogue`, `./start_workers.sh`, `/job/resume` on job +`778297bc-e7ce-439d-91b5-8a027060d17f`, twice. `docker compose up -d --build orchestrator` three times. +Outcome: `dialogue` 116/116. 112 orchestrator tests pass, `worker_vision.py` self-check passes. + +The named-speaker share is 9%, 9 of 95 speech lines, down from a reported 30% that counted fake tails. +Multi-character panels contribute 0 of 40 lines by design. Single-character panels give 9 of 55. All 9 +binds are `Choi Haeseon`, the row that covers two different women. + +Five defects, four of them found by measuring the run rather than by reading code. + +1. The fake `tail` label, fixed before the run (`decisions/speaker-attribution.md#no-fake-tail`). +2. The multi-word cast name in the script verifier + (`decisions/speaker-attribution.md#multiword-cast-names`). +3. `/stage/clear dialogue` deleted nothing and reported success. dialogue and direct write onto the + per-panel vision blob and had no `_STAGE_TABLES` entry, so `run_stage_dialogue` saw + `"dialogue" in vision` and would have skipped all 116 panels. The proof is the second clear: + 116 dialogue blobs and 75 direct blobs stripped that the first had left. This is + `caveats/audit-open.md#dishonest-clearing` firing exactly where it was filed. +4. gemma answers the speaker field with whatever the prompt showed, most often the character + description, and every such answer became a free-form name that no registry entry matched. 28 of 51 + sampled lines (`decisions/speaker-attribution.md#prompt-label-answers`). After the fix, 3 of 95. +5. All 7 `som_face` lines pointed at a mark whose face paired to no present character, so the + highest-trust provenance sat on a line with no speaker. Same defect class as the fake tail. + +Identity is now the binding constraint, not attribution. 26 of 113 detected people carry an identity, +23%, and 25 of the 26 are the one over-merged row. Even perfect balloon binding caps this chapter near +23% named. The person who does hold an identity is stored as `Lim Seonho` while a separate row is named +`Seonho` with alias `Lim Seonho`, so either name matches two rows, raises `ambiguous-speaker` and binds +nothing. diff --git a/NEXT.md b/NEXT.md index 0eedada..a8e40e3 100644 --- a/NEXT.md +++ b/NEXT.md @@ -23,24 +23,22 @@ the rebuild exposed. ## Next -Two fixes are written and checked, neither is deployed. +The named-speaker share is 9%, 9 of 95 speech lines, and that number is real. See `JOURNAL.md` for the +five defects behind the old 30%. Everything below is measured on job `778297bc`, not inferred. -- `worker_vision.py` no longer labels a model guess `tail`, and drops the guess entirely when two or - more characters are present (`decisions/speaker-attribution.md#no-fake-tail`). The workers need a - restart, and only a rerun from `dialogue` puts it on stored data. -- `correctness.py` tokenizes cast names for the script verifier - (`decisions/speaker-attribution.md#multiword-cast-names`). The orchestrator container needs a - rebuild. +**Identity is the constraint now, not attribution.** 26 of 113 detected people carry an identity. 25 of +those 26 are the single over-merged row (`caveats/speaker-attribution.md#identity-over-merge`). That caps +this chapter near 23% named even with perfect balloon binding. Work identity before geometry. -Then, in order: - -1. Rerun the chapter and re-read the named-speaker share. It will fall, and the lower number is the - first honest one. Deciding whether to resume `script` on the old attributions or clear back to - `dialogue` is open. +1. Split the over-merged character row and dedupe the registry. `Lim Seonho` and `Seonho` are separate + rows with overlapping aliases, so either name matches two rows and binds nothing. Needs the + reversible-merge design (`caveats/audit-open.md#destructive-reconcile`) rather than a patch. 2. Bind a balloon to a speaker by tail geometry, using the unused `det`/`seg` heads (`caveats/speaker-attribution.md#tail-is-not-geometry`). Until then multi-character panels have no - speaker at all. -3. Start Phase 2 from `ROADMAP.md`. Set SQLite `busy_timeout` before any concurrency work + speaker at all, which is 40 of 95 lines here. +3. Resolve a speaker answer across the whole dialogue window, not just the answering panel. The last 3 + unresolved refs are a description belonging to a neighbouring panel in the same 8-panel call. +4. Start Phase 2 from `ROADMAP.md`. Set SQLite `busy_timeout` before any concurrency work (`caveats/audit-open.md#sqlite-locking`). ## The 2026-08-11 chapter run @@ -76,9 +74,9 @@ Two containers on homesrv had been dead for two weeks and are now running. `mang ## Open questions -Four Phase 1 items have no Vikunja task and were not created, because writing to the tracker was not -asked for: the speaker contract fix, the verifier rules, the tracklet constraints, and the flag -resolution path. Only [#203] existed and is now closed by `decisions/audit-phase1.md#unlocked-model-load`. +Four Phase 1 items have no Vikunja task, because writing to the tracker was not asked for. They are the +speaker contract fix, the verifier rules, the tracklet constraints, and the flag resolution path. Only +[#203] existed and is now closed by `decisions/audit-phase1.md#unlocked-model-load`. Three audit items are deliberately not done and are recorded as caveats rather than silently dropped: honest stage clearing, ComfyUI under the session mutex, and reversible identity merges. Each needs a