# HANDOFF, 2026-08-12 (sixth session) Live state is in `NEXT.md`. This file is only what this session did. The previous handoff is in `JOURNAL.md`. ## Asked The two files, then "go" on the third GPU cycle. ## Result One worker fix, one measurement that killed the plan's first item, one GPU cycle. The cycle proved the new fix and the fifth session's merge fix. Coverage rose for the first time, 50% to 57%. It is now explained entirely by the `has_face` gate. | metric | 17:38 run | 18:07 run | | --- | --- | --- | | detections | 117 | 119 | | assignments | 59 | 68 | | coverage | 50% | 57% | | degenerate boxes | 1 | 0 | | assigned among face-bearing | 59/72 = 82% | 68/71 = 96% | | assigned among gated | -- | 0 | | chains deeper than one hop | 1 | 0 | | `merged_from` stamps | 9 | 22 | ## The corner-ordering fix `_bbox_to_pixels` sorts each coordinate pair after clamping. Three lines (`decisions/identity-bbox.md#bbox-corners-ordered`). The self-check feeds it run B's real `[226, 417, 130, 551]` and asserts `[117, 688, 203, 909]`. Unsorted the call returns `[203, 688, 117, 909]`, so the assert fails without the fix. The run returned 0 degenerate boxes over 119 detections. The caveat is deleted and the decision is indexed. ## The measurement that killed item 1 The plan said to score precision with `eval_identity.py` against the 145 rows of `identity_labels`. Every one of those rows belongs to chapter `8ca8249b`, a different manga with cast "Rico" and "Ikekin", spread over 81 panels. Chapter `7c944dd4` has zero labels, so `/review/identity?job_id=778297bc...` returns `labeled: 0, correct: 0, accuracy: null`. Scoring `8ca8249b` anyway gives 7/138, with 113 rows labelled as a real person and left unassigned. That chapter's identity run is stale: 44 assignments over 246 panels, predating every fix. The number measures old code on the wrong chapter. So the eval path is proven end to end and the ground truth is absent. A precision number needs a hand pass over `7c944dd4` through `POST /review/identity/label`, keyed by bbox rather than `local_id`. ## What the cycle settled **Coverage is the gate and nothing else.** All 68 assignments landed on face-bearing detections and none on a gated one. Recall among face-bearing detections is 96%, up from 82%. The resolver is not losing cast, so the suspicion in `caveats/audit-open.md#coverage-trend` is closed. **The merge-chain fix holds under load.** 9 merges this run against 7 last run, and 22 `merged_from` stamps. No chain is deeper than one hop. ## What the cycle opened **The lead may be absorbing.** 36 of 68 assignments, 53%, against 25 of 59 before. `audit_registry.py` flags it. A protagonist in half the panels looks identical to an over-merge without labels. **Panel 7 got worse.** 5 of its 6 detections carry `has_face = False`, and `person_6`, the one that does, went unassigned. The previous run bound its colleague. That is the cost of requiring a face, `NEXT.md` item 4. ## Not done - Nothing downstream re-ran. The job is still parked at `dialogue waiting` with every stage below cleared. - Nothing is committed. All edits are in the working tree. ## Checks ```bash .venv/bin/python worker_vision.py # self-check ok, including the swapped-corner assert ./check_stale.sh # exit 0 before the run and after it ``` ## Traps confirmed - Restart a worker with `tmux send-keys -t manga-workers: C-c`, then re-send the launch line from `start_workers.sh` with the `MIOPEN_ENV` prefix. `pgrep`-based kills match the calling shell. - `POST /characters/reset` returns `restart_identity_worker: true`. Honour it, the worker caches the registry. - `identity_assignments` has no `method` column. The `merged_from:` stamps live in `identity_assignment_sources`. - `chapters` has no `title` column.