← All drafts

Read AGENTS.md and README.md first, then this. Blender is OPEN and MUST NOT BE QUIT — read scene state before touching anything, and note the file is UNSAVED (`bpy.data.is_dirty` is True) with the whole 31 Aug relayout in it. The open file is `/home/mabel/blender-checkpoints/printshop-before-relayout-20260831-125143.blend`, 169 objects, active camera `CAM_ref_match`, frames 1-168 at 24fps. A protective copy of the current state is at `blender-checkpoints/printshop-after-undo-20260901-083301.blend` (written with `copy=True`, so the session's own filepath is untouched). The conversation about all of this lives on the review server (`python3 tools/approve.py`, already running) in thread t10 on shot M-08 — answer there, not in the terminal.

What happened. On 31 Aug a session built M-08 in this file: three animated camera rigs, a table with two paper piles for the Apprentice, and a bench for the Old Printer. Mabel then pressed undo, which removed all 21 of those objects plus `PRP_box_01`. I restored the box but did NOT poll redo first, and adding it discarded the redo branch: `bpy.ops.ed.redo.poll()` is now False. No file on disk has the build either — I opened five candidates headlessly (`printshop-before-relayout` and its `.blend1`, `printshop-before-refmatch`, `m08-checkpoint-20260831-153251.blend`, `/tmp/quit.blend`) and none contains a single M-08 object. **So the build can only be reconstructed from the numbers below, which were measured out of the live scene before the undo.** Mabel has not yet said go on that rebuild.

**LESSON, PLEASE HONOUR IT: poll `bpy.ops.ed.redo.poll()` BEFORE your first mutating call in this file, and tell her what it says.** A redo branch is discarded by the next edit.

Rebuild data — exact unless marked. All three cameras 32mm, `dof.use_dof = False`, each parented to its rig with a TRACK_TO constraint on its own AIM empty. Scene frames 1-168.

Known defect in B_push, fix before anyone rolls on it. At f150 the settle crops the boy's head off the top of frame, and the Old Printer lands 31.1 deg off axis against a 29.4 deg half-angle at 32mm, so he leaves frame. Raise the end position, or trim the pan to about 14 deg, which keeps him just inside. Evidence: `refs/blender-stills/m08_v6_B_f150.png`. The best frame in the set is `m08_v6_C_f110.png` — both men whole, boy favoured.

Other live state. `PRP_box_01` is back, but NOT where it was: it was at (5.075, -0.855, 0.325) and the counting desk has since moved to (5.025, -1.25), whose body AABB is x 4.7-5.35, y -1.85 to -0.65 and now occupies that spot. Every clear position is west of the desk, so it sits at (4.3, -1.8, 0.325) — unit cube, scale (0.75, 0.79, 0.65), no material, collection PRINTSHOP_FURNITURE. Mabel has not confirmed that placement. The counting desk and ledger were hidden for M-08 via `hide_render`/`hide_viewport` on `PRP_counting_desk_top`, `_body` and the three `PRP_ledger_*` meshes; the parent `PRP_counting_desk` is an EMPTY and was left visible, so grepping the parent's flag reads wrong. That hiding was undone with everything else and is an open decision, not a settled one. All four `CHR_*` are 178-vertex capsules with an empty material slot — no hair, beard, cap or apron exists.

Blender 5.2 gotcha: `action.fcurves` does not exist. Use `action.layers[].strips[].channelbag(obj.animation_data.action_slot).fcurves`.

Standing rules: don't spend credits without Mabel clicking for that specific roll; reach for the free route first; say what you are doing on the review server with `approve.py status --thread t10` and answer with `approve.py reply`. Nothing has been generated and nothing spent.