File the over-merge findings: two tracklet fixes, and cosine is not identity

The user checked the lead's crops. LIM SEONHO's 36 assignments cover at least
six different men, a chibi and a cat, so 36 of 68 is a bug. 22 came from
native resolves and 14 from reconcile merges.

Two fixes are written in the orchestrator repo, tested, not deployed and not
run on a GPU. `link_tracklets` caps a tracklet's panel span, because `window`
bounded each pair while transitivity was unbounded and the lead's 22 native
assignments came from tracklets spanning 22 and 30 panels. And one shared
appearance tokenizer drops generic words, because whole chains hung on the
word `short` and one pair on the word `hair`.

The obvious third fix is ruled out by measurement. Over all 22 crop
embeddings, the cat scores up to 0.82 against men, two different men score
0.93, and the highest pair is 0.96. No threshold separates them, so
crop-to-crop cosine is not a link signal.

Item 1 of the agreed plan, sending the live cast instead of a cosine top-k
gallery, is not started.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 23:35:15 +04:00
parent 54bd126cd7
commit de7e34bc0f
7 changed files with 237 additions and 62 deletions
+39 -22
View File
@@ -13,38 +13,55 @@ Three GPU cycles ran on 2026-08-12, the last 18:07-18:13 UTC on a reset registry
parked at `dialogue waiting`. Everything from `dialogue` down is cleared and stale. All 9 workers are
current.
Eight changes are now proven on real panels. The fourth session contributed four. The fifth added the
Eight changes are proven on real panels. The fourth session contributed four. The fifth added the
roster-hint removal, merge-chain flattening and `name_claims` reset. This session added bbox corner
ordering. The registry after the 18:07 run holds 18 rows, 9 live and 9 carrying `merged_into`:
ordering.
- `LIM SEONHO`, 36 assignments, the lead, one row, named from the p010 caption.
- `character_b112d4`, 23 assignments, the woman, correct and unnamed.
- `Seonho`, still the wrong man, still named off in-panel text.
**The registry is not trustworthy.** `LIM SEONHO`'s 36 assignments cover at least six different men, a
chibi and a cat, confirmed by eye in the review UI. 22 of those are native resolves and 14 came from
reconcile merges, so both mechanisms are wrong.
Coverage is 57%, from 50%, 61% and 70% before it, and it is now the `has_face` gate and nothing else. All 68
assignments landed on face-bearing detections and none on a gated one. Recall among face-bearing detections
is 68 of 71, or 96%, up from 82%. Degenerate boxes went from 1 in 117 to 0 in 119, and the merge
chain is flat with 22 assignments stamped `merged_from`.
Two fixes are written and tested but NOT deployed and NOT run on a GPU, both in the orchestrator repo:
The open question moved. The lead holds 36 of 68 assignments, 53%, which `audit_registry.py` flags as
absorbing. Nothing separates a protagonist in half the panels from an over-merge
(`caveats/audit-open.md#coverage-trend`).
- `link_tracklets` caps a tracklet's panel span (`decisions/identity-bbox.md#tracklet-span-cap`)
- one shared appearance tokenizer drops generic words (`decisions/identity-bbox.md#generic-tokens`)
On the same 22 crops, 3 tracklets at worst span 30 becomes 9 at worst span 8.
Coverage was 57% on the 18:07 run, and it is the `has_face` gate and nothing else. All 68 assignments
landed on face-bearing detections, so recall among them is 68 of 71. Degenerate boxes are 0 in 119 and the
merge chain is flat with 22 `merged_from` stamps.
## Next
1. **Decide whether the lead absorbing 53% of assignments is real.** It needs labels this chapter lacks.
The resolver is cleared: recall among face-bearing detections is 96%. What is unmeasured is precision.
The lead went from 25 of 59 to 36 of 68 as the merge count rose from 7 to 9.
1. **Deploy the two tracklet fixes and run the fourth cycle.** Neither has touched a GPU. Rebuild the
orchestrator image, reset the registry, run vision/identity/reconcile, then re-check the lead's crops.
Expect roughly 30 tracklets over 64 crops instead of 12, so identity goes from about 1m25s to 3 or 4
minutes. Watch the lead's assignment count against 36.
The previous plan pointed at `identity_labels` and its 145 rows. Measured this session: every one of
those rows belongs to chapter `8ca8249b`, a different manga. Chapter `7c944dd4` has zero labels, so
`/review/identity` reports `labeled: 0, accuracy: null`. Scoring `8ca8249b` gives 7/138 on an identity
run that predates all eight fixes. The eval plumbing works and the ground truth is missing.
Labelling `7c944dd4` by hand is the only path to a precision number
(`caveats/audit-open.md#coverage-trend`).
Neither fix is sufficient. Bare hair colour still links different men, and the cat still joins its
neighbours. Do not add a crop-to-crop cosine to close that: measured on this run's 22 embeddings,
different people reach 0.93 while the same person reaches 0.96, so no threshold exists
(`caveats/audit-open.md#cosine-not-identity`).
Agreed next step after the cycle, chosen by the user and not started: **stop letting cosine pick the
gallery.** There are 9 live characters. `run_stage_identity` builds `union_cands` from the members'
cosine top-k shortlists, so a metric that cannot separate people decides who is even considered. Send
the live cast instead, gender-gated, capped and logged when truncated. Note two traps found while
reading it: `/vision/resolve` sends up to 3 reference images per candidate
(`worker_vision.py:1057`), so 9 candidates is 27 images plus the query and needs a cap; and only a crop
with a non-empty cosine shortlist enters `shortlists` at all, so an empty top-k currently drops the crop
from resolution entirely.
Then, separately, test embedding the FACE box rather than the person box. `face_detect` already finds
the face and pairs it for `has_face`. That is the likely root cause of cosine measuring scene instead of
person, and the test is to re-embed these same 22 detections and recompute the matrix.
2. ~~**Order the corners in `_bbox_to_pixels`.**~~ **Done 2026-08-12, run and verified on a GPU.** 0
degenerate boxes over 119 detections (`decisions/identity-bbox.md#bbox-corners-ordered`).
3. **Detection still names from in-panel text and can hit the wrong body.** p011 and p026 emit
3. **Vision boxes animals as people and dresses them.** `p081` and `p108` are cats, described
`short brown / yellow plaid shirt` and `short brown / white t-shirt`. A detection prompt problem, not a
linker one, and it feeds every stage below.
4. **Detection still names from in-panel text and can hit the wrong body.** p011 and p026 emit
`name: "Seonho"` on `person_2` with the roster hint gone. That is the residue of the naming defect and
the reason the glasses man is named at all
(`decisions/identity-bbox.md#roster-does-not-name`, "not covered").