Record the 9% honest speaker number and the identity constraint

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 23:47:09 +04:00
parent a965077e6b
commit b68f96a9b2
2 changed files with 47 additions and 17 deletions
+32
View File
@@ -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.
+15 -17
View File
@@ -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