`_bbox_to_pixels` sorts each coordinate pair after clamping. Run B returned `p007 person_1` as `[226, 417, 130, 551]`, x1 > x2, which cropped to nothing and lost that detection silently. The third GPU cycle came back with 0 degenerate boxes over 119 detections. The plan's first item cannot run as written. All 145 rows of `identity_labels` belong to chapter 8ca8249b, a different manga. Chapter 7c944dd4 has none, so `/review/identity` reports `accuracy: null`. Scoring 8ca8249b gives 7/138 on an identity run that predates every fix. The cycle also settled the coverage question. All 68 assignments landed on face-bearing detections and none on a gated one, so recall among face-bearing detections is 96%, up from 82%. Coverage is the `has_face` gate and nothing else. What is now open is precision: the lead holds 36 of 68 assignments. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3.7 KiB
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 waitingwith every stage below cleared. - Nothing is committed. All edits are in the working tree.
Checks
.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:<window> C-c, then re-send the launch line fromstart_workers.shwith theMIOPEN_ENVprefix.pgrep-based kills match the calling shell. POST /characters/resetreturnsrestart_identity_worker: true. Honour it, the worker caches the registry.identity_assignmentshas nomethodcolumn. Themerged_from:stamps live inidentity_assignment_sources.chaptershas notitlecolumn.