# HANDOFF, 2026-08-11 late session Live state is in `NEXT.md`. This file is only what this session did. ## Asked Continue from the previous handoff: fix speaker attribution, then rerun and re-read the named-speaker share. Mid-session: what happens to unidentified people in a two-person panel, can a known character be mis-named, and keep watch during the run. ## Result The named-speaker share is **9 of 95 speech lines, 9%**. The previous 30% counted fake tails. All 9 binds are `Choi Haeseon`, the over-merged row. `script` passed 116/116 for the first time. **Identity, not attribution, is now the constraint.** 26 of 113 detected people carry an identity. 25 of the 26 are that one row. This chapter caps near 23% named even with perfect balloon binding. Six defects, four found by measuring the run rather than by reading code. Each has a decision entry: | # | defect | entry | | --- | --- | --- | | 1 | `tail` stamped on a model guess at confidence 1.0 | `decisions/speaker-attribution.md#no-fake-tail` | | 2 | a two-word cast name always failed the script verifier | `#multiword-cast-names` | | 3 | `/stage/clear dialogue` deleted nothing and reported success | `decisions/storage-layout.md#clear-vision-blob` | | 4 | gemma's speaker answer echoed the prompt label, became a name | `#prompt-label-answers` | | 5 | `som_face` stamped on a mark that paired to nobody | `#unpaired-mark` | | 6 | one two-letter interjection halted the chapter at 112/116 | `#interjection-false-positive` | ## Changed Workers, `/home/kami/Programs/n8n-worker`, branch `restore-runtime`, commits `e8941d8 8071137 a965077` plus docs: - `worker_vision.py`: `_annotate_speaker_methods`, `_apply_speaker_labels`, new `_present_keys` - `decisions/speaker-attribution.md` (new, 5 sections), `decisions/storage-layout.md#clear-vision-blob`, `caveats/speaker-attribution.md`, `caveats/audit-open.md#dishonest-clearing`, both indexes, `JOURNAL.md`, `NEXT.md` Orchestrator, `/mnt/server/home/kami/docker-apps`, commits `b18b6b4 603d388 db8d7c5 ccc3a8e` plus the interjection commit: - `correctness.py`: tokenized `allowed`, `_ID_SHAPED` guard in `normalize_speaker`, interjection stopwords, short-quote grounding skip - `db.py`: `_STAGE_VISION_KEYS` and the strip pass in `clear_stage_data` - `test_script_verify.py`, `test_correctness.py`, `test_db.py`: one case each ## Measured Job `778297bc-e7ce-439d-91b5-8a027060d17f`, chapter `7c944dd4-e972-42c7-ba60-9f6939548e80`, 116 panels. - 113 orchestrator tests pass. `worker_vision.py` self-check passes. - `dialogue` 116/116, `direct` 116/116, `scene` 116/116, `script` 116/116. - speech lines 95, named 9. Multi-character panels 0 of 40 by design. Single-character 9 of 55. - `speaker_method`: `unknown` 47, `model_solo` 28, `solo_prior` 8, `som_face` 7, `turn_taking` 5. - unresolved name refs 3, all `brown ponytail, green dress`, from a neighbouring panel in the same 8-panel window. Was 24 of 51 before the fix. - identity assignments 26, of which `character_afa762` "Choi Haeseon" holds 25. - registry duplicates that block a correct bind: `seonho` matches 2 rows, `lim seonho` matches 2 rows. - buckets during `tts`: `panels` 116, `raw` 79, `manga` 491, `audio` 1, `layers` 0, `video` 0. ## Open - **The run is still going.** It was in `tts` at 26/116 when this was written, with `layers render assemble` unrun. `tts` is the bottleneck. Read it: ```bash /usr/bin/ssh kami@192.168.1.104 "curl -s 'http://127.0.0.1:9090/job/status?job_id=778297bc-e7ce-439d-91b5-8a027060d17f'" ``` If it failed, clear the failed stage and resume: ```bash /usr/bin/ssh kami@192.168.1.104 "curl -s -X POST http://127.0.0.1:9090/stage/clear -H 'Content-Type: application/json' -d '{\"job_id\":\"778297bc-e7ce-439d-91b5-8a027060d17f\",\"stage\":\"\"}'" /usr/bin/ssh kami@192.168.1.104 "curl -s -X POST 'http://127.0.0.1:9090/job/resume?job_id=778297bc-e7ce-439d-91b5-8a027060d17f'" ``` Note: plain `ssh` is the kitty ssh kitten and refuses non-interactive stdin. Use `/usr/bin/ssh`. - Defects 5 and 6 landed after `dialogue` had already run, so this run's 7 `som_face` lines are still labelled from the unpaired-mark path. The next dialogue pass fixes that. No name was affected. - The audit script is `docker exec manga-orchestrator python3 /tmp/audit_speakers.py`, source in this session's scratchpad. It is not in the repo. Copy it in if the metric is to be tracked per run. - The 3 cross-panel unresolved refs need the window's whole present-list, not one panel's. - Workers were restarted twice this session and are running in tmux `manga-workers`. Nothing watches them, and nothing watches the homesrv containers.