attic/worker_ocr.py and attic/worker_parse.py are 224 lines imported by nothing and named in no doc. The OCR stage was removed when narration moved to the director beat. The two design notes in attic/ stay, they are history. worker_vision._panel_size had one reference and it was the definition. The audit's larger finding is filed rather than fixed: call_gemma4, _extract_json and _strip_thought exist in both worker_vision and worker_script and have already diverged. That matters because the JSON repair pass can fabricate dialogue, so a fix would land in one copy and not the other. It is caveats/audit-open.md#gemma-helpers-duplicated with its revisit trigger. HANDOFF.md carries the rest: _wrap2 against textwrap, the duplicated ONNX preprocessing, and worker_layers pointing at a legacy/ directory that was never tracked in git. Checked: ruff clean, worker_vision and worker_render self-checks pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5.4 KiB
HANDOFF, 2026-08-13 (eighth session)
Live state is in NEXT.md. This file is only what this session did. The previous handoff is in
JOURNAL.md.
Asked
Push the repo to Gitea and open a PR to master. Then, from the PR review: fix the s3 URI constants,
run ruff and fix what it finds, push, run a ponytail audit, fix, push, merge. Then audit.
Result
No GPU work. Nothing ran on a pipeline stage. PR #1 is open at
https://gitea.kvmx.ru/kami/manga-recap-pipeline/pulls/1, master <- restore-runtime.
master held only the reconstruction commit ff6a512. All 27 commits of real work sat unpushed on
restore-runtime.
Landed
| commit | what |
|---|---|
12d4ed8 |
the ARCHITECTURE.md rewrite, which was finished but uncommitted |
be63b22 |
deleted a 0-byte file named II, d[i+4:i+12]))\n"; done, added by 8113bdf |
bec9411 |
s3 URI templates into transport.py, plus ruff.toml and the lint fixes |
S3 URIs
Eight templates now live in transport.py: PANEL_URI, PAGE_PANEL_URI, AUDIO_URI,
AUDIO_FLAT_URI, LAYER_URI, CLIP_URI, CHAPTER_URI, CHAR_PNG_URI, CHAR_NPY_URI. Five workers
formatted their own before.
transport.ids_from_uri replaces three separate copies of the same parse in worker_tts,
worker_layers and worker_render. It raises on a uri too short to carry the ids instead of returning
a wrong pair. worker_render._mc_from_uri is gone, its 6 call sites repointed.
Lint
ruff check . exits 0. Ruff's defaults found 115. Fixed: implicit Optional in 8 signatures, an
unparenthesized implicit concatenation inside the ASS filter list, 5 subprocess.run calls now saying
check=False out loud, 1 unused import, 1 duplicate exception handler, 1 non-executable shebang,
4 dict() calls and 2 startswith chains.
12 rules are off in ruff.toml, each with its reason. The ASYNC ones matter: ffmpeg and ffprobe run
synchronously inside async def endpoints, so a busy worker cannot answer /health. That is already
caveats/audit-open.md#blocking-event-loop, tracked as [#199], and it needs a per-handler refactor
rather than a lint fix.
CLAUDE.md said "There is no lint or build step". It now names ruff check . and the rule that every
output URI is a template in transport.py.
Audit findings
Applied:
delete:attic/worker_ocr.pyandattic/worker_parse.py, 224 lines, imported by nothing and named in no doc.attic/char-recognition.mdandattic/plan-workpc.mdkept, they are design history.delete:worker_vision._panel_size, 8 lines, one reference and it is the definition.
Found and NOT applied, in order of size:
shrink:call_gemma4,_extract_jsonand_strip_thoughteach exist twice, inworker_vision.pyandworker_script.py, and have already diverged.worker_vision.call_gemma4is 21 lines and takes a content list,worker_script's is 8 and takes a prompt string plus a system prompt. The two_extract_jsonbodies carry the same comment aboutraw_decodebut different error text. This is the live risk:caveats/audit-open.md#repair-fabricatessays the JSON repair pass can fabricate dialogue, and a fix would land in one copy. A sharedgemma.pycosts one new file and removes about 25 duplicated lines. Not done because it touches the two largest workers and nothing has run on a GPU since.stdlib:worker_render._wrap2, 16 lines of greedy word-wrap with a 2-line cap, is close totextwrap.wrap(text, width, max_lines=2, placeholder="…"). Not identical:_wrap2doesrstrip(".,")before the ellipsis, and textwrap reserves width for the placeholder, so the break points differ. It renders burned-in subtitles, so the diff is user-visible. Verify against the render self-check before swapping.shrink:_letterboxand_loadare duplicated betweenbubble_detect.pyandface_detect.py, two ONNX detectors with the same preprocessing. About 16 lines.delete:worker_layers.py:14pointsLAYERED_WORKFLOWatlegacy/qwen_layered_workflow.json.legacy/was never tracked in git and is absent from disk, so the module's self-check has never been able to pass here. This is the other half ofcaveats/audit-open.md#layers-writes-nothing.
Checks
ruff check . # All checks passed
.venv/bin/python worker_render.py # ok, ffmpeg ran, about 4 minutes
Self-checks pass: transport, collage, bubble_detect, test_vision_parse, worker_crop,
worker_scene, worker_script, worker_identity, worker_tts, session_manager, worker_vision,
worker_render, face_detect.
worker_layers fails, and did before this branch, on the missing legacy/ file above.
Next command
The fifth GPU cycle is still the next pipeline work. It is blocked only on the GPU being free. The
exact sequence is in JOURNAL.md under the seventh session, and NEXT.md item 1 holds the
expectations. Clear the panels prefix first or the wired caption merge
will not take effect.
Before that, or instead of it while the GPU is busy, ARCHITECTURE.md step 0 is the measurement spine:
eval/chapter-truth.json plus purity and fragmentation printed by audit_registry.py.
One ordering trap, unresolved: the truth file cannot be keyed on panel_id or character_id. The
fifth cycle re-crops and calls /characters/reset, which destroys both. Key it on page-space geometry,
or write it after the fifth cycle rather than before.