1457556ce3
_xfade_chain positioned every transition using _audio_dur, which probes format=duration, which is max(video, audio). A clip's audio outlasts its video by about a frame, so the offset accumulator crept ahead of the real picture timeline. Once the creep exceeded the transition width, xfade emitted the transition and silently discarded the second input and every clip downstream, exiting 0 with nothing on stderr. That is the whole of the shipped chapter's 436.39s of video over 363.67s of audio. Offsets now come from min(video, audio). Every input is floored to a whole frame count and trimmed on both streams, so the accumulator tracks the real timeline instead of estimating it. _check_assembled verifies each encode against the predicted length and against its own audio, because both assembly branches drop stream time without failing. Verified over the 49 real clips of chapter 7c944dd4: the round that turned 359s of video into 100s now loses 0.85s, and the chapter comes out 358.76s video against 358.76s audio. The single-item passthrough was not the cause. Two round-0 groups of 8 fresh clips collapse without one, recorded void in decisions/. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
42 lines
3.0 KiB
Markdown
42 lines
3.0 KiB
Markdown
# decisions/
|
|
|
|
One entry per settled question about this pipeline. An entry names the claim, the evidence, the date,
|
|
and what it forbids or permits next.
|
|
|
|
No entry is a plan. `NEXT.md` holds the plan, `ROADMAP.md` holds the horizon, and a limitation that is
|
|
still live belongs in `caveats/`.
|
|
|
|
## Rules for this directory
|
|
|
|
* One file per topic, one `##` section per question, so the index can link an anchor.
|
|
* An entry cites a file and line, a commit, or a test. No citation means it is an opinion, and an
|
|
opinion gets deleted rather than defended.
|
|
* **Closed** means acting on it is safe. **Open** means investigated and undecided. **Void** means the
|
|
evidence turned out to be invalid and the claim must not be cited again.
|
|
* Rewrite an entry when something contradicts it, and say what changed.
|
|
|
|
## Index
|
|
|
|
| decision | state |
|
|
| --- | --- |
|
|
| [A dialogue row's speaker is `speaker_ref`, not `speaker`](audit-phase1.md#speaker-ref-is-canonical) | closed |
|
|
| [Script verification must not fail on sentence-initial capitals or short quotes](audit-phase1.md#verifier-false-positives) | closed |
|
|
| [Tracklet links are transitive over similarity, never across a hard constraint](audit-phase1.md#tracklet-hard-constraints) | closed |
|
|
| [A detected face takes an identity only when it falls inside that character's box](audit-phase1.md#gated-face-pairing) | closed |
|
|
| [A 409 from the GPU mutex is a queue signal, not a stale lease](audit-phase1.md#no-lease-stealing) | closed |
|
|
| [Correctness flags resolve by flag id, and never block autonomous TTS](audit-phase1.md#flag-resolution) | closed |
|
|
| [An out-of-range resolver index is `unresolved`, never a new character](audit-phase1.md#hallucinated-index) | closed |
|
|
| [The session manager holds no lock across a model load](audit-phase1.md#unlocked-model-load) | closed |
|
|
| [One bucket per artifact class, not everything under `manga`](storage-layout.md#bucket-per-artifact) | closed |
|
|
| [The orchestrator creates missing buckets at startup](storage-layout.md#ensure-buckets) | closed |
|
|
| [RustFS is staged, not adopted](storage-layout.md#rustfs-staged) | open |
|
|
| [A model guess is never labelled `tail`](speaker-attribution.md#no-fake-tail) | closed |
|
|
| [The model's speaker answer is resolved against what the prompt showed](speaker-attribution.md#prompt-label-answers) | closed |
|
|
| [An unpaired set-of-mark label grounds nothing](speaker-attribution.md#unpaired-mark) | closed |
|
|
| [An interjection is not a name and not a misquote](speaker-attribution.md#interjection-false-positive) | closed |
|
|
| [Cast names enter the verifier tokenized](speaker-attribution.md#multiword-cast-names) | closed |
|
|
| [Clearing a stage strips the vision blob it wrote](storage-layout.md#clear-vision-blob) | closed |
|
|
| [xfade offsets come from `min(video, audio)`, never `format=duration`](chapter-assembly.md#offsets-from-min-stream) | closed |
|
|
| [Assembly verifies its own output instead of trusting ffmpeg's exit code](chapter-assembly.md#check-assembled) | closed |
|
|
| [The single-item passthrough is not the assembly bug](chapter-assembly.md#passthrough-innocent) | void |
|