Record two GPU cycles: the gate works, coverage is the open question
No worker code changed. This is the evidence from the 2026-08-12 16:39 and 17:38 runs, and where each finding now lives. The fourth session's four identity changes all work on real panels. Panel 7's two wrong bindings are gone. The lead going unassigned there is correct and was measured, not assumed: face_detect finds one face on the whole panel at conf 0.599, nothing else above 0.056 even at a 0.04 threshold, and the crop shows him drawn from behind. Two decisions, both closed: a roster name is a guess so it never reaches detection, and merged_into is exactly one hop deep. Two caveats, both open: detection can order a bbox backwards (1 in 117), and identity coverage has fallen on every run since the gate landed (70 -> 61 -> 50). Coverage is the thing to settle next, and not by reading the number. identity_labels already holds 145 rows of ground truth. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,51 +1,66 @@
|
||||
# NEXT
|
||||
|
||||
Updated 2026-08-12. What this session did is in `HANDOFF.md`.
|
||||
Updated 2026-08-12 (fifth session). What the fourth session did is in `HANDOFF.md`, the run is in
|
||||
`JOURNAL.md`.
|
||||
|
||||
## State
|
||||
|
||||
The chapter runs end to end. The A/V sync defect is fixed and `chapter.mp4` is rebuilt: video 364.120s
|
||||
against audio 364.122s at `25/1`. The identity defects are still in the output.
|
||||
against audio 364.122s at `25/1`.
|
||||
|
||||
Job `778297bc-e7ce-439d-91b5-8a027060d17f`, chapter `7c944dd4-e972-42c7-ba60-9f6939548e80`, 116 panels,
|
||||
`status=completed`, finished 2026-08-11T20:08:16Z. `s3://video/` holds 49 clips and a 50MiB
|
||||
`chapter.mp4`. The user watched it and read out 19 defects. They are grouped by cause in `HANDOFF.md`.
|
||||
Job `778297bc-e7ce-439d-91b5-8a027060d17f`, chapter `7c944dd4-e972-42c7-ba60-9f6939548e80`, 116 panels.
|
||||
Two GPU cycles ran on 2026-08-12, the last 17:38-17:44 UTC on a reset registry. The job is `running` and
|
||||
parked at `dialogue waiting`. Everything from `dialogue` down is cleared and stale.
|
||||
|
||||
One number sets the agenda:
|
||||
Seven changes are now proven on real panels: the fourth session's four, plus this session's roster-hint
|
||||
removal, merge-chain flattening and `name_claims` reset. The registry after the last run:
|
||||
|
||||
- Panel 7 checked against the art has **zero correct identity bindings** out of two, and the one
|
||||
character who matters is unbound. `HANDOFF.md#panel-7-walked-against-the-art` has the table. The
|
||||
coordinate cause is fixed. The registry built on it is not.
|
||||
- `character_713ea2ce` "LIM SEONHO", 25 assignments, the lead, one row, named from the p010 caption.
|
||||
- `character_4fb94c15`, 18 assignments, the woman, correct and unnamed.
|
||||
- `character_023ba5a3` "Seonho", 1 assignment, still the wrong man, down from 15.
|
||||
|
||||
Coverage is 50%, from 61% and 70% before it. That trend is the open question and is filed as
|
||||
`caveats/audit-open.md#coverage-trend`.
|
||||
|
||||
## Next
|
||||
|
||||
1. **Re-run vision and identity.** The `bbox` space is settled and converted at `/vision`
|
||||
(`decisions/identity-bbox.md#bbox-is-normalized`). Every stored box, embedding and `ref_image_uris` in
|
||||
the registry came from the wrong space. The fix changes nothing until those stages run again.
|
||||
This is GPU work and needs the user's go-ahead. Clear `vision` and everything downstream of it, or
|
||||
accept that the boxes in the database stay normalized while new ones are pixels.
|
||||
|
||||
Watch two things on the rerun. Whether `som_face` still returns `unknown` on every face, since gated
|
||||
pairing was comparing pixel face boxes against 0-1000 character boxes. And whether `Choi Haeseon` still
|
||||
absorbs every unnamed woman, which is item (b) below and independent of the crops.
|
||||
1. **Settle coverage before trusting the registry.** 70% -> 61% -> 50% over three runs. `has_face` gates a
|
||||
steady 39%, and against face-bearing detections alone the last run assigned 59 of 72 (82%). Nothing
|
||||
separates correct abstention from lost cast. `identity_labels` already holds 145 rows of human ground
|
||||
truth, and `eval_identity.py` already scores against it. Measure precision and recall instead of
|
||||
reading the coverage number (`caveats/audit-open.md#coverage-trend`).
|
||||
2. **Order the corners in `_bbox_to_pixels`.** `p007 person_1` came back `[226, 417, 130, 551]`, x1 > x2,
|
||||
1 in 117. It crops to nothing, so that detection is silently lost
|
||||
(`caveats/audit-open.md#degenerate-bbox`). Two `min`/`max` pairs. It is a worker change, so it needs a
|
||||
vision restart and a GPU cycle to prove.
|
||||
3. **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").
|
||||
4. **Decide what a back-turned character costs.** `has_face` gates 39% of detections. Panel 7's lead is at
|
||||
his desk from behind. `face_detect` finds one face on the whole panel at conf 0.599, and nothing else
|
||||
above 0.056 even at a 0.04 threshold. The gate is right and the detector is right. The lead is still
|
||||
unidentifiable there. Options are a body or head detector alongside the face one, or letting the
|
||||
tracklet carry identity across a back-turned panel. Do not lower `FACE_CONF`, the sweep shows nothing
|
||||
to find.
|
||||
|
||||
Smaller follow-on: nine `_audio_dur` calls in `worker_render.py` measure finished clips with
|
||||
`format=duration`. So the durations reported to the orchestrator are blind to per-clip drift.
|
||||
They position no filter, so invariant 9 does not cover them. Worth converting to `_stream_dur`.
|
||||
2. **Fix identity, in this order.** Panel 7 is the worked example and
|
||||
`HANDOFF.md#panel-7-walked-against-the-art` carries the evidence. Do not start at the registry.
|
||||
5. **Fix identity, in this order.** All of 2a-2d below are done and now proven on a GPU. Kept for the
|
||||
evidence trail.
|
||||
|
||||
a. ~~Settle the `bbox` coordinate space.~~ **Done 2026-08-12**, proven over all 113 detections and
|
||||
checked by eye on panel 7, where five of six converted boxes land on their subject
|
||||
(`decisions/identity-bbox.md#bbox-is-normalized`). `person_1` still frames an empty window mullion,
|
||||
which is (c).
|
||||
b. ~~Let identity abstain and stay abstained.~~ **Done 2026-08-12, not yet run on a GPU**
|
||||
(`decisions/identity-bbox.md#bbox-is-normalized`). The rerun settles the last doubt: `person_1` now
|
||||
frames the lead at his desk, not the window mullion the pre-fix box caught.
|
||||
b. ~~Let identity abstain and stay abstained.~~ **Done 2026-08-12, run and verified on a GPU**
|
||||
(`decisions/identity-bbox.md#none-mints-an-anonymous-character`). The resolver could always answer
|
||||
"none of these". The orchestrator was discarding the answer: it read only `character_id`, so a
|
||||
deliberate NONE and a hallucinated index both unassigned every crop of the tracklet. A NONE now
|
||||
mints an anonymous character from the crop, using the embedding `/identity/resolve` ships beside
|
||||
it as `emb_uri`. Deployed: image rebuilt, `resolve_outcome` verified inside the container.
|
||||
c. ~~Separate extra from cast.~~ **Done 2026-08-12, not yet run on a GPU**
|
||||
c. ~~Separate extra from cast.~~ **Done 2026-08-12, run and verified on a GPU**
|
||||
(`decisions/identity-bbox.md#face-gates-enrollment`,
|
||||
`decisions/identity-bbox.md#extras-gate-consumers`). `has_face` stops a faceless detection
|
||||
enrolling, and two more consumers now skip it: `worker_scene`'s `actions`, which is the script
|
||||
@@ -53,11 +68,11 @@ One number sets the agenda:
|
||||
`_present_characters` stays ungated on purpose, reasoned out in the decision.
|
||||
The remaining gap is that vision still emits extras into the blob, which is deliberate so the
|
||||
audit can see what was gated.
|
||||
d. **The worked examples are gone.** The registry reset deleted `Lim Seonho` and
|
||||
`character_afa7623b`. The current registry is 8 rows, one named (`Seonho`), so there is nothing to
|
||||
merge or split until the rerun mints a new set.
|
||||
d. ~~Merge and split.~~ **Safety net done and now exercised.** The rerun's `reconcile` merged 7 rows
|
||||
and stamped 9 assignments `merged_from:`, so the non-destructive path is proven on real data. It also
|
||||
produced the chain in item 3, which is the first thing to fix in it.
|
||||
|
||||
What was done instead is the safety net for that rerun, since `reconcile` runs inside it. A merge no
|
||||
A merge no
|
||||
longer deletes the losing row: it sets `merged_into`, and stamps every repointed assignment with
|
||||
`method = merged_from:<loser_id>`. A wrong merge now costs a hand-written SQL walk, not a full
|
||||
rebaseline (`caveats/audit-open.md#destructive-reconcile`).
|
||||
@@ -69,9 +84,9 @@ One number sets the agenda:
|
||||
|
||||
**Cast profiles already exist. Do not rebuild them.** The user asked whether the main cast could get a
|
||||
profile built from reference frames and reused. `characters` already carries `ref_image_uris` and
|
||||
`embedding_uri`, and all 53 rows have both populated. The mechanism is not missing, it is enrolled
|
||||
from the wrong crops, so today it stores references to balloon edges and window frames. Step (a) is
|
||||
what makes it work. Three things are genuinely absent and are the smaller follow-on:
|
||||
`embedding_uri`, and every row has both populated (16 rows after the rerun, 53 before it). The
|
||||
mechanism was never missing. It was enrolled from the wrong crops, so it stored balloon edges and
|
||||
window frames. Step (a) fixed that, and the audit now reports 0 characters missing a ref crop. Three things are genuinely absent and are the smaller follow-on:
|
||||
|
||||
- no quality gate on enrollment, so nothing checks that a reference crop holds a face at all
|
||||
- nothing re-enrolls a reference set once it is written, so the wrong crops persist
|
||||
@@ -91,21 +106,21 @@ One number sets the agenda:
|
||||
The chibi at 1:35 will survive all of this. He genuinely is brown hair plus a yellow shirt, so a
|
||||
profile match is correct on appearance and wrong on reality. That needs item 4 below, plus requiring
|
||||
a real face before a crop can enroll.
|
||||
3. **Stop the narration inventing facts.** 0:43, 2:03, 2:05 and 2:15 assert things no panel shows. The
|
||||
6. **Stop the narration inventing facts.** 0:43, 2:03, 2:05 and 2:15 assert things no panel shows. The
|
||||
correctness verifier passed 116/116 because it checks quotes and names, never invented claims.
|
||||
4. **Teach vision that art inside a panel is not the scene.** A chibi on a monitor became "a man holding
|
||||
7. **Teach vision that art inside a panel is not the scene.** A chibi on a monitor became "a man holding
|
||||
a drink" at 1:35. A colleague pointing into the distance became "pointing towards the screen" at
|
||||
1:59.
|
||||
5. **`layers` writes nothing** and reports `completed 116/116`, so no clip has parallax and a still
|
||||
8. **`layers` writes nothing** and reports `completed 116/116`, so no clip has parallax and a still
|
||||
holds for 28s from 2:24 (`caveats/audit-open.md#layers-writes-nothing`).
|
||||
6. **Clear the stale job error.** The completed job still carries `error: "partial: 112/116 completed"`
|
||||
9. **Clear the stale job error.** The completed job still carries `error: "partial: 112/116 completed"`
|
||||
(`caveats/audit-open.md#stale-job-error`).
|
||||
7. Balloon-to-speaker geometry via the unused `det`/`seg` heads
|
||||
(`caveats/speaker-attribution.md#tail-is-not-geometry`) is now behind item 2. With no name to attach,
|
||||
10. Balloon-to-speaker geometry via the unused `det`/`seg` heads
|
||||
(`caveats/speaker-attribution.md#tail-is-not-geometry`) is now behind item 5. With no name to attach,
|
||||
geometry buys nothing.
|
||||
8. Resolve a speaker answer across the whole dialogue window, not just the answering panel. The last 3
|
||||
11. Resolve a speaker answer across the whole dialogue window, not just the answering panel. The last 3
|
||||
unresolved refs describe a neighbouring panel in the same 8-panel call.
|
||||
9. Start Phase 2 from `ROADMAP.md`. Set SQLite `busy_timeout` before any concurrency work
|
||||
12. Start Phase 2 from `ROADMAP.md`. Set SQLite `busy_timeout` before any concurrency work
|
||||
(`caveats/audit-open.md#sqlite-locking`).
|
||||
|
||||
## Lesson worth keeping
|
||||
|
||||
Reference in New Issue
Block a user