# caveats/ One entry per known breakage, deferral, or trap. An entry names what fails, who pays for it, and the concrete trigger that makes fixing it worth the time. A caveat that gets resolved moves to `decisions/` or gets deleted. A caveat with no revisit trigger is a complaint, so give it one or drop it. ## Rules for this directory * One file per source, one `##` section per limit. * State the limit as what fails, not as a topic. "Reconcile deletes the losing character" beats "Reconcile". * Delete an entry the moment its trigger fires and the work lands. ## Index | caveat | source | | --- | --- | | [Reconcile deletes the losing character irreversibly](audit-open.md#destructive-reconcile) | AUDIT.md | | [Clearing a stage does not undo what it wrote](audit-open.md#dishonest-clearing) | AUDIT.md | | [ComfyUI uses the GPU outside the session mutex](audit-open.md#comfyui-unscheduled) | AUDIT.md | | [The JSON repair pass can fabricate dialogue](audit-open.md#repair-fabricates) | AUDIT.md | | [`/review/preview` pins a solo clip into the final video](audit-open.md#preview-overwrites-clip) | AUDIT.md | | [Stored embeddings carry no model or pooling version](audit-open.md#untagged-embeddings) | AUDIT.md | | [Worker endpoints block the event loop](audit-open.md#blocking-event-loop) | AUDIT.md | | [SQLite has no busy timeout, so parallelism will surface as lock errors](audit-open.md#sqlite-locking) | AUDIT.md | | [`layers` runs after `tts`, so pipelined solo beats lose parallax](audit-open.md#layers-after-tts) | AUDIT.md | | [`completed` means something different in each stage](audit-open.md#inconsistent-stage-policy) | AUDIT.md | | [Identity worker caches characters the orchestrator has deleted](audit-open.md#stale-known-cache) | AUDIT.md | | [The gemma helpers exist twice and have diverged](audit-open.md#gemma-helpers-duplicated) | repo audit | | [A character seen once gets no assignment at all](audit-open.md#pending-in-worker-memory) | AUDIT.md | | [MinIO credentials are hardcoded in committed source](audit-open.md#hardcoded-credentials) | AUDIT.md | | [Assemble marks a job completed with no clips](audit-open.md#empty-assemble) | AUDIT.md | | [Reviewer timestamps drift against the crossfaded video](audit-open.md#timeline-drift) | AUDIT.md | | [Nothing attributes a speaker in a multi-character panel](speaker-attribution.md#tail-is-not-geometry) | 2026-08-11 run | | [One character id covers two different women](speaker-attribution.md#identity-over-merge) | 2026-08-11 run | | [The character registry carries five weeks of wrong names](speaker-attribution.md#registry-pollution) | 2026-08-11 run | | [One invented word still halts the chapter](speaker-attribution.md#one-word-halts-chapter) | 2026-08-11 run | | [A completed job keeps the error from an earlier failure](audit-open.md#stale-job-error) | 2026-08-11 run | | [`layers` reports success on an empty bucket](audit-open.md#layers-writes-nothing) | 2026-08-11 run | | [Every `bbox` is read in the wrong coordinate space](speaker-attribution.md#bbox-wrong-space) | resolved, rerun pending | | [Identity cannot say "a person with no name"](speaker-attribution.md#no-anonymous-identity) | 2026-08-12 panel 7 | | [Vision does not separate a background extra from cast](speaker-attribution.md#extras-as-cast) | 2026-08-12 panel 7 | | [Cast reference profiles are enrolled from wrong crops](speaker-attribution.md#poisoned-reference-set) | 2026-08-12 panel 7 | | [Identity coverage has fallen on every run since the gate landed](audit-open.md#coverage-trend) | before the next downstream run | | [Embedding cosine on a person crop cannot tell two people apart](audit-open.md#cosine-not-identity) | before building on cosine |