Split out of `sheets/shots-morning.md` on 19 August 2026, at Mabel's direction, to keep the working sheet short. Nothing here is superseded — it is the reasoning, the lineage and the measured findings behind decisions the sheet now states in a line each. Generate from the sheet; read this before re-walking ground somebody already covered, or when a one-line rule needs its "why".
The market is cut (7 Aug 2026, Mabel's direction: fewer city shots). The runner crossed town in five exteriors; he now crosses it in four — M-01 feet, M-02 gate, M-09 alley, M-11 lane — and 21 s of exterior comes down to 17 s. M-06 (the market) is the one that went, for two reasons. It repeated M-02, where he is already dodging the morning's carts, so runner-against-morning- commerce played twice inside ninety seconds. And it was the worst fit for the empty-sets rule below: a market still with nobody in it is barely a market, and the shot wanted a hand-cart and a water-carrier — background figures that would have to be cast at video time from turnarounds that do not exist. An empty alley is just an alley. The alley then moved up into the market's slot, so the intercut stays evenly spaced (gate → 15 s of shop → alley → 20 s of shop → lane); deleting M-06 and leaving M-09 where it was would have left one 26 s stretch with no cutaway to the runner, and the back-and-forth is the engine of the opening. Knock-on: one fewer stop on the runner's path to generate, and the fountain lost `EXT. WITTENBERG - MARKET - DAY`.
Two length columns, and they are not the same number (7 Aug 2026). Cut is how long the shot plays in the film. Gen is what to pass as `--duration` — always longer, because a clip generated to its cut length can only be used one way. The surplus frames at head and tail are handles: they let the cut point move in the edit, they pay for dissolves (a half-second dissolve eats half a second from both clips), they let picture slide a few frames to land on a musical accent, and they leave room to retime. Two reasons on top of those that are particular to generated footage: the head and tail are where the artifacts live — models ramp motion at the start and drift at the end, so throwing both edges away should be affordable — and **a take that is too short is a total loss, not a partial one**. Three extra seconds on M-01 costs ~20 credits; discovering the 4s take cannot be trimmed costs the whole take again, plus the wait, plus the chance the re-roll is worse. Handles are cheaper than re-rolls.
How the Gen numbers were set:
The morning totals 76s cut against 114s generated — 50% more material, ~741 credits (**as written on 7 Aug 2026 and left standing as the record of that day; with M-10 cut on 5 Sep 2026 the sheet's grid now sums to 67s against 97s**) for one take of every shot on `seedance_2_5` at 720p. That is the overhead handles cost, and it is the cheaper half of the trade. **Nothing goes below 4s**: both Seedance models floor there, so a 3s cut is generated at 4s minimum even where this table says less would do.
Cut lengths were checked against `scratch-timings.md` on 3 Aug 2026 and three were raised to fit their dialogue: M-10 5s → 9s (MOR-03 + MOR-04 = 8.8s), M-14 4s → 6s (MOR-05 = 5.4s), M-15 5s → 8s (MOR-06 = 5.9s plus the held silence the beat calls for). Those are estimated timings — re-check once measured takes exist. Note M-10 now exceeds Veo's 4/6/8s options, so it needs a flexible-duration model (`seedance_2_0`, `kling3_0`); the rest fit any of them.
The speech IDs above moved on 5 Sep 2026 and are stale as IDs. M-10's cut took the lampblack exchange out of the German script, so `scratch-timings.md` was regenerated and the morning is four speeches, not six: the MOR-03 and MOR-04 that were the lampblack lines are gone, and what was MOR-05/MOR-06 — the runner's Frankfurt ist dahin and the Old Printer's Zween Aufträge — is now MOR-03/MOR-04. The paragraph above is the 3 Aug numbering, left as written; read it by the durations, not the IDs. M-14 and M-15 keep their raised lengths; the flexible-duration note died with M-10.
APPROVED, 4 Aug 2026: `refs/music/runner-motif.m4a` (≈26 s) — pipe and tabor, picked by ear across ~15 candidates. Provenance: Sonilo take "A2", untouched except the ending — trimmed to stop dead (staccato, no ring) on its final solid accent at 26.05 s, so the M-12 door bang plays as the sound after the music's last hit. Method findings, for the next scene's cues: the generator treats structural asks (bare intros, hard endings, builds) loosely — prompted builds read 21st-century, endings trail off and get fixed by trimming to an accent; splice assemblies were rejected by ear. Pick a take for its tune, then cut. All rejected takes remain recoverable from Higgsfield job history. This is an edit-stage cue (`sonilo_music`, PLAN Phase 5) laid over the picture — it changes nothing in any generation prompt, and the commercial-terms hold on mixing music in still applies.
The sheet carries a short version of this table. This is the long one, kept for the lineage and the method findings inside it.
Approved 3 Aug 2026, on the site at `refs.html`. Pass the character stills and the set still together in `seedance_2_0`'s `image_references` array — the array is the identity lock, and one image wastes it. Probe M-02 carried face, costume, gate and street simultaneously from three references.
| Subject | Stills |
|---|---|
| Young Printer | `young-printer`, a three-view sheet on grey — full body frontal, full body back, ¾ face close-up in one image (approved 7 Aug 2026, replacing the three separate stills of 4 Aug; ink on HIS RIGHT cheekbone). Pass it as one reference, as generated. No in-motion view exists for the tracking shots M-01/02/09/11. |
| Old Printer | `old-printer-summer-02`, a three-view sheet on grey — full body frontal, full body back, ¾ face close-up from his right in one image (approved 12 Aug 2026, replacing the 7 Aug sheet, which replaced the five-view set of 3–4 Aug; mole on HIS RIGHT forehead, left side clean). Summer costume canon, Mabel's direction 12 Aug 2026: two garments and the apron, never three — a pale linen shirt with the throat lacing loose and the sleeves rolled above the elbow, a sleeveless black wool jerkin hanging open over it, and his near-black leather apron below the knee on a shoulder strap. No doublet and no sleeve below the elbow; head bare, since the flat black cap is Lufft's alone. This supersedes the long-sleeved dark doublet of the 7 Aug sheet — the film is late June and the old dress read as too much cloth for the season. Generated by `seedream_v5_pro` as a single job, so unlike the 7 Aug composite it is referenceable whole by `seedance_2_5` rather than only panel-by-panel. The sheet's three panels are divided by light grey bands — pass it as one reference, as generated. No seated view exists for M-05 and M-15 — `old-printer-desk` was unapproved and deleted 7 Aug 2026; the ledger pose has to come from the prompt. |
| Apprentice | `apprentice-tq-03`, a three-view sheet on grey — full body frontal, full body back, ¾ face close-up in one image (approved 12 Aug 2026, replacing the 7 Aug sheet, which replaced the hero-plus-two-views set of 4 Aug). He set the line at the type case in M-10, until M-10 was cut on 5 Sep 2026; his remaining morning work is the near table in M-07 and the sorting in M-08. His face is clean — the lampblack is on his lower arms, smeared along both forearms between wrist and elbow with the hands and nails blackened (Mabel's direction, 12 Aug 2026: the Young Printer already carries a facial smear and the two read as repetitive; this supersedes the 7 Aug right-cheekbone canon). Its ¾ close-up is turned to his own right, so the face angles toward the left edge of frame and his left cheek is nearest the lens — the opposite side from the other three sheets. Generated by `seedream_v5_pro` as a single job, so unlike the 7 Aug composite it is referenceable whole by `seedance_2_5` rather than only panel-by-panel. |
| Print shop, day | `shop-day-19` (approved 7 Aug 2026, replacing the 10–16 line — both presses' timber roughened to hard-used oak and each given its bar, off `shop-int-09`; 09 had the pressman removed from 08, and 08 had the M-07 defects edited out: smooth turned wooden screws, no gears or spoked wheels, no shirt printing, no carved beam, no banner, drying sheets dense small type only). Method note: FLUX.2 instruction edits re-synthesized this interior and drifted the walls (olive plaster, fieldstone); `nano_banana_pro` edited surgically and held the look — use it for still cleanups, not FLUX.2. Two harder-won notes, 7 Aug 2026: (1) never ask the model to relight — the rounds that warmed 10/11 laid a halftone mesh over the plaster and smeared the wood grain into paint, and nothing downstream recovered it; warmth is a local grade (per-channel affine matched to the target's colour statistics, plus a gentle S-curve), which moves tone without touching detail. (2) `nano_banana_pro` cannot be aimed at one of two similar objects — three of four rolls hung the bar on the tall foreground press however the far one was described, and the roll that found the right press gave it two arms. Ask for the change on both objects instead: both presses got their texture and their bar in one roll each, with nothing to misaim. |
| Town exterior (the look) | `town-ext-10` (approved 7 Aug 2026, replacing 09 — dogs and townspeople removed; 09 had already lost the wall lantern that propagated into probe M-02, plus downpipes). This is the town look, not a place the runner passes: palette, architecture, morning sun. The four stops below are generated from it by reference. |
| The runner's path | `runner-path-01`–`04` — one still per exterior shot, in cut order. All four generated 7 Aug 2026 from `town-ext-10`; 03 and 04 re-rolled the same day (see the naming block below). None approved yet. |
The runner's exterior stills are named `runner-path-NN` in route order, so the number tells you where in the run you are — Mabel's direction, 7 Aug 2026: the old `town-ext-NN` numbering counted generation attempts at one look and said nothing about place, which is what you actually want to know when you open the gallery.
| # | Still | Stop | Shot | Wants |
|---|---|---|---|---|
| 1 | `runner-path-01` | The road in | M-01 | Packed dirt at low angle, the ruts and stones the camera runs along, the road approaching the gate — ground and light, since the shot is feet and no more |
| 2 | `runner-path-02` | The town gate | M-02 | Stone gate, the morning's carts, the road running out of town behind it |
| 3 | `runner-path-03` | The alley | M-09 | A narrow timber-framed shortcut, a corner to take blind, walls close enough to echo |
| 4 | `runner-path-04` | The printers' lane | M-11 | A lane of print-shop fronts, the windows the watchers appear at, the shop door at the end |
The four numbers are the four exterior shots, in cut order — M-01, M-02, M-09, M-11 — so the still number and the position in the run are the same thing. The road in earns a still of its own (Mabel's direction, 7 Aug 2026) even though M-01 holds no architecture: it is the first frame of the film, and the surface, the raking light and the palette under those feet have to be the same ones the gate stands in a cut later. It is the cheapest of the four to generate and the easiest to get wrong by leaving to chance.
`town-ext` and `runner-path` are deliberately different prefixes. `town-ext-` is the eight-take hunt for one approved look* (`town-ext-10` won); `runner-path-` are the places* generated from that look, one per stop. Keeping them apart is what makes the numbering informative — renaming the town-ext takes into the runner-path series would put eight tries at one image and four different locations in a single sequence and lose exactly the distinction this convention exists to draw. It would also break the approved record in `assets.json`, which cites `refs/set/town-ext-10.png` by name, and the lineage notes here and in PLAN that trace 10 ← 09 ← 04.
The two sets are graded to each other (7 Aug 2026): the morning walks the lane and goes straight through the shop door, so the interior was brought to the exterior's warm raking sun rather than the other way round — `shop-int-08` was flat cool grey against a golden lane and the cut read as a change of weather. How matters as much as that it was done: `shop-day-19` is warmed by a local grade, not by the model — and the recipe is recorded here so it can be re-run or re-matched without the takes it was derived from:
``` shop-int-18 -> 19, per-channel affine v' = gain*v + lift, matched to the colour statistics of the retired shop-int-11: R gain 1.051 lift +6.2 G gain 1.020 lift +4.5 B gain 0.959 lift +4.1 then a gentle S-curve about mid grey, t = (v-128)/128: v' = 128 + 128 t (1.06 - 0.06 tt) ```
REVERSED, 7 Aug 2026 (Mabel). The paragraph below is kept because its
reasoning still holds and the BOILERPLATE half of it is still in force — but
the reference no longer stays flat. Mabel called `shop-day-19`'s light
"whatever that is" and asked for morning, so `shop-day-20` (moderate) and
`shop-day-21` (lower, harder sun) put it in. See *Morning light, put into
the reference* below for the method and the cost.
**Settled, 7 Aug 2026 — the shop has sun in the film, and no sun in the reference.** The grade carries hue and contrast across but cannot invent light, so `shop-day-19` is warm and flat where the lane has hard raking sun. That stays, and the sun is carried in the BOILERPLATE instead, so it reaches every interior prompt without being remembered shot by shot: low sun in near-horizontal shafts through the leaded windows, the lattice pattern thrown across the back wall and the upper press timbers, floor and working tables in warm bounce below. *(Corrected 7 Aug 2026: this was first written as shafts landing high — the beams and the hanging sheets — and lived only in this paragraph, which is prose the generator never sees. Both halves were wrong. The direction belongs in the block that gets pasted, and sun entering a window at chest-to-head height lands at roughly that height and lower as it crosses the room, never on the ceiling; the beams and the drying sheets take bounce, not shafts. Asking for direct sun where it cannot fall is how a generation comes back with light from nowhere.)* Two reasons the reference itself stays flat. A set still is one reference among several and its job is room, materials and layout; light welded to one camera position fights the reframes across M-03…M-15, which are a dozen shots at different angles in the same room. And the alternative was tested and failed: a fresh generation lit that way from the start (`shop-int-20`, `flux_2`, deleted) came back photographically the best interior yet and broke three rules at once — "1361" painted across the press frame (a date ninety years before printing), a spoked iron handwheel, an iron screw where the press takes turned wood, plus drying sheets in large readable blackletter and a layout unrelated to the approved room. That is the same failure the exterior re-rolls hit on 3–4 Aug: fresh rolls buy quality and pay for it in anachronism. Any set generated from here inherits the look: cream-ochre lime plaster, warm brown oak, terracotta, iron grey; ~28mm at chest height, level horizon; 2752×1536; wood, leather, paper, stone and hand-forged iron only; and empty of people.
Mabel's call, overriding the "flat reference" decision above: `shop-day-19` reads as flat ambient fill from nowhere. Measured, it is exactly that — **G sits 11.9 below the R/B midpoint across the entire frame** (the mauve cast), and there is no warm/cool separation at all: the sunlit back wall is R−B +45.7 and the shaded floor +21.5, both warm, so nothing in the room says where the light comes from. The windows only reach L 177–204 against a 143 back wall, so the glass barely reads as the source.
Done as a local pass, not a model round — the day still's own history is that relighting rounds laid the halftone mesh and smeared the grain, and the one fresh generation lit this way (`shop-int-20`) came back with "1361" on the press frame. Building the light locally avoids both. Four steps:
1. De-magenta — G back up to the R/B midpoint. 2. A light map — a warm gain falling off with distance from each of the four window openings, summed so a corner between two windows is brighter than a corner with none. That falloff is what carries direction. 3. Split-tone — warm into what the map reaches, cool blue-grey into what it does not. This keys off luminance honestly: in a diffusely-rendered room the sun-facing surfaces really are the brighter ones, so the BOILERPLATE's own rule ("warm where the sun reaches, cool blue-grey where it does not") falls out of the tone curve rather than being painted in. 4. Hot glass and an S-curve — the panes lift so the windows read as the source, and the contrast curve supplies the modelling a flat render lacks.
Result, `shop-day-20`: sunlit wall R−B +45.7 → +58.9, shaded floor +21.5 → −3.4 — warm light and genuinely blue-grey shade, where before both were warm. Windows 202.7 → 228.5. `shop-day-21` is the same with a lower, harder sun. Neither is approved; `shop-day-19` is still the approved `SET-shop-day`.
Two things this cannot do, and one it costs. It cannot throw the BOILERPLATE's lattice pattern across the back wall or put paper dust in the shafts — those are new pixels, not tone, and they stay the BOILERPLATE's job at video time. And the cost is the exact reason the reference was flat before: the light is now welded to this camera position. The falloff is anchored to where these four windows sit in this frame, so the further a shot reframes away from it, the more the reference argues for sun from the wrong side. M-03…M-15 are a dozen angles in this room. If that starts fighting the takes, `shop-day-19` is still there and still approved — this is an added take, not a replacement.
The night shop is the one to watch. It is the same room as `shop-day-19` at a different hour, so it inherits every constant above — layout, both presses, window placement, materials — and none of the light. It is also the set most likely to be generated by reference off the day still, which is exactly how the day's sun would get into it. The evening scene's whole texture is one candle against a dark shop; a warm sunlit night-shop still would contradict the scene it exists to serve. **Generated 7 Aug 2026 — `shop-night-02`**, `nano_banana_pro` off `shop-day-19`: the room came back at night with the layout intact. Two rolls, both from the day still rather than editing one into the other — `shop-night-01` kept printed sheets on the drying lines where `shots-evening.md` wants them empty, and 02 regenerated with the lines described positively as cleared for the night ("bare cords, the wooden pegs standing empty"), which is the same generate-empty-rather-than-empty-afterwards rule the sets below follow. 02 also came back with a taller candle, which suits E-01 (the evening checklist wants it tall at the top of the scene and low by E-19), and an apron on the wall. Approval is still open — see the texture finding below.
Asking for night is not asking for one candle (Mabel's note, 7 Aug 2026). `shop-night-02` read as night at a glance but was in fact lit by its windows: measured, the four leaded windows sat at luminance 76–94 against a candle-lit tabletop of 87, so the brightest thing in frame after the flame was the glass, and a cold blue fill (blue-over-red +45 to +59 in the panes, +18 on the left wall) reached every surface in the room. That is moonlight, not candlelight, and it flatly contradicts the BOILERPLATE — "one warm flame at a long oak table, the rest of the shop falling away into cold darkness." The fix was one round off 02, and it is the keeper:
Everything after 03 was deleted, 7 Aug 2026, at Mabel's direction, after the whole line was reviewed in the gallery. The bucket copies stay under `gs://the-offer-assets/refs/set/`, so `python3 assets.py pull refs` brings any of them back. Recorded here so nobody re-walks the line by accident — and note that **03 is a generation, not a grade, so none of this tone work carries over to it**; anything wanted from 04–08 has to be rebuilt on 03 from scratch:
Two findings from that pass worth keeping even though the files are gone, because they apply to any still on this project: **weight a detail boost as a bump, not a ramp** — running it hardest in the darkest pixels pulls the inherited honeycomb mesh up into visible netting, since the mesh lives in the fine band, exactly where there is no real detail to recover; peak through the mid-shadow and fall away below L≈10. And give grain its own, flatter weight than the detail boost, or the deep shadows speckle like sensor noise. A pass like this recovers detail that is buried, never wear that was never generated.
03's own texture is unmeasured — it is one generation off the parent with no grades on it, so it should sit near `shop-day-19`'s 7.7 rather than 06's 2.7, but check at 1:1 before approving.
The reusable rule: kill the window's fill, not the window. What made `02` wrong was light on the walls, presses and floor, not brightness in the panes — so the fix is a mask that separates the two, and the number to watch is the pane-to-tabletop ratio, not the pane's absolute value. That rule is banked for whatever comes next, but it is not what `03` does — 03 is the near-black- pane take, from before the rule was found, and it is the still Mabel kept. `shots-evening.md` names it. Approval is still open on the same texture ground as before: the honeycomb mesh is inherited from the day still, and the only fix is repairing the day still.
`shop-day-NN` is the morning room, `shop-night-NN` the evening room — Mabel's direction, 7 Aug 2026. They were both `shop-int-*` until then, which named the room but not the hour, so the one prefix stood for two sets that share a layout and share nothing else: the day is flat warm daylight with both presses working, the night is one candle in the dark with the presses silent. The old name also collided in `build.py`, where the morning and evening scenes each counted their approved sets by prefix and so counted the same still.
The shot ids moved with the filenames: `SET-shop-interior` was ambiguous between the two and is retired in `assets.json`, replaced by `SET-shop-day` and, when it is approved, `SET-shop-night`. Both prefixes are registered in `build.py`'s `SCENES` — a set slug that is not listed there is invisible on the index — and the split has a side benefit there: morning and evening are now each distinguished by a set no other scene uses.
Open — the halftone mesh is still in the day still (found 7 Aug 2026 while judging `shop-night-01` at 1:1). PLAN records the mesh as a defect of the relit 10–16 line, cured by rebuilding off `shop-int-09`. It was not. Compare the same crop across the lineage: `shop-int-09` is clean — real wood grain, smooth plaster — and `shop-day-19` carries a fine honeycomb stipple on the platen edge, the carriage and the plaster panel behind the screw. The mesh therefore came back in the retexturing rounds (17, 18), not only in the relighting ones, which means the rule is broader than "never relight": any `nano_banana_pro` pass over a whole surface can lay it down, and 1:1 judging has to happen after every round rather than only after a light change. `shop-night-01` inherits the mesh from its parent, though darkness hides most of it. `shop-int-09` is not a usable base to redo either still from — it is the take from before the bars were restored, so it is missing a bar handle. Fixing this means redoing the retexture from 09 and putting the bars back again, and the day still is the one to fix first: the night still is generated from it and would inherit the repair.
Set stills carry the place and nobody in it (7 Aug 2026): no figures, no animals. Whoever a set generator invents is an unapproved face and costume that inherits into video from the references array — characters come from the turnarounds and meet the set at video time. Ask for the emptiness positively ("the lane empty, the town still asleep"); a "no people" list gets dropped. Both stills above predated the rule and were brought into line the same day: `town-ext-09`'s two dogs and three townspeople and `shop-int-08`'s pressman at the bar were edited out, giving the `town-ext-10` and `shop-int-09` that led to the two approved here. Generate the remaining sets empty rather than emptying them afterwards: removing the pressman took the centre press's bar handle with him, and the detour to put it back — four misaimed generations, a hand composite, then a rebuild off 09 when the relit line proved too soft — ran to eleven takes (`shop-int-09`…`19`).
The sheet's own rule says text the camera can read is set, not generated, and names M-03 as the shot it applies to. That rule had never been carried out; until today the only evidence behind it was the 3 Aug probe, whose beautiful blackletter spelled `Eintfách Fralttien Ehaelt`. `m03-plate-01` is the rule done, and the route generalises to the contract insert and every later ledger and letter.
The plate is built in three steps, and only the middle one is generated.
1. A photograph of a sheet, with the type as a placeholder. `wet-sheet-04`, `seedream_v5_pro` at 16:9/2k, conditioned on `shop-day-19` and on the Apprentice's turnaround. Rolls 01 and 02 were shot with anonymous hands and are retired by Mabel's direction the same day: **an insert is a shot like any other and its hands belong to somebody in the film**, or a face and a costume nobody approved inherit into the take. The Apprentice is the right somebody here for a reason worth keeping — his canon is forearms and hands (lampblack wrist to elbow, blackened nails), so his sheet actually constrains what an insert like this shows, where the Old Printer's sheet, whose mark is a forehead mole, would constrain nothing. Roll 04 beat 03 on light: a hard-edged patch of sun raking across the upper sheet, cool blue-grey shade below it — the split the continuity checklist demands, and the thing that makes the shot read as the same morning as M-11. 2. The type, set rather than drawn. Psalm 49 and the head of Psalm 50, read out of `resources/bible/luther-1545.txt` — never typed from memory — set in UnifrakturMaguntia, two justified columns, no verse numbers (the 1539 Psalter had none), long ſ everywhere but at a word's end, each word nudged a hair off its line so the setting is not metrically perfect. 3. The print, done locally. A grayscale closing lifts the generated pseudo-blackletter off the paper and returns the paper to its own level — a max filter alone came back brighter than the sheet and read as a pale panel laid over it, which is the first thing to check if this is ever redone. The real type is then perspective-warped into the paper's plane and printed by taking the paper down toward black through the type's alpha, so the sheet's raking sun, its cockle and its shading come through the letters instead of being repainted over them.
Why this text. The revision committee sat from January 1539 and began with the Psalter, and Lufft printed the revised Psalter Deudsch that year, so a Psalter sheet is what this shop plausibly has on the press in June 1539. Which psalm is a deliberate dramatic choice, and it is Psalm 49 because of what it says: *Die sich verlassen auff jr Gut / Vnd trotzen auff jren grossen Reichthum … Denn es kostet zuuiel jre Seele zu erlösen.* Nobody in the audience reads it; the film's argument is sitting in the boy's hands anyway. Two caveats, recorded rather than hidden: the corpus text is the 1545 edition, six years after the scene, standing in for the 1539 revision it mostly is; and four verses of Ps 49 and six of Ps 50 are **truncated in the corpus file**, so they are left out rather than set as broken sentences. Fraktur is also a compromise — Wittenberg Bible work of 1539 was set in Schwabacher, and UnifrakturMaguntia is the Fraktur PLAN names.
**The finding that matters beyond this shot: an uploaded `--start-image` cleared `seedance_2_5`'s IP check.** A plate built this way matches no Higgsfield job by construction — the whole point is pixels no model made — so it can never be an `image_references` entry, and `gen.py` refuses it rather than buying a four-minute wait and `IP check not finished`. Sent as `--start-image` it went straight through and the take starts from exactly those pixels. That is one clean data point against a standing gate, not a repeal: it was a start image and not a reference, and it should be re-tested before it is relied on again.
`M-03-01`, the first take (`seedance_2_5`, omni_reference, 5 s, 720p, 33 credits): the camera stays locked, the type stays put — no line re-forms or rewrites itself across 121 frames, which was the risk — the wet sheen travels across the columns, and the Apprentice's inked forearms hold through. Two things to watch on the next roll: the plate's repaired area sits very slightly brighter and smoother than the paper around it, and the sheet drifts a little further left than a locked insert wants.
`m03-plate-02`, and what "I like 04 best" turned out to mean (19 Aug 2026). Mabel picked `wet-sheet-04` out of the gallery over the plate, which the clip was already built on — the plate is 04 with its lettering swapped. So the preference was for something in 04 the plate had lost, and measuring the block said what: not the paper (grain 26.3 against 04's 28.1) but the ink. 04 prints warm brown-black, big, and unevenly; the plate printed neutral, small and mechanically even. Three changes close it, all in the printing rather than the setting: the paper is pulled down per channel (R .21, G .13, B .10) instead of dimmed evenly, because lampblack in linseed oil is a brown-black; the type is set at 58/1.20 instead of 50/1.27, nearer 04's scale; and the alpha is modulated by a soft noise field with a hair of bleed past the strokes, because a press does not ink every letter alike. The repair is also masked to where ink actually sat now, so the paper between the lines is 04's own pixels rather than reconstructed ones — the pale panel of plate-01.
`M-03-02` is the take off it. The type holds again; the sheet drifts a little more than 01 does, and a faint bright halo still rings the type block, which is the repair showing through the render. Both takes are in the gallery: 01 is the lighter, more even setting, 02 the heavier and warmer one.
The shot will not open wide. M-04 is the establishing interior: a wide on the whole shop, a slow dolly, six men at work. Twice `seedance_2_5` was given that in prose — the second time with a paragraph saying, in five different ways, that the framing of the first frame is the framing of the whole shot and that the camera never travels in or out — and twice it opened in a medium two-shot on the near press and spent the eight seconds pulling back. `M-04-01` arrives at a usable wide about six seconds in; `M-04-02` arrives at almost exactly the reference still's own composition and then has nothing left to do, so the press stops and the room empties. Both are hidden.
The reference still's flat light passes straight through. `shop-day-19` is lit evenly — the halftone/flatness note above — and both prose takes inherited that: no window patch, no lattice on the plaster, no shafts. Against M-11's sunlit lane that reads as overcast, which the continuity checklist rejects outright. Describing the sun in the prompt did not beat the reference.
**The plate route fixes both, because it is one frame and both faults are in frame one.** `m04-startframe-01` (`seedream_v5_pro`, `shop-day-19` in its references) is the wide, populated, hard-lit frame the take was supposed to open on; `m04-startframe-02` is a barer, better-sunned alternative that loses half the room. 01 came back cool — blue-grey walls where the film's morning is warm — so `m04-plate-01` is 01 through a per-channel highlight curve (r 0.6→0.66, g 0.6→0.615, b 0.6→0.555), warm where the sun lands, cool in the shade, no model asked to touch the light. That is the same division of labour as the earlier relighting rounds: geometry to the model, tone to a local grade.
Pinning it half-worked, differently from M-01. `M-04-03` was generated with the plate as `--start-image` and `shop-day-19` still in the references. It did not open on the plate frame for frame the way M-01-11 opened on its start frame: it opened in a medium two-shot of the plate's own men and pulled back until, by the last second, it was the plate — right framing, right sun, right action, at the very end of the clip. So on this shot the pinned frame behaved as a destination rather than an opening. The untried variable is the reference array: M-01-11 pinned a start with only a character sheet alongside it, where this call also carried a set still, and the set still is the thing that has been overriding instructions all day. Next roll drops `--ref shop-day-19` entirely — the plate already is the room — and keeps only the plate and the character sheets.
What the takes showed about the printing itself, and what came of it. Mabel (19 Aug 2026): the men are random printers, and they are doing physically impossible things. Both are true. The plate and all three takes cast invented faces where the film has approved sheets for an Apprentice and an Old Printer; and the press work is pantomime — a man gripping a frame post as though it were a lever, the beater dabbing ink onto a forme sitting under the platen, the bar hauled with no carriage run in beneath it. The mechanism is now written down, with its vocabulary, its seven-step cycle and the six failures that keep recurring, in [`press-mechanics.md`](../resources/press-mechanics.html); the sheet's rules point at it, and M-04's row now names the beat the shot is on rather than "one press pounds its rhythm". The plate has to be re-rolled with `apprentice-tq-03` and `old-printer-summer-02` in its references before the next take — the roll that would have done it hit `not_enough_credits`.
One tool change fell out of it. `gen.py` refused the graded plate outright: start and end frames went through the same job-id translation as the references array, and a locally graded file matches no job. But an uploaded start image is exactly what clears 2.5's IP check (M-03's plate is the precedent), so `resolve_refs` now takes `upload_ok`, set for the pinned frames alone: it sends the job id when one exists and the file itself when none does, and the ledger says `upload` rather than naming a job that did not make those pixels.
The staging changed: he is working, not posing (Mabel, 19 Aug 2026). The first three plates had the boy standing holding the sheet up, which is a pose and not a job. M-03 is now the moment the sheet comes off the press — peeled off the forme, drawn up out of the press, on its way to the line — with the next move (hanging it) deliberately not shown.
Two anachronisms surfaced on the way and are worth knowing, because both came from asking for the press at all. `wet-sheet-05` put an **iron cylinder press** under the sheet — a nineteenth-century machine, in the shot that exists to show 1539 printing — and hung the drying sheets on spring clothespins. Naming the period parts positively fixed both first time: the wooden carriage on its rails, the forme locked in a wooden chase, tympan and frisket as parchment-covered wooden frames on leather hinges, and sheets **folded over the cords** rather than pegged to them. Add those to any prompt that shows the press working.
A sheet held at an angle is a different compositing problem. `wet-sheet-06` was period-correct and well staged but held the paper at about 15° and bowed, and one plane will not hold a bowed sheet: the type came out looking set crooked, and the generated lettering bulged past the block on the curl and double-printed against the real type. Two changes fixed it and are now in the method: the block is **split at the gutter and each column warped to its own quad, which follows the curve well enough at this scale; and what gets cleaned is wider than what gets printed**, since leftover generated lettering is worse than cleaning blank paper. `wet-sheet-07` also asks for the sheet's face square to the lens, which is what keeps any of this tractable — the staging can be busy, but the paper has to face the camera.
`m03-plate-03` is the plate off 07. **The clip off it has not been generated: the account ran out of credits** (12 left against ~33 for a 5 s take at 720p) while the parallel M-01 run was spending 52–54 a roll. `M-03-01` and `M-03-02` in the gallery are both from the older standing-and-holding staging and are superseded by this direction, whatever their type looks like.
The re-cast plate, three rolls (19 Aug 2026). `m04-startframe-03` put both character sheets in the references and fixed the cast — the Old Printer is at the counting desk, the boy's forearms are lampblacked — but cast two boys, the second one working the press, and had him inking a sheet on the tympan rather than the forme. `-04` fixed both by saying the near press is worked by two grown men in their thirties and forties, neither of them a boy, and that the ink goes onto the type and nowhere else: it came back with the beater dabbing a run-out forme with a ball in each hand and the puller laying the sheet on the tympan, which is the beat the row now names. Its boy was red-haired, so `-05` names the hair positively (dark brown, near-black in shade, cut straight across) and the Old Printer's full grey beard, and lands both. `-05` is the plate; `-02` and `-03` are hidden. The take off it did not run: **3 credits left in the workspace against 52 for the roll.**
All seven rolled free through higgsfield.ai in the browser, `seedance_2_5` at 5s and 720p under Unlimited mode; none touched `gen.py`.
| Take | Reference | What changed | What came back |
|---|---|---|---|
| M-01-14 | none | first website roll, positively-stated ground | clean road, no rubble ridge — the stone problem solved by wording alone; three-quarters rear |
| M-01-15 | `m01-profileframe-01` by id | the angle pinned by reference | profile held, clean ground, correct costume — and slow |
| M-01-16 | same | camera falls behind him instead of matching his speed | he travels across frame, wall streaks — still slow |
| M-01-17 | same | sand and grit surface, sprint overshoot, 45° shutter | surface right — still slow |
| M-01-18 | none | the same prompt with no reference at all | wide, distant, bare shins: the reference holds framing and costume |
| M-01-19 | the young printer's legs sheet | crisp reference, no smear | pace fixed — and sprinting |
| M-01-20 | same | dialled back to a working run, 180° shutter | the pace question, open at time of writing |
The chain of causes, in the order they were wrong: the free route was suspected and cleared (no duplicated or interpolated frames, same 24fps as the API); my own direction was suspected and cleared (the matched camera); the reference's motion blur was the cause, and it was there because the still's own prompt asked for it. Mabel called every judgement correctly by eye while three separate pixel measurements contradicted each other.
`M-03-01` and `-02` ended with the sheet still travelling, on its way to the drying line, because the row said so: *he never hangs it, lowers it or lets go. Mabel opened thread `t4` against exactly that — *"he should do something after holding the page. make sure the page is v[isible]"** — and the shot changed shape. Everything from `-03` on is the search for what he does.
The action that settled: he checks the impression in the window, then puts the sheet down on the stack beside the press and lets go. Two beats, one continuous move — and the camera stopped being locked off. It cranes down and forward with the sheet at the sheet's own rate, so the type stays the same size in frame from the window to the pile.
**That camera move is what makes the shot hard, and it is the whole story of these seven takes.** A sheet lowered away from a static camera foreshortens; the printing goes to a grazing angle; and the moment it does, the model stops rendering letters and starts rendering grey. Four of the seven died there.
The plate came off at `-04`, and stayed off. `-03` is the last take built on the real-type plate; from `-04` onward every roll used the same three references — bare `wet-sheet-04`, `apprentice-tq-03` for the forearms, and `shop-day-19` for the room — trading set type for 04's ink, which prints warm, big and unevenly where the plate printed neutral and mechanically even. That is the 19 Aug preference reasserting itself, and it is why the approved take's sheet says nothing.
| Take | Gen | Built on | What came back |
|---|---|---|---|
| M-03-03 | 5s | the real-type plate, + two stills | the lay-down never happens — it ends with the sheet still up at the window. Type holds, but small, pale and neutral |
| M-03-04 | 5s | `wet-sheet-04` trio | reaches the stack and the camera makes it overhead — and both columns dissolve into grey speckle on the way |
| M-03-05 | 7s | same | lands with the type legible and both headings intact, but the sheet sits skewed across the pile |
| M-03-06 | 4s | same | lands square and the headings survive; the type block itself goes to a grey mesh |
| M-03-07 | 4s | same | the first one that holds — lands square, blackletter legible throughout |
| M-03-08 | 4s | same | a worker crosses behind, as asked; the type softens toward grey as the sheet comes down |
| M-03-09 | 4s | same | approved — individually legible blackletter in the final overhead frame, and the sheet square with the stack |
`-08` and `-09` were both rolled on the website and neither was pulled down at the time. They were recovered from Higgsfield's job history the same afternoon and reconciled by content (`provenance.py sync`), which is why their ledger entries read `via: history` rather than `gen.py`. Jobs `8bfbdecf` and `f761fb21`.
What approving `-09` cost, recorded plainly. Its lettering is generated and spells nothing — the exact condition `m03-plate-01` was built to end, and which this file argues for at length four hundred lines above. Mabel approved it knowing that ("i like the clip", 21 Aug 2026). The trade is legible-but-meaningless type in exchange for ink that looks pressed rather than printed, and for a sheet that survives the move at all, which no plate-based take managed.
That trade is available here and nowhere else in the film. M-03 is four seconds of a sheet nobody is asked to read. **M-14's letter and the contract in the final shot are read** — they carry the news, and they carry the number — and for those the plate method stands: set the type, kill the generated lettering, hand the model a first frame.
At Mabel's direction, **every file in `refs/cuts/` was renamed into one date-ordered series**, `morning-scene-01` … `-14`, replacing two families that had grown up side by side (`morning-open-` for the assemblies and `m04-m05-` for the two-shot joins). Everything above and below this line is written in the new names; this table is the only place the old ones survive, and it is here because the reasoning in this page was written against them and because git history, the bucket and Higgsfield's job records all still carry them.
| New | Was | Date |
|---|---|---|
| `morning-scene-01` | `morning-open-01` | 21 Aug 09:59 |
| `morning-scene-02` | `morning-open-02` | 21 Aug 09:59 |
| `morning-scene-03` | `morning-open-03-beat` | 21 Aug 10:21 |
| `morning-scene-04` | `morning-open-04-kick` | 21 Aug 10:21 |
| `morning-scene-05` | `morning-open-05-buzz` | 21 Aug 10:21 |
| `morning-scene-06` | `morning-open-06-m0203` | 25 Aug 11:13 |
| `morning-scene-07` | `morning-open-07-m04` | 26 Aug 11:48 |
| `morning-scene-08` | `m04-m05-01` | 26 Aug 12:25 |
| `morning-scene-09` | `m04-m05-02-full` | 26 Aug 12:25 |
| `morning-scene-10` | `m04-m05-03-7s` | 26 Aug 12:32 |
| `morning-scene-11` | `m04-m05-04-7s-full` | 26 Aug 12:32 |
| `morning-scene-12` | `m04-m05-05-extend-m0508` | 26 Aug 12:45 |
| `morning-scene-13` | `m04-m05-06-extend-m0509` | 26 Aug 12:45 |
| `morning-scene-14` | `morning-open-08-m04-full` | 26 Aug 12:55 |
The order is by date, so it is not the order the cuts make sense in. `-14` is the fullest assembly and the newest — black through M-05 — but it sorts last because it was rebuilt minutes after the two-shot joins; its twin `-07` sits seven places away. The suffixes are gone, so the filename no longer says what a cut is: `-03`, `-04` and `-05` were `beat`, `kick` and `buzz`, `-06` was the `M-02-03` variant, and `-12`/`-13` are the two Extend joins. What each one is now lives here and nowhere else.
Three files in `refs/cuts/` were deliberately left out of the rename: `m04-m05-07-trim-m04tail`, `m04-m05-08-trim-m05head` and `m04-m05-09-audiotrim-m04tail`, all written at 13:01 on 26 Aug **by a parallel session, while the rename was being prepared**. They are not in the table above and they keep the old family name. Renaming files another session is still working on is how the two sessions clobber each other; fold them in when that work has landed.
The five `refs/cuts/morning-scene-*` files were assembled on 21 August and nothing recorded how. No ledger entry (they are local assemblies, so `provenance.py sync` matches no job and the gallery correctly says *no record*), no note here, no thread. Asked on 25 Aug for another cut like `morning-scene-02` but on `M-02-03`, the recipe had to be recovered from the files themselves. It is written down here so nobody measures it twice.
`morning-scene-02` is:
| From | To | What |
|---|---|---|
| 0.000 | 1.500 | black, 1280×720 — the title-card slot the sheet says is made in the edit |
| 1.500 | 6.542 | `M-01-20`, whole take, its location sound unused |
| 6.542 | 14.583 | `M-02-02`, whole take (the M-02 takes carry no audio at all) |
| 14.583 | 18.625 | `M-03-09`, whole take, its own location sound at +15 dB |
Nothing is trimmed: each take runs its full generated length, handles and all, so the cut lengths in the sheet's Cut column are not what plays here. Under all of it, `refs/music/runner-motif.m4a` from 0:00 at unity, **stopping dead at 14.583** — the sheet's "motif stops dead on the cut", done literally. Output is h264 1280×720/24, CRF 17, AAC 192k/48k stereo, 18.625 s.
`-01` and `-02` are the same picture. The only difference in the pair is that M-03's room tone plays at unity in `-01` and at +15 dB in `-02`: with the motif gone and the footfall bridge cut (19 Aug), the last four seconds are the only sound in the film's first twenty, and at the take's own level they are nearly silent. `-03-beat`, `-04-kick` and `-05-buzz` share `-02`'s audio exactly and differ from it only in picture, across M-01 and M-02 alone — a treatment on the two runner shots, not a different edit.
How it was checked, since guessing was not an option. The music was found by FFT cross-correlation against all twelve cues in `refs/music/` (`runner-motif.m4a` at lag 0, and it fits better than the near-identical 21 Aug `runner-motif-03`); the per-source gains by least squares in half-second windows, which is what showed M-01's audio sitting at 0.00 and M-03's at 5.60 ≈ +15 dB. The recipe was then re-run to rebuild `morning-scene-02` from scratch: **47.9 dB PSNR on picture and −75 dB residual on audio** against the original, i.e. identical bar the re-encode. Free — ffmpeg and arithmetic, no credits.
`morning-scene-06` (25 Aug 2026) is that recipe with `M-02-03` in the gate slot and everything else held: Mabel's runner-up at the 19 Aug approval, put through the same eighteen seconds so it can be judged in the cut rather than as a lone clip in the gallery.
`morning-scene-07` and `-08-m04-full` (26 Aug 2026) run the recipe on and add a fifth slot: the approved `M-04-26` after M-03, its own location sound at unity, nothing else touched. **`-08` then took a sixth slot the same day — the approved `M-05-09`** after M-04, own bed at unity — so it is no longer `-07`'s twin: the two now differ in M-04's head trim and in whether M-05 is there at all. `-07` is 22.667 s and `-08` is 30.666 s. Extending `-07` to match is one command if the trim is still a live question. **They are also the first assemblies to carry the approved `M-03-11`** rather than the superseded `M-03-09` that `-01`…`-06` were built on (swapped in the same day, at Mabel's direction) — a drop-in, because 11 is the same 97 frames and 4.042 s as 09 and its bed sits 1.1 dB quieter, so no timing anywhere in the cut moved. The pair differ in **one number, the head trim on M-04* — `-07` drops the first second (Mabel: "probably cut the first second of m04"*), `-08` plays the take whole — so the trim can be judged in the cut rather than argued from stills. `-07` is 22.667 s, `-08` 23.667 s.
| From | To | What |
|---|---|---|
| 0.000 | 14.583 | as `morning-scene-01`: black, `M-01-20`, `M-02-02`, motif at unity |
| 14.583 | 18.625 | `M-03-11`, whole take, its own location sound at unity |
| 18.625 | 22.667 | `M-04-26` from 1.000, its own location sound at unity (`-08`: from 0.000, to 23.667) |
| 23.667 | 30.667 | `-08` only — the approved `M-05-09`, whole, its own location sound at unity |
Rebuilt from the sources rather than re-encoded from `morning-scene-01`, so the finished cut carries one encode generation and not two: 59.5 dB PSNR on picture over the shared fourteen and a half seconds, and the music bed cancels bit-exact (−120 dB) from 0 to 14.583 — the recipe above reproduces, and re-deriving it is no longer necessary. Checked at the seams: the M-03 slot matches `M-03-11` at 47.0 dB and `M-03-09` at 12.8 dB, so the swap is in the picture and not just in the filename. (Against `morning-scene-01`'s own M-03 bed the earlier `M-03-09` build sat at lag 0.4 ms and gain 0.977 — unity where the recipe says unity — and would not null past −13 dB, because at −38 dBFS the two resampler paths differ. A measurement artefact, not a second take.) Free: ffmpeg and arithmetic, no credits.
**Three things the measurement turned up about `M-04-26`, all of which bear on the trim.**
1. There are no handles to spend. The sheet asks M-04 for **6 s cut out of 8 s generated**; the approved take is the free 5 s Unlimited roll and runs 5.042 s, already a second under its cut. Trimming a second off the head leaves 4.042 s — two seconds under. The trim is not being paid for out of surplus, because there is none. 2. The head is not defective. Frame-average luma is flat from frame 0 (89.2 → 87.4 → 89.2 across the first second, no settle and no flash), so there is nothing at the head to remove. What the first second holds is the room before the boy is in it: at frame 0 the Apprentice is off the right edge and only the ream's leading corner shows; his head clears frame at ~0.5 s and he is large in the right foreground by 1.0 s. Cutting it is a staging choice — cut to the room, or cut to the cross — not a repair. 3. Both German lines land late, so the trim costs no dialogue. Measured on the envelope and confirmed by band energy: „Papier!" runs ~3.45–4.05 s and „Kommt schon!" ~4.20–4.75 s, both mid-band dominant against a quiet sub-250 Hz floor. What follows at **~4.85 s is not speech but the thump of the ream going down — low and mid together — and the audio stream ends at 4.960 s against 5.042 s of picture**, so the thump is cut off by the end of the take and the last two frames carry no sound at all. If anything at M-04 wants trimming on evidence it is that tail, not the head.
And a level step at the join, which is a decision waiting to be made. Both beds play at unity as the recipe says, but the takes are not matched: M-03-11 sits at −39.1 dBFS and M-04-26 at −29.0, so the shop arrives **10.1 dB louder** than the insert before it. Going wide into a working room that gets louder is arguably right and it is left alone here. But it does not compose with `morning-scene-02`: put M-03 at +15 dB, as `-02` does to rescue a bed that is nearly silent at unity, and M-04 then lands about 5 dB quieter than the insert it follows, which is backwards. The two gains are one question, not two, and whichever way M-03 goes M-04's has to move with it.
`morning-scene-08` and `-02-full` are the two shots alone — no title card, no runner, no motif — so the join between them can be looked at without eighteen seconds of lead-in. `-01` runs the approved `M-04-26` from 1.000 s, `-02-full` plays it whole; both are followed by `M-05-06` entire, each take's own location sound at unity and no music, since the interiors are unscored and the motif has already stopped at M-03. 9.083 s and 10.083 s. Free: ffmpeg, no credits.
`M-05-06` is new and it is a different idea of the shot — Higgsfield job `5c681b06`, `seedance_2_5`, 5 s at 720p, rolled 11:54 on 26 Aug and pulled down from the history rather than generated here. Its prompt opens *"Continue this exact frame: same room, same three men, same light, same grade"* and works from a single image input that is a late M-04 frame, so this is not the sheet's M-05 at all. **The sheet has M-05 open on the empty counting desk and watch the Old Printer walk into it; `M-05-06` instead holds M-04's own wide and dollies in** — past the long oak table, settling to a medium on the man and the open book — with him already at the desk and never walking, Lufft still inking and the boy still at the table behind him, both going soft as the camera settles. The walk that M-16's cutting moved into M-05 is simply not in it.
What that buys, and it is the thing to judge. The join stops being a cut between two set-ups and becomes a match cut into a push-in: M-05-06's first frame against M-04-26's last is the same room, same three men, same light, off only by a slight reframe and the boy's hands moving on the ream (13.6 dB PSNR frame to frame — low as a number, but that number is measuring a small pose and framing offset, not a different picture). It also answers the join M-16 was invented to fix, by a third route: nobody teleports because nobody travels.
What it costs: the Old Printer's arrival is gone, and with it the hand continuity the sheet asks for across M-04/M-05 — ink-worked at the press, wiped down the apron as he comes, on the book when he arrives. He wipes the hand here, but at the desk, having never left it. **This take is not yet approved and the sheet's M-05 row still describes the walk-in.** If this is the shot, that row and the `M-16` reasoning above both need rewriting; if it is not, it is a clean alternative that cost nothing to look at.
A note in its favour on sound. Both beds run at unity and the take is 4.5 dB quieter than M-04 (−33.6 against −29.1 dBFS), so the room thins as the camera comes in — which is the sheet's *"the room going quiet a beat before the ledger does", arrived at by accident rather than by a mix. *The same tail defect as M-04 is here too**: audio ends at 4.960 s against 5.042 s of picture, so the last two frames of each shot are silent.
The 7 s re-roll landed, and it is the one that finishes the beat. Job `a1cffb83`, the identical prompt at 7 s instead of 5, downloaded as `M-05-07`; `morning-scene-10` and `-04-7s-full` are M-04-26 against it, built exactly as the pair above. 11.083 s and 12.083 s.
Two extra seconds change what the shot is. At 5 s the dolly settles into a medium and stops — `M-05-06` never reaches the book, so the finger down the column and the closing are still at middle distance and the take runs out before the beat lands. At 7 s the move carries all the way in: the account book fills the frame, the entries are seen to **stop partway down the page with empty ruled space below them** — the short columns, which is the whole economic point of the shot and the reason the offer happens — and the hand comes across and shuts the book inside the take. The sheet's *"Short columns. He closes it."* is on screen in the 7 s and is not in the 5 s.
**Checked against the hard rule, because this is the closest any shot has come to the ledger.** At the tightest frames the book is hand-ruled with entries in a fast brown chancery hand and nothing in it is legible — no figures, and no 400. `shop-day-26`'s hand-filled book is doing its job; the machine-regular printed form that `shop-day-19` carried would have been a different answer at this size.
Numbers. Both slots verify frame-exact at 46.4 and 46.1 dB, one encode generation. The join is the same match cut as the 5 s — same start image, so M-04's last frame against M-05-07's first sits at 15.3 dB, a reframe and the boy's hands, not a different picture. Sound is unchanged in kind: own beds at unity, M-05 4.8 dB under M-04 (−33.9 against −29.1), the room thinning as the camera comes in. Same tail defect in both takes — audio ends at 6.976 s against 7.042 s of picture.
And the trimmed version now matches the sheet exactly. `morning-scene-10` runs 11.083 s against the sheet's M-04 6 s + M-05 5 s = 11 s. That is a coincidence of two takes and a one-second trim rather than anything planned, but it means the pair can be judged at something very close to its intended length for the first time.
Then the shot changed method: Seedance 2.5 Extend (26 Aug 2026). Jobs `149f61d7` (12:28) and `adadc9a2` (12:36) — `M-05-08` and `M-05-09` — are 7 s at 720p on the revised 2,126-character prompt, and they are not image-to-video at all. Their params carry `model: video_extension`, `extension_mode: forward`, and two inputs: the start still *and the video `21a3ec1f`, which is M-04-26's own job*. They are forward extensions of the approved M-04. `morning-scene-12` and `-06-extend-m0509` are M-04-26 from 1.000 s against each, 11.042 s — the sheet's 11 s, near enough.
The measurement says Extend is doing what it claims. M-04's last frame against the M-05 first frame:
| Take | Method | Join |
|---|---|---|
| `M-05-06` (5 s) | image → video | 13.6 dB |
| `M-05-07` (7 s) | image → video | 15.3 dB |
| `M-05-08` (7 s) | extend, forward | 30.0 dB |
| `M-05-09` (7 s) | extend, forward | 30.7 dB |
Twice the fidelity. The image-only takes were a match cut — same room, same light, but a visible reframe and the boy's hands jumping. The extends are continuous: the extension picks up M-04's own last frame rather than re-deriving the scene from a still, so there is no jump to hide and no duplicated frame at the seam either. `M-05-08` and `M-05-09` are distinct rolls (16.9 dB apart), not one job downloaded twice.
Both slots verify frame-exact at 46.5 dB (M-04) and 45.5 / 45.9 dB (M-05), one encode generation. Beds at unity as before; the extends sit at −33.4 and −34.6 dBFS against M-04's −29.1, so the room still thins into the ledger. And these two run a clean 7.000 s / 168 frames with no short-audio tail — the two silent frames that end M-04-26, `M-05-06` and `M-05-07` are not here.
One thing to watch in the revised prompt, checked rather than assumed. It drops "nothing in it legible at this distance" and puts *"Handwriting throughout, nothing printed" in its place — so *the legibility guard is gone from the wording**, on the shot that pushes closest to the ledger of anything in the film. Inspected frame by frame at the tightest approach in both takes: hand-ruled columns, faint brown chancery entries, **nothing legible and no figure on screen**, and the entries visibly stop partway down the page with empty ruled space below. The rule holds here by luck of the model and `shop-day-26`'s hand-filled book, not by instruction. **If this prompt is rolled again, put the legibility line back** — the 400 must not reach the screen before the final shot, and this is the shot with the least margin.
The history was then swept for anything not on disk (26 Aug 2026). Of 100 video jobs Higgsfield still remembers, 98 completed with a result and **95 were already here**; the three that were not are now down, and they were never downloaded rather than culled — each follows on cleanly at the end of its shot's numbering:
| Take | Job | ||
|---|---|---|---|
| `M-04-32` | `5cfc48c0` | 5 s | the 10:46 roll, the one a thread was tracking when it closed |
| `M-04-33` | `8dc6e7c6` | 5 s | 11:30 |
| `M-05-10` | `1e40c5c7` | 6 s | 12:41, the fourth wording |
`M-05-10` is the fourth wording and it is back to image-to-video — 2,137 characters, no code fences, `model: default` and no `extension_mode`. So it joins M-04 the weak way, 15.7 dB against the extends' 30, but it **does finish the beat**: at its last frame the book is shut with the hand resting on the cover, which the 5 s `M-05-06` never reached. Six seconds is evidently enough for the move; the method, not the length, is what the join turns on.
Nothing else in the window is missing, and every local assembly correctly has no ledger entry, being made here rather than by a job.
APPROVED: `M-05-09`, 26 Aug 2026 (Mabel: "i think m0509 is the keeper") — job `adadc9a2`, `seedance_2_5` `video_extension` forward from `M-04-26`, 7 s at 720p, recorded in `assets.json` as `approved/M-05/M-05-09-f97b69d6.mp4`. **The first approved take in the film that was extended rather than generated**, and the method is the reason it won: the four image-to-video attempts all had to re-derive the room from a picture of M-04's last frame and all landed a match cut, 13.6–15.7 dB; the extension continues M-04's own frames and lands 30.7 dB. Beaten: `M-05-08` (same spec, eight minutes earlier), `M-05-07` and `M-05-06`, `M-05-10`, and the 19 Aug `M-05-04`/`-05`.
Two knock-ons the sheet now carries. Its Gen is 7 s, not 8 — the extension was rolled at 7 s, so the cut of 5 s has 2 s of handles rather than 3. And the references column is no longer describing a still: regenerating this shot means passing `M-04-26`'s own job `21a3ec1f` as a video input with `extension_mode: forward`, not uploading its last frame as a start image. Those are different calls that produce measurably different joins, and the row said the wrong one until today.
What this settles about M-16, finally. The walk to the ledger has now been answered three ways: a separate shot (M-16, cut 25 Aug), a longer M-05 that opens on the empty desk and watches him arrive (the 25 Aug staging), and this — he is simply already there, and the camera moves instead of the man. The approved M-04 walks him to the desk inside its own five seconds and ends with him standing at it, so any arrival in M-05 played the beat twice. The film loses the apron-wipe-on-the-way that M-16 was carrying; it keeps the wipe, but at the desk.
**`morning-scene-14` now carries it, and the sound arc arrives by itself.** Rebuilt from sources as before — the first 23.667 s reproduce the existing file at 57.7 dB and the M-05 slot matches its take at 45.8 dB, one encode generation throughout. M-05-09 has to follow M-04 whole, not trimmed: it is a forward extension of `M-04-26` in its entirety, so the tail of M-04 is the head of M-05 and cannot be cut. That is why `-08` is the variant it went into and `-07` is not. Every bed still plays at unity, and at unity the three interiors land at −39.1, −29.8, −35.4 dBFS — the insert nearly silent, the shop coming up hard when the film finally goes wide, then thinning again as the camera pushes into the ledger. That is the shape the sheet asks for in prose, with no gain written anywhere; the open question above about M-03's level is unchanged, and now has a third shot to stay consistent with.
Putting the Old Printer at the near press in M-04 broke the join into M-05: he is at the tympan in one shot and at the counting desk in the next, and the cut teleports him. The fix, that morning, was a shot of its own — **M-16, "He leaves the press"**, 4s cut against 6s generated, playing 5th between M-04 and M-05 (Mabel: *"if we have old printer at the press we need to have a shot of him walking over to the ledger otherwise they don't blend well"*).
It was cut the same afternoon, before anything was rolled: "delete m16", "m05 can watch him get up". The join is real and the answer stands; the answer is a longer M-05 rather than a fifteenth shot. M-05 now opens on the empty desk and he walks into it, which does the same work with one clip instead of two and no cut in the middle of a man crossing a room. What M-16 was carrying moved with it: the arrival, the hands wiped down the apron on the way, and the sound cue — with one man left on it the press cannot pull, so the pull drops out of the rhythm and only the beater's dabbing is left, the room going quiet a beat before the ledger does.
Cost of the round trip: nothing. No take of M-16 was ever generated and no sheet with it in was ever committed; the morning goes back to **14 shots, 76s cut against 113s generated**, ~735 credits for one take of everything at 720p. M-05's own numbers are unchanged at 5s/8s — the arrival is bought out of handles that already existed, which is why the row now says the walk is written short, he enters a pace or two out rather than crossing the room, and the cut goes to 6s only if a measured take says it must.
The ID is free, unlike M-06. M-06 is retired because it was published and referenced: takes, notes and a cut slot all point at the market beat. M-16 never left this session, and `PLAN.md` had already spoken for the number — the closing title/rooftop shot is written there as *"gets a row on `shots-morning.md` (M-16)"*. It goes back to that.
Mabel, on `morning-scene-13`: *"there's two beats when i put them together and i would like there to only be one."* She is right, and it is not a mix problem — the ream landing is in the cut twice, because the method that bought the continuous seam also bought a second copy of the sound.
What is actually on the audio, measured on `morning-scene-13` at 32 kHz on a 10 ms/20 ms envelope:
| thump 1 | onset 3.845 s, peak −16.8 dBFS, chopped off dead at 3.955 s |
|---|---|
| gap | 3.960 → 4.035 s of digital silence (−99 dB, and −104.8 at 4.020) |
| thump 2 | onset 4.040 s, peak −19.8 dBFS, full decay to the room floor by ~4.25 s |
Two attacks 170 ms apart with a hole punched between them. That spacing is far outside the ~30–50 ms window in which two transients fuse into one, so it reads as a beat and its slap-back rather than as one event.
Two separate defects made it, and both were already written down here. (1) `M-05-09` is a forward extension of `M-04-26`, so the model saw the ream coming down in the frames it was handed and rendered the thump again — the same mechanism that puts the seam at 30.7 dB puts the sound in twice. (2) `M-04-26`'s audio stream ends at 4.960 s against 5.042 s of picture, the short-audio tail noted above, and that 82 ms is the silence in the middle. The earlier note guessed right — *"if anything at M-04 wants trimming on evidence it is that tail, not the head"* — but the reason is the double, not the truncation.
Three candidates were built and all three leave exactly one attack. Free: ffmpeg and arithmetic, no credits.
| Cut | What it does | Seam | Length |
|---|---|---|---|
| `morning-scene-15` | 5 frames (0.2083 s) off the end of M-04, landing just before its half-thump; M-05's intact thump is the beat | 22.7 dB | 10.833 s |
| `morning-scene-16` | 5 frames off the start of M-05, past its thump; M-04's truncated thump is the beat | 23.3 dB | 10.833 s |
| `morning-scene-17` | no picture touched — M-04's audio faded out at 3.795 s over 50 ms, the 0.247 s hole patched with M-04's own room tone | 30.7 dB | 11.042 s |
`morning-scene-17` is the pick (Mabel, 26 Aug 2026: "this is great"), and the measurement says why the other two were never really in it. **Both picture trims cost the seam**: 30.7 dB falls to 22.7 and 23.3, which is most of what the Extend method was adopted to buy — for comparison the image-to-video takes it replaced joined at 13.6–15.7 dB, so a trimmed extend lands between the two methods rather than at the top of one. `-17` keeps the seam bit-exact: its picture against `morning-scene-13` is `psnr = inf`, identical frame for frame, so the only thing that changed is the sound.
The surviving beat is the good one. `-16` keeps M-04's copy, which is truncated mid-decay at −26 dB into an 80 ms hole; `-15` and `-17` keep M-05's, which has attack and full decay. Keeping the intact copy is the whole reason to trim at M-04's end rather than M-05's start.
The room-tone patch, because a fade alone left a dropout. Fading M-04's bed out at 3.795 s removes the half-thump but also the bed, and the first build sat in digital silence from 3.84 to 4.03 before the thump — a 200 ms hole where the shop should be. It is filled from **M-04-26's own quietest window, 2.690 s, at −46.1 dBFS**, found by scanning the take on a 0.30 s RMS window; the level matches the −40…−47 dB the bed runs at either side of the join, so nothing steps. The tail now runs continuously at −45…−49 dB into the thump.
The recipe, `M-04-26` from 1.000 s against `M-05-09` whole, both beds at unity, h264 1280×720/24 CRF 17 and AAC 192k/48k as everywhere else:
``` [0:a]atrim=1.0:5.041667,asetpts=PTS-STARTPTS,aresample=48000, aformat=channel_layouts=stereo, afade=t=out:st=3.795:d=0.050,apad=whole_dur=4.041667[a0m]; [0:a]atrim=2.690:2.9367,asetpts=PTS-STARTPTS,aresample=48000, aformat=channel_layouts=stereo, afade=t=in:st=0:d=0.050,afade=t=out:st=0.2367:d=0.010, adelay=3795|3795[tone]; [a0m][tone]amix=inputs=2:duration=first:normalize=0[a0]; ```
What this means for anything else built on an Extend. The duplicate is a property of the method, not of these two takes: any forward extension will re-render whatever sound its input frames were in the middle of. **Assume the event at the seam is in the cut twice and measure it**, and prefer losing the upstream shot's copy — it is the one the short-audio tail truncates — in the audio rather than in the picture, because the picture is what Extend was for.
The section above diagnoses and fixes it on `morning-scene-13`. **The defect is not particular to that cut* — it is in every* assembly that joins `M-04-26` to a forward extension of it, because both causes are properties of the pair rather than of any one build. Measured across the series on a 5 ms peak envelope:
| Cut | Upstream thump | Digital silence | State |
|---|---|---|---|
| `morning-scene-12` | −4.4 dBFS at 3.885 s | 85 ms, 3.965 → 4.050 s | carries it, unfixed |
| `morning-scene-13` | −4.4 dBFS at 3.885 s | 85 ms | fixed by `-17` |
| `morning-scene-14` | −4.5 dBFS at 23.510 s | 60 ms, 23.615 → 23.675 s | carries it; superseded by `-18`/`-19` |
| `morning-scene-17` | gone — bed fades to room tone | 5 ms | clean, one attack |
Verified independently on `-13` and `-17` before this was written: `-13` has an attack peaking −4.4 dBFS at 3.885 s, cut off mid-decay, then **80 ms at −180 dB — true digital zero, not a low floor** — then the second attack at 4.055 s. In `-17` the first attack is absent and the bed runs continuously at −36 to −43 dB across the same window into a single thump. The fix does what it says. (The peak figures here read hotter than the −16.8/−19.8 dBFS in the table above only because that table measures on a 10/20 ms window and this one on 5 ms peak; same events.)
`morning-scene-12` is the one left carrying it, and it is deliberately left alone rather than repaired: it is the Extend join built on `M-05-08`, the take that lost to `M-05-09` on 26 Aug, so repairing a rejected alternative would add a file without adding a decision. It is recorded here so that nobody plays it later, hears the double, and re-derives a diagnosis that is already written down. If `M-05-08` is ever revisited, `-12` needs `-17`'s treatment first.
The general rule, which is the part worth carrying forward. A forward video extension re-renders whatever its input frames were in the middle of, sound included — so assume the event at the seam is in the cut twice, measure it, and remove the upstream copy in the audio only. Never in the picture: the two picture trims cost 30.7 dB of seam fidelity down to 22.7 and 23.3, which is most of what the extension was adopted to buy. The upstream copy is also the one the short-audio tail truncates, so it is the worse of the two anyway.
`morning-scene-14` — the full assembly, black through M-05 — carries the doubled beat, because it joins `M-04-26` to `M-05-09` exactly as `-13` does. Mabel: *"take morning scene 14 and substitute [the fixed join] instead of clips m04 and m05."* Two builds, because the substitution turns out to change two things and only one of them was asked for.
Both are `morning-scene-14`'s recipe, rebuilt from the sources rather than re-encoded from `-14`, so they carry one encode generation and not two:
| From | To | What |
|---|---|---|
| 0.000 | 1.500 | black, 1280×720 |
| 1.500 | 6.542 | `M-01-20`, whole, its location sound unused |
| 6.542 | 14.583 | `M-02-02`, whole (carries no audio at all) |
| 14.583 | 18.625 | `M-03-11`, whole, own bed at unity |
| 18.625 | 23.667 | `M-04-26`, whole, own bed at unity, tail repaired (`-19`: from 1.000, to 22.667) |
| 23.667 | 30.667 | `M-05-09`, whole, own bed at unity (`-19`: 22.667 → 29.667) |
Under the first fourteen and a half seconds, `refs/music/runner-motif.m4a` from 0:00 at unity, stopping dead at 14.583. The M-04 repair is `morning-scene-17`'s, moved to the slot's own timebase: bed faded out at source 4.795 s over 50 ms, the 0.247 s hole patched with `M-04-26`'s room tone from 2.690 s. h264 1280×720/24 CRF 17, AAC 192k/48k. Free: ffmpeg, no credits.
The one number that separates them is M-04's head. `-14` plays `M-04-26` whole and `morning-scene-17` plays it from 1.000 s, so substituting `-17` wholesale drops the beat and applies the one-second head trim — a separate question, the one `-07` and `-14` were built as a pair to settle, and not what was asked for. So: `-18` is `-14` with only the beat fixed (30.667 s, M-04 whole), and `-19` is the literal substitution (29.667 s, head trim included). `-18` is the like-for-like replacement for `-14`; `-19` is `-18` if the trim wins.
Verified. `-18`'s picture against `-14` is `psnr = inf` — bit-identical across all 736 frames, so nothing but the sound moved. At the join, `-14` has an attack at 23.480 s peaking −17.3 dBFS, then 60–80 ms of digital silence, then a second at 23.680 s peaking −19.6; `-18` runs its bed continuously at −45…−50 dB through that window into a single thump at 23.680 s, −19.6. `-19` is the same one beat at 22.680 s. The 10 ms tone-patch fade meets the slot boundary one envelope frame early, reading −62 dB immediately before a −19.6 dB thump — masked, and not worth a re-render.
Mabel, on `morning-scene-18`: *"i like morning scene 18 better. now add the chicken clip… with the runner motif and stuff. idk how you want to add the chicken noise, you can try it multiple ways."* So: `-18`'s recipe — M-04 whole, the doubled beat repaired — with `M-09-04` appended as the sixth shot, in the slot the cut M-06 left, and the motif snapping back in on the cut.
The assembly, four builds sharing one picture and differing only in the mix:
| From | To | What |
|---|---|---|
| 0.000 | 1.500 | black, 1280×720 |
| 1.500 | 6.542 | `M-01-20`, whole, location sound unused |
| 6.542 | 14.583 | `M-02-02`, whole (carries no audio) |
| 14.583 | 18.625 | `M-03-11`, whole, own bed at unity |
| 18.625 | 23.667 | `M-04-26`, whole, own bed at unity, tail repaired as `-17` |
| 23.667 | 30.667 | `M-05-09`, whole, own bed at unity, tail patched |
| 30.667 | 36.708 | `M-09-04`, whole, own hens bed — level per variant |
36.708 s. Music: `runner-motif.m4a` from 0:00 at unity, stopping dead at 14.583 as always — then resuming at cue time 14.583 on the M-09 cut, so the cue continues its own phrase rather than restarting. That is *"picking up where M-02 left it"* read literally, and it is what the sheet asks for. The cue is 26.230 s long, so the 6.042 s the alley needs comes out of it with room to spare. Picture against `-18` over the shared 30.667 s: 60.8 dB, one encode generation, in line with the 59.5 dB the recipe reproduced at before.
A second short-audio tail was patched on the way. `M-05-09`'s audio ends at 6.912 s against 7.000 s of picture. Unlike M-04's, nothing is truncated — the ledger thump lands at 6.57 s and has fully decayed by 6.75 s, so the missing 88 ms is only room tone — but it is the same digital-silence hole, now sitting directly under the motif's re-entry. Filled from the take's own adjacent tone (6.780–6.870, 8 ms fades). The assembly now has no digital silence anywhere.
The mix problem, which is the real content of this entry. The sheet says "the hens are the event". They are not, at unity, and the numbers say why:
| mean | peak | |
|---|---|---|
| motif over the M-09 slot | −12.4 dBFS | −0.4 |
| hens over their scatter (1.30–3.30 s) | −22.3 dBFS | −5.6 |
The hens are 9.9 dB under the music at their loudest and ~14 dB under either side of it, so at unity the scatter is buried.
Two levers: lift the hens, or duck the music. `morning-scene-21` lifts the hens +6 dB; `-22` and `-23` duck the motif instead, as `sidechaincompress` keyed off the hens themselves, so the duck follows the take if M-09 is ever re-rolled rather than hard-coding a window.
Correction, and it matters for how this table is read (26 Aug 2026). This
entry first called `-21` "a null result" and said *"lifting them does not
work… getting the music out of the way is the only lever,"* on the grounds
that +6 dB on the hens moves the summed level of the mix by only 0.6 dB.
That is the wrong instrument and the conclusion drawn from it was wrong.
The summed RMS is dominated by the motif's energy, so it is nearly insensitive
to what a quieter, spectrally distinct transient is doing — it cannot answer
"do the hens read." Measured properly, by nulling `-21` against `-20` to
isolate what the lift adds, the difference is **a full copy of the hens at
unity: mean −22.8 dBFS over the scatter, peak −6.1**, against the
hens' own −22.3 / −5.6. The lift lands in full — the birds are twice as loud —
and it costs nothing, because the mix peak stays at −0.2 dBFS, unchanged
from `-20`: the hens' transients do not fall on the motif's peaks. **Read the
scatter column below as a measure of the music, not of the hens.**
| Cut | Mix | pre-cut | scatter | after | peak |
|---|---|---|---|---|---|
| `morning-scene-20` | both at unity | −12.5 | −12.2 | −12.5 | −0.2 |
| `morning-scene-21` | hens +6 dB — the pick | −12.4 | −11.6 | −12.4 | −0.2 |
| `morning-scene-22` | duck, `threshold=0.05:ratio=4:attack=15:release=350` | −12.7 | −17.1 | −13.0 | −0.2 |
| `morning-scene-23` | duck, `threshold=0.025:ratio=9:attack=12:release=420` | −13.9 | −20.6 | −14.5 | −0.2 |
`-22` ducks 4.4 dB — the hens read but stay subordinate. `-23` ducks 6.7 dB against its own surroundings and puts the music at −20.6 against the hens' −22.3, i.e. level, which is the sheet's "the hens are the event" actually delivered. `-23`'s music also sits ~1.3 dB down either side of the scatter, because the quieter clatter triggers the compressor too; that reads as the cue breathing around the birds rather than as a fault, but it is a real difference from `-20` and not just a scatter-window effect.
`morning-scene-21` is the pick (Mabel, 26 Aug 2026: "no i like 21") — the lift, not the duck. The motif stays exactly as it is everywhere else in the film, at unity and untouched, and the hens come up to meet it; nothing in the cue moves, pumps or breathes, which is what both duck variants trade away for their clearer scatter. It is also the least machinery: one gain figure on one take, against a compressor with four parameters that has to be re-justified every time the take changes. `-22` and `-23` stay in the gallery as the alternatives it beat. There is headroom for more if it is ever wanted — the mix peak is unchanged at −0.2 dBFS at +6 — but past roughly +8 the hens' own peak of −5.6 starts to reach full scale on its own, so a further lift wants a limiter rather than a bigger number. Free: ffmpeg, no credits.
Mabel: *"take clip morning scene 21 and swap out that chicken part with the new approved chicken clip… everything else stays the same… keep the same naming pattern." So: *`morning-scene-24` is `morning-scene-21` with `M-09-04` replaced by `M-09-13`** in the sixth slot, and nothing else touched — same six shots, same beat repair, same two tail patches, same motif placement, same +6 dB on the hens. `M-09-13` was approved earlier this morning (`assets.json`, 27 Aug: "Mabel's call, replacing M-09-04" — the alley re-rolled with the skittering pebble deleted from the prompt).
The assembly, unchanged from `-21` except the last row:
| From | To | What |
|---|---|---|
| 0.000 | 1.500 | black, 1280×720 |
| 1.500 | 6.542 | `M-01-20`, whole, location sound unused |
| 6.542 | 14.583 | `M-02-02`, whole (carries no audio) |
| 14.583 | 18.625 | `M-03-11`, whole, own bed at unity |
| 18.625 | 23.667 | `M-04-26`, whole, own bed at unity, tail repaired as `-17` |
| 23.667 | 30.667 | `M-05-09`, whole, own bed at unity, tail patched |
| 30.667 | 36.708 | `M-09-13`, whole, own hens bed +6 dB |
36.708 s, the same length to the frame: the new take's picture is 6.041667 s, exactly `M-09-04`'s. Music as always — `runner-motif.m4a` from 0:00 at unity, stopping dead at 14.583, resuming at cue time 14.583 on the M-09 cut. h264 1280×720/24 CRF 17, AAC 192k/48k. Free: ffmpeg, no credits.
**The recipe was reconstructed from this page and checked against `-21` before the swap was made**, because no build script is kept in the repo. Rebuilding `-21` from its sources with the reconstruction and nulling the two against each other gives exactly zero — sample-for-sample silence — across the music (2–14.5 s) and the beds (15–30.6 s). One defect was found and fixed on the way: the motif's resume was being placed with `adelay` in milliseconds, landing it 32 samples early at 30.666 s instead of 30.666667. In samples (`adelay=1472000S`) the head nulls dead. Worth knowing for the next rebuild: **the slot boundaries are not whole milliseconds, so delays have to be given in samples.**
What actually moved. `-24`'s audio is **bit-identical to `-21`'s for the first 1,470,912 samples — 30.644 s**, and the first difference is the single AAC frame straddling the cut (1,088 samples, residual −43 dB against a mix at −12). Everything before the alley is literally the same file.
The picture head is a fresh encode, not carried over. `-24` against `-21` over the shared 30.667 s is 46.8 dB, not `inf`: the encoder settings that produced `-21` could not be recovered exactly, so its frames were re-encoded from the same takes rather than copied. This costs nothing measurable — each cut is one generation off the takes and they sit level against them: over the M-03 slot, `-21` is 47.03 dB against `M-03-11` and `-24` is 46.98 dB. Same fidelity, different bits. (Do not read this against the 60.8 dB `-20` scored against `-18`; those two shared an encode, these two do not.)
The new take's hens are marginally quieter and run half a second longer.
| own RMS, whole | own peak | scatter window | scatter RMS | |
|---|---|---|---|---|
| `M-09-04` | −26.58 | −5.61 | 1.30–3.30 s | −22.29 |
| `M-09-13` | −26.96 | −6.44 | 1.30–3.75 s | −22.85 (−23.25 over 1.30–3.75) |
0.4 dB down in level and 0.8 dB down in peak — inaudible — but the birds stay in the mix 0.45 s longer, which matches the approval note's *"the hens scatter out of frame, one over the lens at ~3.5 s."*
The mix lands where `-21` landed. Measured on the same windows as the table above, slot-relative:
| Cut | pre-scatter 0–1.30 | scatter 1.30–3.30 | after 3.30–6.04 | whole-mix peak |
|---|---|---|---|---|
| `morning-scene-20` (`M-09-04`, unity) | −12.46 | −12.18 | −12.49 | −0.2 |
| `morning-scene-21` (`M-09-04`, +6 dB) | −12.44 | −11.59 | −12.43 | −0.15 |
| `morning-scene-24` (`M-09-13`, +6 dB) | −12.41 | −11.54 | −12.50 | −0.15 |
Within 0.06 dB of `-21` in every column. **The lift lands in full on the new take too**, measured the way the correction above insists on — by nulling `-24` against an otherwise identical unity build (scratch only, not a cut) to isolate what the +6 dB adds: −23.58 dBFS mean, −8.25 peak over 1.30–3.75, against the take's own −23.25 / −6.44 at unity. A full second copy of the hens, as with `-21`.
No headroom was spent. Whole-mix peak is −0.155 dBFS, byte-for-byte `-21`'s, because that peak lives in the head. Inside the alley slot itself `-24` peaks at −0.26 dBFS against `-21`'s −0.21 — the new take is fractionally safer, so the +8 dB ceiling noted above still stands with a little more room under it.
`morning-scene-21` stays where it is as the record of what the pick sounded like on `M-09-04`. Nothing was renumbered.
Mabel's call: `morning-scene-24` is the approved morning cut, and the other twenty-three go hidden so there is one cut to look at rather than twenty-four.
Approved as shot id `CUT-morning` — the first cut ever approved, so the id is new. It follows the `CHAR-`/`SET-` prefix families already in `assets.json` and leaves `CUT-evening` free for when the evening scene assembles. Key: `approved/CUT-morning/morning-scene-24-5aaedef4.mp4`.
`assets.py approve` recorded it without provenance, which is correct and not a failure: `-24` is a local ffmpeg assembly, so it matches no Higgsfield job and the ledger declines to name a model that did not make those pixels. The note in `assets.json` carries the derivation instead, and the measurements are above.
Hidden, not culled. (Reversed the same afternoon — they are back on the page, in a drawer under the approved cut; see the next section.) `morning-scene-01` … `-23` stay on disk, stay in the bucket, keep their provenance and keep every entry on this page. `hidden` in `refs/index.json` only stops the gallery drawing them; `python3 tools/assets.py unhide refs/cuts/morning-scene-NN.mp4` puts any of them back. Nothing was renumbered and nothing was deleted — in particular **`-21` is still the record of what the pick sounded like on `M-09-04`**, exactly as the section above says; it is simply not on the page any more.
**A page-weight argument was offered here for hiding them. It was wrong, and it has been withdrawn — see the next section, where it was actually measured.** The claim was that every `<video>` on the page fetches on load, since `loading="lazy"` does not apply to video, so hiding twenty-three cuts took 231.9 MB out of the load. The byte figures were real but they were a sum of the markup, never an observed request: no browser was watched making them. It fetches nothing. The decluttering reason stands on its own and is the whole of it.
Mabel: "i want them under the approved cut as not selected… hidden, yeah." So the twenty-three are unhidden and back on the page, and the hiding is done by the drawer the gallery already had rather than by `refs/index.json`. `hidden` was the wrong instrument: it takes a file off the page entirely, which is why the question "where are the rest of the cuts?" had to be asked at all.
`gallery_section` has always led a group with its approved item and put the rest in a shut `<details>` under it — *"the approved still is the answer, and it should not have to be hunted for among fifteen rejects."* Nothing about cuts needed building; they only had to be visible for it to apply. The `cuts` group now reads: `morning-scene-24` alone at the top with its approved badge, and under it
23 other cuts — not selected
shut. One change to `tools/build.py` went with it: the drawer's noun comes from `group_kind`, which sees video and says "take", so it read 23 other takes. A cut is an assembly, not an attempt at a shot, so `cuts` now names itself.
**The page-weight claim from this morning is withdrawn — it does not survive measurement.** Served from a local origin so every request could be logged, the gallery was loaded with all 146 videos present and the log read after it settled:
| requests | |
|---|---|
| `.png` | 92 |
| `.html` / `.ico` | 8 |
| `.mp4` | 0 |
Zero. Then, still zero after scrolling `morning-scene-24` into view, and still zero after opening the drawer with all 23 in it. Six videos sit in the opening viewport reporting `networkState: 2` (loading) and `readyState: 0` — Chrome intends to load them and never issues the request. `preload='metadata'` is a hint, and this build declines it; the bytes arrive when a clip is clicked and played, which is what the click-to-play handler is for.
So the 231.9 MB was a sum over the markup, not traffic, and hiding the cuts saved nothing. It also means putting them back costs nothing: 144 videos on the page or 121, the browser asks for the same zero of them. Measured in Brave/Chrome — another engine may honour the hint, and if the page is ever found to be heavy on one, `preload='none'` plus a poster frame is the fix, not hiding work.
The lesson worth keeping: a byte count read off the HTML is not a page load. The request log was three minutes of work and reversed the conclusion.
Twenty takes in one afternoon, `M-07-27` through `-46`. Seven of them are the pull (`-27` to `-33`, 12:43–13:30); thirteen are the type case (`-34` to `-46`, 13:37–15:12). `M-07-45` is approved — Mabel: "approve m07 45" — and the row changes with it, from The pull to The type case.
| take | job | what it fixed | what it did not |
|---|---|---|---|
| `-27` | `758a510a` | press, screw, carriage and rounce all render; the bar stays level and sweeps horizontally, so `M-07-14`'s club-swing is gone | the press stands out in the middle of the room; the platen never descends |
| `-28` | `44afd9b1` | — | as above |
| `-29` | `fb77b23c` | the wall: plaster hard behind the press, filling the gaps between the timbers; the boy moved to frame right | the platen never descends |
| `-30` | `2b830fd9` | — | as above |
| `-31` | `59198c48` | best of the seven — wall, uprights holding the frame, bar attached and level | the platen never descends |
| `-32` | `c6a6b56a` | — | went wide, took the whole room, and the bar became a free pole crossing in front of the far press's screw box |
| `-33` | `a736e3da` | — | as above |
**In all seven the tympan lies open and flat on the carriage and nothing ever comes down onto the paper.** The bar is hauled with no carriage run in — the oldest item on `press-mechanics.md`'s known-wrong list, and the fault that page was written for.
**The first take's failure was the prompt's, not the model's, and it is worth writing down.* `M-07-27`'s camera block ended: the bar level and back where it started, the platen up under the screw again, the carriage unmoved… the frame is the same frame it was in the first second.* Naming the destination frame is the lever that works on this shot — it is what bought the arc in `-23`, `-24` and `-25` — and it was pointed at a frame identical to the opening one. The one thing that had to change had no frame of its own, so the model rendered the two named frames and left the middle to itself. **If a beat must happen inside the shot, the last frame has to be the beat, not the recovery from it**: end on the platen hard down with the bar held over, and let the release fall after the cut.
And compression did not lose the instructions. `-32` ran on 4,649 characters against `-29`'s 10,363, and every load-bearing line survived the cut — the bar block, the two oak uprights frame the picture, *the screw is in the upper third directly above the bar*, the press against the back wall, the dead far press. It went wide anyway. So the wide framing is not a wording deficit to be repaired by saying more; the instruction was there and was not obeyed.
`M-07-26` was the take Mabel liked — "Wait I actually like it" — and read at 1:1 its last frame carried three faults, all in the destination frame the shot is built to arrive at: the sorts lay face up, their letters read forwards where real type is cut in mirror image, the letterforms were roman rather than Fraktur, and a case label carried legible characters spelling nothing.
The fix is one idea rather than three prohibitions, and it is now in the row:
The sorts stand upright in their boxes, packed close, and what shows uppermost
is the plain squared foot of each shank — a small blank oblong of dull grey
lead. The letters are cut on the far end, down inside the compartment and out
of sight.
Give the model a physical reason for the absence and it renders the absence. Tell it not to draw letters and you are writing the negative list this sheet has warned about since the first shop attempt. The same move handles the label: the rails are described — *bare oak, plain unpainted timber, worn smooth along the top edges, stained dark where inked hands have rested on it* — rather than declared label-free. In `M-07-45` no letterform appears anywhere in the case.
Not the note above. Between `M-07-43` (8,467 characters, 14:52) and `M-07-45` (6,239, 15:04) the prompt lost both background-business blocks — the Apprentice at his water trough and the Old Printer working the ledger at the counting desk — and nothing else of substance changed. The four-or-five-cycle action, the negative clauses (NOT BLOCKS, TILES OR LETTER-SHAPED OBJECTS, *No modern objects*) and the shallow-focus line all survived into the take that was approved.
So the honest finding is not one placement fixed it. It is that **the shot won by giving up on staging the room**: 26% of the prompt went, and what went was everything the camera was never going to be close enough to see. That is consistent with the 27 Aug finding about the boy's trough — objects the plate does not already contain drag the model away from the ones it does — and it is the cheapest lever on this shot. And note what it did not cost: with both background blocks gone, the model staged the other two men anyway. All three are in `M-07-45` — Lufft in the near ground, the Apprentice at the left in front of the windows, the Old Printer at the right past Lufft's shoulder in the jerkin and apron, head down over a bench. **Dropping the business did not empty the room; it only stopped specifying it.** The four or five placement cycles are still in the prompt, still asked for, and still come back as a man holding rather than placing.
A correction, and the reason it is written down. This session first
reported that the Old Printer was not in the approved take at all, and put
that in the row and in this note. He is in it — middle distance at the right,
roughly 1.7s to 3.5s, going out of frame as the arc tightens. The error came
from sampling six frames and zooming only the left of them; Mabel caught it
from the clip. **A cast reading needs the whole take at a few frames a second,
not a handful of stills** — a contact sheet at 4fps shows him at once, and it
costs one ffmpeg call.
Read at 1:1 on the first and last frames of `M-07-45`: no ledger in frame, no legible text, no numeral anywhere, and the case label carries marks without digits. No 400.
The lesson worth keeping: **the destination frame is the strongest lever on this shot, and it is only as good as what you point it at.** Point it at the opening frame and you get a take where nothing happens, rendered perfectly.
The row was written unrolled that morning and generated the same day: eleven takes, `M-11-01` to `-11`, pulled in three batches at 12:09, 12:27 and 12:42. This is about `M-11-08` — job `7a790965`, `seedance_2_5`, 6.04s at 720p, 24fps, 1280x720 — which Mabel brought over as a share link and asked to have trimmed.
**The take departs from the row in two ways, and only one of them is fixable in the edit.* The row asks for a camera locked off at the mouth of the lane at chest height, looking down it, that never follows him*; the job prompt asked for the opposite — *one highly agile camera, continuously orbiting him in rapid 360 degree circles* — and that is what came back. And where this row's whole watchers design exists so that *no face is ever resolved enough to be a face the film never approved*, the prompt put two people out in the open lane and named them: a middle-aged man sweeping near a doorway, and a teenage girl leading a goat. Both read as faces. That is precisely the `town-ext-09` dogs and `shop-int-08` pressman failure the watchers-behind-glass staging was invented to prevent, arrived at from the other direction — not inherited from a plate this time, but asked for in the prompt.
The usable window is 1.375s to 6.042s — 4.67s of the 6.04s generated. (Mabel, 1 Sep: *"take the last 5 secs or so, dont show the people in the first part"*.) Measured frame by frame at full resolution rather than by eye on the scrubber: **frame 32 (1.333s) still carries the sweeper's arm and the head of his broom clipping the left edge, and frame 33 (1.375s) is the first frame carrying neither figure**. Mabel paused the share player at 1.380s independently and landed on the same frame. From 33 to the end the lane holds only the runner — checked across the entire tail rather than assumed, because the camera's 360 degree orbits could easily have swung either of them back through frame, and neither returns.
Trimming there is what this row already predicted — *the beat most likely to need trimming to is him landing on the door.* The window drops the lateral cross past the townspeople and ends on his weight going into the door with his left hand coming up, which is the frame that hands him to M-12.
Two things the window does not fix. The camera still moves: it comes off his face and settles to a view down the lane from about 2.4s, close to the row's framing but not the locked-off camera the row asks for. And **the window is eight frames short of the Cut** — 4.67s against 5s, with no handle at either end, which is the `M-09-04` situation of a clip that can only be used one way. If M-11 is bought from this take, either the cut absorbs the third of a second or the shot is re-rolled with the sweeper and the goat girl out of the prompt and the camera put back on its locked-off mount.
The trimmed file is not stored. Per the M-02 precedent the take keeps its full length in `refs/takes/` with its provenance intact, and the window lives here as prose; a trimmed derivative would match no job and the gallery would have to say so.
`M-11-12` is the approved take for M-11, at Mabel's direction, and it is the first approved shot in this film that no model made. It is `M-11-08` cut at frame 33 and encoded locally — the window measured the day before and, at that time, deliberately not stored.
Why it was not stored on 1 Sep, and why that was the wrong call. The note above cites the M-02 precedent — a trimmed derivative matches no job, so the gallery would have to say so — and left the window as prose. But the request was for a clip, and prose is not a clip. The measurement was right and the delivery never happened: Mabel asked again on 2 Sep whether she had ever got it, and the answer was no. A measurement is not a deliverable. The precedent governs what `refs/` should hold, not whether to answer the question that was asked.
How it was made, so it can be rebuilt byte-for-byte if it is ever lost:
``` ffmpeg -y -ss 1.375 -i refs/takes/M-11-08.mp4 \ -c:v libx264 -crf 12 -preset slow -pix_fmt yuv420p \ -c:a aac -b:a 192k -movflags +faststart \ refs/takes/M-11-12.mp4 ```
Source `M-11-08` — job `7a790965-f1d1-4673-a840-099467cbe53b`, `seedance_2_5`, 6.04s, 1280x720, 24fps. Result: 112 frames, 4.667s of video (4.705s container, the audio tail running slightly long), 1280x720, 24fps, ~9.4 Mbps against the source's ~11. **Re-encoded rather than stream-copied because it had to be**: the take carries only two keyframes, at 0.000s and 2.750s, so there is no cut at 1.375s that a copy could make. CRF 12 is the concession to that — one lossy generation, chosen for an approved asset rather than the CRF 16 of the first throwaway pass. The take's own audio is kept (mean −34.8 dB, max −13.1 dB) and re-encoded rather than copied, so the mid-GOP cut cannot drift the sync.
The cut point was re-measured, not inherited. Frames 31 and 32 still carry the sweeper's arm and the head of his broom at the left edge; **frame 33 is the first frame carrying neither figure**, which is what the 1 Sep note says and what Mabel landed on independently at 1.380s on the share player.
The name follows the `shop-night-04` precedent: a local derivative takes the next free number in its own series, with no suffix marking it as derived — so `M-11-12` sits after `M-11-11` exactly as the graded `shop-night-04` sits after the generated `-03`. **The consequence is that the number does not tell you it is a trim.**
The note as first written said the gallery would show `M-11-12` as no record and that this was correct and should be left alone. Mabel asked for the derivation to be visible on the card, and she is right: no record was true but it withheld the one thing about the file that is known exactly. **Recording where a locally made file came from is not an exception to "nothing is guessed"** — it asserts only what this repo did, with a command that rebuilds it, and names no model.
So `provenance.py` now has a `derive` command beside `sync` and `urls`:
``` python3 tools/provenance.py derive refs/takes/M-11-12.mp4 --from refs/takes/M-11-08.mp4 --how trimmed --command "<the ffmpeg above>" ```
It writes `via: "local"` with `derived_from`, `how` and `command`, and **no `model`, no `job`, no `prompt`** — because nothing generated those bytes. Every `--from` must be on disk: a derivation pointing at a file that was never here is a guess wearing a citation, and worse than saying nothing.
**`sync` will not touch a `via: "local"` entry, and `--force` does not override that.** The matcher decides on byte length confirmed by a readback, so a trim that happened to land on some unrelated job's length could overwrite a true record with a model that did not make those pixels — the one thing the ledger promises never to do. Files we made ourselves are simply never offered to it.
On the gallery the caption now reads `trimmed from M-11-08` where it used to read `no record`, dashed like no record because no model is claimed, but in the reading colour because the origin is known. The i panel gives *no model — made locally*, the source path, the verb, the ffmpeg command, and then `M-11-08 was Seedance 2.5 · job 7a790965…` — **the source's model, labelled as the source's**, so the chain can be followed back to a generation without this file ever appearing to be one.
**One bug worth recording, because it was the failure the ledger exists to prevent.** The new branch in `meta_panel` was written as `elif` after `if e:`, and a derived entry is a perfectly truthy dict — so the generated-file branch swallowed it and the panel announced *"matched to Higgsfield's job history by content"* over a file no job has ever touched. Caught by reading the built page rather than trusting the build. The branches are now ordered by specificity, not by truthiness, with a comment saying why.
What approving it accepts, knowingly. Two things the trim does not fix, both already written into the row:
Recorded in `assets.json` as `approved/M-11/M-11-12-cd3e5324.mp4`, with the source take and its job id in the note field, since the `provenance` key that `assets.py approve` would normally copy from the ledger does not exist for this file. That note is now the only machine-readable link from the approved asset back to the generation it came out of.
Not a `refs/cuts/` entry. The flat `morning-scene-NN` series is for assemblies of more than one shot; this is a single shot trimmed to its window, so it belongs in `refs/takes/` with the rest of M-11 and is approved through the shot, not numbered into the cuts series.
What is in it, in order. Five joins, each one the last 2.5s of `M-07-45` (the approved M-07, arc tightened onto the case) cutting straight into one M-08 pick. No dissolves, no handles, nothing graded:
| # | at | M-08 pick | why it is in the top five |
|---|---|---|---|
| 1 | 0.0–10.5s | `M-08-08` | the only take in the set whose paper is blank all the way through |
| 2 | 10.5–21.1s | `M-08-09` | same staging and the same held two-shot, but the stock is printed |
| 3 | 21.1–30.6s | `M-08-05` | the boy's sorting reads best of any take; he is back-to-camera and one sheet is printed |
| 4 | 30.6–41.2s | `M-08-16` | holds its frame, but wide, three-handed, and the ledger is in shot |
| 5 | 41.2–50.7s | `M-08-07` | the boy's business is right; the camera pushes, against the row's own rule |
Built mute, deliberately. Every one of these takes carries Seedance's generated audio and none of it is the film's — M-08's two lines are recorded separately like the rest of the dialogue. Judging a cut against sound that will never be used is worse than judging it silent.
The 2.5s outgoing is an assumption, and a stated one. The sheet records `M-07-45` as cut 6s out of 7s generated without saying which end came off. The arc ends on the case, so the last 2.5s is the approved shot's ending wherever the head trim falls; if the trim actually came off the tail this reel is showing a slightly later outgoing frame than the cut will.
What the reel shows that the takes do not, one at a time. `M-07-45` goes out tight on Lufft in his black cap. In pick 4 the near-right figure is also a bearded man in a black cap — across the join the eye reads him as Lufft who has somehow crossed the room, which is a version of the identity swap the M-08 row already forbids in the boy's direction. It is only visible in the cut.
The room, the light and the hour match across all five joins; the scale jump from a tight case to a wide two-shot is large but ordinary.
Source takes `refs/takes/M-07-45.mp4` and `M-08-05` / `-07` / `-08` / `-09` / `-16`, all `seedance_2_5`, all 720p24, pulled from the job history earlier the same day (commit `7f1195c`). Assembled with ffmpeg concat, x264 crf 16, no filtering.
Identical picture to `morning-scene-25` — same five joins, same order, same 2.5s of `M-07-45` before each pick — carrying **each take's own generated audio** instead of nothing. Mabel asked for sound; `-25` stays as the mute version rather than being overwritten, since the number is a serial and the history entry above describes a file that exists.
The levels are not matched, and that is the material, not the assembly. Each take generated its own room tone at its own level, so the reel steps across every join:
| segment | mean | peak |
|---|---|---|
| `M-07-45` tail | −37.5 dB | −13.1 dB |
| `M-08-08` | −29.7 dB | −9.9 dB |
| `M-08-09` | −21.9 dB | −2.2 dB |
| `M-08-05` | −22.4 dB | −2.6 dB |
| `M-08-16` | −30.4 dB | −8.2 dB |
| `M-08-07` | −31.3 dB | −8.8 dB |
Fifteen dB of mean spread between the quietest and loudest segment, and `-09` and `-05` are close to clipping. Nothing was levelled: a normalized reel would sound better and would misrepresent what these takes actually are, and the row's audio is recorded separately in any case. A per-segment loudness pass is a free local operation whenever it is wanted.
Audio re-encoded to 48 kHz stereo AAC from the takes' own 32 kHz so the segments would concatenate; the picture is bit-identical in treatment to `-25`.
Mabel, off `morning-scene-26`: "approve the take that ends at 30 secs". That is the reel's third segment, 23.58–30.62s, confirmed from frames rather than arithmetic: `M-08-05`. Recorded as `approved/M-08/M-08-05-de2f70f0.mp4` — **the first approved take M-08 has ever had*, on a row that read Nothing since last week* with no footage behind it this morning.
What it gets right is the row's whole beat: the two-shot held with no push and no reframe, two people, deep focus, the boy at his table in front of the windows lifting sheets one at a time from one pile to the other, the Old Printer at the press bed in the middle distance right, and neither man stopping or looking up.
**What it costs, stated plainly, because it is a rule reversed rather than a blemish.* The row settled blank stock — no printing on the sheets* on 31 Aug, and this take's stock is printed. The blank-stock line was never about the paper: it was the reason M-08 carried no text surface at all, which is what made the 1:1 frame check a formality — *not because it passed but because nothing in the shot could fail it*, as the row itself puts it. Approving printed stock takes that away, so the check was done for real before recording:
First frame, last frame and five intermediate frames read at 1:1. The printing
is illegible texture — no letterform resolves in the sheets, the pile or
the drying line — and **no numeral appears at any point. No 400, no digit of
any kind.**
So THE NUMBER is safe in this take, but **safe by inspection rather than by construction**. That is the weaker guarantee, it holds only for this take, and any future M-08 roll on printed stock needs the same read rather than inheriting this one's result.
The second defect is the pile: far deeper than the twenty to thirty sheets the row calls for, so the count is the drought does not land — a stack that size says the opposite of nothing since last week. Neither defect trims out; both want a reroll or a local paint pass on the paper.
Mabel was shown both defects and the blank-stock conflict before this was recorded, and approved it anyway.
Mabel: "clip m07 and m08 onto morning scene 24". So `morning-scene-27` is the approved morning cut with the two shots that follow it in the sheet's order appended — `morning-scene-24` + `M-07-45` + `M-08-05`, in that order, which is cut order: the alley is the sixth slot, M-07 the seventh, M-08 the eighth.
| From | To | What |
|---|---|---|
| 0.000 | 36.708 | `morning-scene-24` entire — black, `M-01-20`, `M-02-02`, `M-03-11`, `M-04-26`, `M-05-09`, `M-09-13`, with its music and beds exactly as approved |
| 36.708 | 43.750 | `M-07-45` whole, 7.042 s, own generated audio at unity |
| 43.750 | 50.792 | `M-08-05` whole, 7.042 s, own generated audio at unity |
50.791667 s, 1219 frames (881 + 169 + 169), 1280×720/24.
The takes go on whole, with their handles — this is not the cut lengths. The sheet asks for 6s of M-07's 7s and 5s of M-08's 7s, and *neither trim point is settled*: the M-07 row records the length without saying which end comes off (`morning-scene-25` already flags its 2.5s outgoing as an assumption from the arc ending on the case), and M-08 has never had a trim decision because until today it had never had a take. Guessing two trims and baking them into a numbered cut is worse than showing the handles, so nothing was trimmed. A version at the sheet's lengths is a minute's work whenever the ends are settled.
Nothing in `-24` was touched, and the picture is not re-encoded anywhere. All three sources were stream-copied: the finished cut's first 881 frames decode to the same MD5 as `morning-scene-24`'s whole video stream, so the approved cut is carried through bit-for-bit rather than rebuilt — unlike `-24` against `-21`, which was a fresh encode at 46.8 dB.
The audio is one AAC generation down, and that is a deliberate trade. A straight `-c copy` concat leaves 1024 samples — 21.3 ms — of AAC priming at the head of the output, which puts the whole track that far late against picture, and every further segment adds its own 1024 again at the join. So the track was assembled sample-exact instead: each segment decoded, padded to its picture length, concatenated and encoded once at 192k/48k. **Worth knowing for the next build: AAC segments cannot be copy-concatenated — they drift one 1024-sample frame per join.**
What that costs, measured against `morning-scene-24`'s own audio over the shared 36.708 s: alignment is exact (residual rises to −25 dB at ±1 sample and −21 dB at ±2, so sample 0 is the null), the residual is **−34.8 dB against a mix at −15.4 dB, and the peak moves from −0.15 to −0.01 dBFS with no sample at full scale**. Inaudible, but the head is no longer bit-identical the way `-24`'s was against `-21`'s — that property ended here.
The takes' audio is 65 ms shorter than their picture (6.976 s against 7.041667 s), which is how Seedance delivers them. Each segment is padded with silence to its own picture length rather than butted end to end; butting them would have started `M-08-05` 65 ms early and left it there.
Nothing was levelled, and the tail steps hard. As in `morning-scene-26`, the takes carry their own generated audio at unity:
| segment | mean | peak |
|---|---|---|
| `morning-scene-24` head | −15.4 dB | −0.0 dB |
| `M-07-45` | −39.0 dB | −13.4 dB |
| `M-08-05` | −22.5 dB | −2.6 dB |
The cut therefore drops about 24 dB into near-silence for M-07's seven seconds and jumps 16 dB back up on the M-08 join. That is the material, not the assembly: none of this audio is the film's — M-07's type clicks and M-08's two lines are recorded separately like the rest — and levelling it would make a reel that sounds better than the shots are. A per-segment loudness pass is free whenever it is wanted.
The music ends where it ended. `runner-motif.m4a` stops at 36.708 with the alley, as it does in `-24`; it was not extended over the two shop shots, which matches the cut's own grammar — the motif already stops dead at the first shop cut at 14.583.
Free: ffmpeg only, no credits. `morning-scene-24` is untouched on disk and stays the approved cut; nothing was renumbered.
Mabel: "unapprove m0805". So the 3 Sep approval is withdrawn and **M-08 has no approved take again** — the state it was in before that morning, on a row that has exactly one take to its name.
What changed, and it is only the record. The entry for `approved/M-08/M-08-05-de2f70f0.mp4` is gone from `assets.json`, which is the whole of what an approval is here, so `build.py` no longer flags the take in the gallery, no longer links it on the drafts index, and `assets.py list` no longer carries an M-08 line. The M-08 row in `sheets/shots-morning.md` now opens *no approved take instead of Approved: `M-08-05`*.
What did not change. `refs/takes/M-08-05.mp4` is untouched on disk, in the bucket working set and in `refs/index.json`; it is not hidden and not culled, so the gallery still shows it as the shot's one piece of footage with its provenance intact. `refs/provenance.json` keeps job `e6c9e558` as it was. The two assembled cuts that contain it — `morning-scene-26`, where it is the third segment, and `morning-scene-27`, where it is the tail — were not rebuilt and were not renumbered; they are records of what was cut on 3 Sep, and an approval withdrawn afterwards does not make them wrong. The immutable `approved/M-08/...` object still sits in the bucket, unreferenced now that nothing links it; content-addressed names are never reused, so it is inert rather than stale, and it can be deleted on request.
**The consequence worth carrying forward: the blank-stock rule is unqualified again.* The 3 Sep approval reversed the row's own blank stock — no printing on the sheets* (settled 31 Aug) by accepting printed stock, and paid for it with a real 1:1 read of seven frames — illegible texture, no letterform, no numeral, THE NUMBER safe by inspection rather than by construction. With the approval withdrawn, nothing the film has approved rests on that reversal, so the next M-08 roll goes back to blank stock and the check goes back to being a formality nothing in the shot could fail. The 1:1 result stands as a fact about `M-08-05` and about no other take.
The two defects the approval carried knowingly — the printed stock and a pile far deeper than the twenty to thirty sheets the row calls for — are unchanged and are written out in full in the M-08 row. Whether the withdrawal is about them, about a reroll, or about something else was not said and is not recorded here as if it had been.
Free: no credits, no generation, no rebuild of any cut.
Mabel: "try m0808 instead of the approved m08". So `morning-scene-28` is `morning-scene-27` with the last shot swapped and nothing else touched — `morning-scene-24` + `M-07-45` + `M-08-08`, the take that came first in `morning-scene-25`'s blend reel.
| From | To | What |
|---|---|---|
| 0.000 | 36.708 | `morning-scene-24` entire, as approved |
| 36.708 | 43.750 | `M-07-45` whole, 7.042 s, own audio at unity |
| 43.750 | 51.792 | `M-08-08` whole, 8.042 s, own audio at unity |
51.791667 s, 1243 frames (881 + 169 + 193) — one second longer than `-27`, because `M-08-08` was generated at 8s where `M-08-05` was generated at 7s. Neither is trimmed, for the reason `-27` gives: no trim point is settled for either shot.
Built exactly as `-27` was, and it verifies the same way: the head's 881 frames decode to `morning-scene-24`'s own MD5, **and the `M-08-08` segment decodes to the source take's MD5** — no re-encode anywhere in the picture. Audio assembled sample-exact and encoded once (alignment exact at sample 0, residual −34.8 dB against a −15.4 dB mix, peak −0.01 dBFS, nothing at full scale).
One new gotcha, and it does not show up as an error. `M-08-08` carries a time_base of 1/90000 where `morning-scene-24`, `M-07-45` and `M-08-05` all carry 1/12288. Concat-copying it against them produced a file with the correct 1243 frames and a duration of 378 s — timestamps rescaled wrong, silently, exit code zero. Fixed by remuxing the take to 12288 first (`-video_track_timescale 12288`, picture untouched). **Check `time_base` across sources before any concat-copy**, not just codec, size and rate; the takes do not all agree.
The step is gentler than `-27`'s. `M-08-08` is 7 dB quieter than `M-08-05`:
| segment | mean | peak |
|---|---|---|
| `morning-scene-24` head | −15.4 dB | −0.0 dB |
| `M-07-45` | −39.0 dB | −13.4 dB |
| `M-08-08` | −29.7 dB | −9.9 dB |
Still unlevelled, for the same reason as `-26` and `-27`.
The `-25` table calls `M-08-08` *"the only take in the set whose paper is blank all the way through."* That does not survive a 1:1 read, and it was my line. It was written from the blend reel at playback scale — the same contact-sheet-scale trap this row documented four days later for `-18`, `-20` and `-21`, and the reason the row insists on reading frames at actual pixels.
Read at 1:1 on the first frame, the last frame and 2 s / 4 s / 6 s:
So on the blank-stock question `M-08-08` is not the clean take the reel notes claimed; it is printed like the rest, and it is further from the row's staging than `M-08-05` on the pile. What it has over `-05` is the boy's face — he is three-quarters to camera here rather than backed to it — and a quieter bed. `M-08-05` stands as the approved take unless Mabel says otherwise; this is a comparison cut, not a replacement.
Free: ffmpeg only, no credits. `-24` and `-27` are untouched; nothing renumbered.
Mabel, from the terminal, with a screenshot of a Higgsfield job panel: *"figure out what this clip is then cut it together with the approved m07"*. The clip in the panel is `M-08-26` — see the identification below. So `morning-scene-29` is `M-07-45` + `M-08-26`, in cut order: M-07 is the seventh slot, M-08 the eighth. It is a two-shot join reel, not the whole morning; `-27` and `-28` are the versions that hang the pair off `morning-scene-24`.
| From | To | What |
|---|---|---|
| 0.000 | 7.042 | `M-07-45` whole, 7.042 s — the approved M-07 (28 Aug, job `b0ac6c51`), own generated audio at unity |
| 7.042 | 14.083 | `M-08-26` whole, 7.042 s — job `1945dc48`, own generated audio at unity |
14.083333 s, 338 frames (169 + 169), 1280×720/24.
The panel gave: Seedance 2.5, 720p, 7.0s, 16:9, four references, **September 5, 2026*, and a prompt beginning "LIVE-ACTION CINEMATIC FOOTAGE — Wittenberg, Germany, late June 1539. UNRETOUCHED 35MM DOCUMENTARY PHOTOGRAPHY…"*. That narrows it to the eight M-08 rolls of 5 Sep (`M-08-23` … `-30`) and no further: **the prompt head and the panel's four reference thumbnails are identical across `-26` through `-30`, and `higgsfield generate list --video` confirms no job newer than `M-08-30` (20:36 Z)** — so the clip was already on disk, not a roll still to be pulled.
The match was made on set dressing and staging, at 1:1, against first frames of all eight and a 0.5 s timeline of the winner. `M-08-26` carries, in the panel frame's exact positions: the boy backed to camera frame-left with the strap across his back and a pale stack under his hand at the bottom-left corner, the Old Printer in a dark sleeveless jerkin over rolled cream sleeves at 74 % of frame width with both hands down on the bench, a thick printed pile at his right, a small cup of brushes at the frame's right edge, the dark forme on the near bench between them, a leaded window upper-left behind the press and the type-case rack at the right edge. The frame in the screenshot sits around 4.5–5 s into the take, where his hands come down flat.
The other seven fail on staging, not on detail: `-23` and `-30` put the boy in profile with the carved chair and open book at frame right; `-24` has a capped adult at the press, not the boy; `-25`, `-27` and `-29` stage the Old Printer at a low table of blank stacks against the type cases, wider and deeper; `-28` puts the boy in profile at the press screw.
The takes go on whole, with their handles. The sheet asks for 6 s of M-07's 7 s, and which end comes off is still unsettled (`morning-scene-25` flags its 2.5 s outgoing as an assumption). Same for M-08's 5 s. Nothing was trimmed; trimmed versions are a minute's work once the ends are settled.
The picture is not re-encoded. Both segments were stream-copied and decode to their sources' MD5 exactly — `30d664ac…` for `M-07-45`, `5c69e306…` for `M-08-26`.
`M-08-26` needed the timescale remux first. Like `M-08-08` in `-28`, it carries `time_base` 1/90000 where `M-07-45` carries 1/12288; concat-copying the two as they stand rescales the timestamps silently, exit code zero. Remuxed with `-video_track_timescale 12288`, picture untouched. **The takes still do not all agree on time_base — check it before every concat-copy.**
Audio assembled sample-exact and encoded once (192k/48k), not copy-concatted: each segment decoded, padded with silence to its own 7.041667 s picture length — Seedance delivers 6.976 s of audio against 7.042 s of picture, 65 ms short — then concatenated and encoded. A `-c copy` concat would have put 1024 samples of AAC priming at the head and another at the join.
Nothing was levelled, as in `-26`, `-27` and `-28`: none of this audio is the film's.
| segment | mean | peak |
|---|---|---|
| `M-07-45` | −39.0 dB | −13.6 dB |
| `M-08-26` | −27.1 dB | −7.7 dB |
The join therefore steps 12 dB up into M-08 — gentler than `-27`'s 24 dB drop and 16 dB climb, because this reel carries no `morning-scene-24` mix to step down from. A per-segment loudness pass is free whenever it is wanted.
Free: ffmpeg only, no credits, no generation. `-24`, `-27` and `-28` are untouched; nothing renumbered.
What it is. `refs/audio/shop-bed-m07-m08-01.wav` — 14.083333 s, 48 kHz stereo, 16-bit — one part of `M-07-45`'s own audio, repeated three times so that a single unbroken shop bed runs the length of `morning-scene-29`'s two segments (M-07 7.041667 s + M-08 7.041667 s). Mabel's direction, 5 Sep 2026: *"take the audio for m07 and find a good part that you can repeat. this repeat will extend to cover m08's clip also."* It is a separate piece, not laid into any cut: no reel was rebuilt and nothing in `refs/cuts/` was touched.
What it fixes. `morning-scene-29` runs each take's own generated audio at unity, so the join steps 12 dB up into M-08 (−39.0 dB mean against −27.1). A bed made from one shot's material cannot step, and it is what the M-08 row asks for in words: *under it the shop bed carries on unbroken — the press working off-screen, the small dry click of type going into its boxes.*
The part that was chosen: 0.080 – 4.774 s of `M-07-45`. The take's audio is 6.976 s (65 ms shorter than its picture) and splits into two rates. Its clicks — lead sorts dropped into the case — land at 0.715, 1.855, 2.825, 3.740, 4.590, then bunch: 5.010, 5.315, 5.540, 5.930, 6.500, 6.935. The first five run at 1.14 / 0.97 / 0.92 / 0.85 s, which is both the sheet's working rate and the file's own pulse — envelope autocorrelation peaks at 0.94 s (r = 0.35) with harmonics at 1.89, 2.76 and 3.68 s. The busy tail was left out on purpose: looped, its slow-then-crowded shape would have repeated as an audible pattern three times over. Also excluded are the first ~20 ms (the AAC decoder's priming ramp, −65 dB rising to −44) and the last ~90 ms, where the 6.935 s click is cut off mid-decay by the end of the file.
How the loop was made. Loop length 225334 samples = 4.694458 s, so three of them cover the reel with 42 µs to trim off the end rather than a part-repeat left showing. The seam is a 60 ms equal-power crossfade, built the standard way — the loop's head blended with the 60 ms that naturally followed its tail — so the joint is a blend and not a butt. Both crossfade regions were picked to be quiet and to match: −44.4 dB against −44.2 dB, low-band correlation +0.28.
| checked | result |
|---|---|
| length | 676000 samples = 14.083333 s exactly, = 2 × 7.041667 s picture |
| seam discontinuity | max sample step 0.00081 at each joint, against 0.139 in the file |
| level across the seam | flat: −44 dB either side, no dip, no bump |
| clicks in the bed | 15, spaced 1.14 / 0.97 / 0.92 / 0.85 / 0.82 repeating — the seam gap (0.82 s) sits inside the material's own spread |
| level | peak −15.8 dBFS, mean −39.6 dBFS — the source take reads −13.6 / −39.0 |
Nothing was levelled or filtered, as in `-26` through `-29`: this is Seedance's generated audio and none of it is the film's. M-08's two lines are recorded separately like the rest of the dialogue, and this bed is working material — something to cut against so the join is not judged on a 12 dB step — not a claim on the finished track. A loudness pass, and laying it under the reel as a new `morning-scene-NN`, are each a minute's work whenever they are wanted.
No provenance entry, correctly. The file is a local edit of a download and matches no Higgsfield job, so `refs/provenance.json` says nothing about it rather than naming a model that did not make these samples. It is in `refs/index.json` with its waveform, and in the bucket, so the gallery lists it among the cues.
Free: ffmpeg and numpy only, no credits, no generation.
Mabel, from the terminal: *"yes don't drown out 29's audio, but layer them together. do that please". So `morning-scene-30` is *`morning-scene-29`'s picture, bit for bit, with `shop-bed-m07-m08-01` mixed in underneath its audio** — 14.083333 s, 338 frames, 1280×720/24.
| From | To | Picture |
|---|---|---|
| 0.000 | 7.042 | `M-07-45` whole — the approved M-07 (job `b0ac6c51`) |
| 7.042 | 14.083 | `M-08-26` whole — job `1945dc48` |
The picture is `-29`'s, stream-copied. Both files' video decodes to `d6325e5451efd27761be8a8d006de389`. No re-encode, no reframe, nothing regraded.
Two layers.
The loop is rotated 1.305 s, and that is the whole trick. The bed is made out of `M-07-45`, so laid in unrotated it would play M-07's own audio back against itself 80 ms early — a slapback flam on every click, the one way this mix could have sounded broken. Rotating the loop moves its clicks clear: the nearest bed click to one of M-07's own is 151 ms away, median 284 ms, where 80 ms reads as an echo and 150 ms reads as a second event. The rotation is free of seams because the loop was crossfaded to be circular — rolling it puts the old joint inside the reel, where it is already a blend.
It fills a hole nobody had noticed. `-29` carries **59.4 ms of true digital silence at 6.979 s — right on the join — and another 63.4 ms at 14.020 s**, at the end. They are the silence each segment was padded with: Seedance delivers 6.976 s of audio against 7.042 s of picture, so both takes run 65 ms short and `-29` pads the difference. The room therefore stops dead for three and a half frames immediately before M-08 slams in. Across the join, in 20 ms buckets:
``` -29 -32 -40 -180 -180 -82 -36 -39 -41 -40 -41 -30 -32 -40 -50 -54 -49 -34 -36 -37 -38 -40 ```
`morning-scene-30` has no silent run over 5 ms anywhere. That is the bed earning its place, and it is a better reason for it than the one it was built for.
It does not fix the 12 dB step, and a flat bed cannot. Measured:
| segment | `-29` | `-30` | what the bed added |
|---|---|---|---|
| M-07 | −39.0 dB mean | −38.1 | −45.5 — sits 6.8 dB under 29's own audio, plainly a second layer |
| M-08 | −27.1 dB mean | −27.1 | −45.2 — sits 18.1 dB under, and is masked |
| whole | −29.9 | −29.7 | step into M-08: +11.9 dB → +11.1 dB |
`M-08-26`'s own audio runs 12 dB hotter than `M-07-45`'s and is far denser — 20 transients in its 7 s against M-07's 11 — so one flat bed level cannot be both audible under M-08 and subordinate under M-07. At −6 dB it is a real layer under M-07 and a floor-filler under M-08. That is the correct trade for don't drown out 29's audio, and it is stated rather than hidden: peaks are unchanged (−13.6 → −13.7 on M-07, −7.7 → −7.3 on M-08) and nothing of `-29` was turned down.
Two moves are open, each a minute's work, neither taken without being asked. Ride the bed up about 12 dB across the join so it stays a constant ~7 dB under both halves — which buys audibility under M-08 at the cost of putting a level move back into the one element that had none. Or bring `M-08-26`'s own audio down to meet `M-07-45`, which fixes the step at its source. The second is the real answer to the step; the first is the real answer to hearing the bed. They are different questions and should be decided separately.
Still not levelled, still not the film's. This is Seedance's generated audio on both layers. M-08's two lines are recorded separately like the rest of the dialogue, and this reel is something to cut against, not a track.
Free: ffmpeg and numpy only, no credits, no generation. `-29` is untouched and nothing was renumbered.
Mabel: *"add morning scene 30 to morning scene 24 and then tack the approved m11 clip on the end of that. full sequence, morning scene 24, morning scene 30, and m11"*. So `morning-scene-31` is those three in that order — which is cut order: the alley closes `-24` at the sixth slot, M-07 and M-08 are the seventh and eighth, M-11 the ninth.
| From | To | What |
|---|---|---|
| 0.000 | 36.708 | `morning-scene-24` entire — black, `M-01-20`, `M-02-02`, `M-03-11`, `M-04-26`, `M-05-09`, `M-09-13`, with its music and beds exactly as approved |
| 36.708 | 50.792 | `morning-scene-30` entire — `M-07-45` + `M-08-26`, with `shop-bed-m07-m08-01` layered under both at −6 dB |
| 50.792 | 55.458 | `M-11-12` whole, 4.667 s — the approved M-11, the local trim of `M-11-08` |
55.458333 s, 1331 frames (881 + 338 + 112), 1280×720/24.
**The picture is stream-copied and every frame of it is bit-identical to its source.** Checked by decoding each range out of the finished file and comparing MD5s:
| frames | decodes to | which is |
|---|---|---|
| 0–880 | `2805c661…` | `morning-scene-24`'s whole video stream |
| 881–1218 | `d6325e54…` | `morning-scene-30`'s — and so `-29`'s, and so the two takes' |
| 1219–1330 | `3838eb20…` | `M-11-12`'s |
All three agreed on `time_base` 1/12288, checked before the concat as the sheet's rule requires, so the copy needed no remux.
The audio is assembled sample-exact, not copy-concatted — the same discipline as `-27` and for the same reason: AAC segments drift one 1024-sample frame per join under `-c copy`. Each segment was decoded, fitted to its own picture length, concatenated and encoded once at 192k/48k.
The `-24` head is carried at unity and sample-aligned. Residual against `morning-scene-24`'s own audio is −37.3 dB against a mix at −15.3, rising to −28.0 at ±1 sample and −23.3 at ±2 — so sample 0 is the null and the head is not a frame early or late.
Levels, and what the reel does over its length.
| segment | mean | peak |
|---|---|---|
| `morning-scene-24` head | −15.3 dB | −0.2 dB |
| `M-07-45` + bed | −38.2 dB | −13.7 dB |
| `M-08-26` + bed | −27.1 dB | −7.4 dB |
| `M-11-12` | −34.8 dB | −13.2 dB |
The cut still drops about 23 dB into the shop and climbs back in steps — `-27` recorded the same thing and it is the material, not the assembly. What is new is that the two shop shots no longer go silent between them: the bed covers `-29`'s 59 ms dropout at the M-07/M-08 join, and the only silent runs left in the whole 55 s are **two of 5–6 ms at 14.588 s and 23.670 s, both inside the approved `-24` head** and not introduced here.
One sample overshoots, and it is `-24`'s, not the assembly's. The finished track peaks at +0.03 dBFS at 32.409 s — one sample of 2,662,000, in the alley, inside the untouched head, where `-24` itself peaks at −0.155. It is an AAC reconstruction overshoot on already-loud material; a float playback path will not clip it and a 16-bit one clamps a single sample. Trimming the whole track 0.1 dB would remove it at the cost of the head no longer running at the approved cut's own level, so it was left and written down instead.
Nothing was levelled and none of this is the film's sound. The music still stops dead at 36.708 with the alley, as it does in `-24` and `-27`; it was not extended over the shop or the street.
Free: ffmpeg and numpy only, no credits, no generation. `-24`, `-29` and `-30` are untouched and nothing was renumbered.
Mabel: *"you forgot the runner motif on the last runner clip. make sure you end it when he opens the doors. don't slow down or speed up the music"*. So `morning-scene-32` is **`morning-scene-31` with `runner-motif.m4a` over the M-11 slot** and nothing else changed. 55.458333 s, 1331 frames, 1280×720/24.
The picture is `-31`'s, stream-copied — both decode to `40b8c51fbbee6f21b27e246784686c8a`. **Everything before the M-11 cut is untouched: the residual against `-31` over the first 50.792 s is −95.9 dB**.
Checked frame by frame. `M-11-12` runs him down the alley away from camera; from frame 104 he is closing on a pair of dark timber doors, and at **frame 111, the last frame, he is at the door mid-stride with his hand not yet on it.** The doors do not open in this take, and they were never going to: that is M-12, which has no footage. The approval note's "lands on him going into the door" is the approach, not the entry.
So end it when he opens the doors was read as **land the cue's last hit on his arrival at the doors**, which is the reel's last frame. That is also what the cue was built for — the 4 Aug approval note says it was trimmed to stop dead on its final accent *"so the M-12 door bang plays as the sound after the music's last hit."* The bang is not shot yet; the hit is now in the right place for it.
Back-timed, not stretched. `runner-motif.m4a` is 26.2385 s and its final solid accent is at 26.065 s, with 0.17 s of decay after it. The cue's **own end is aligned to the reel's last sample**, so what plays is its last 4.666667 s — cue 21.5719 s → 26.2385 s — at unity and at its recorded speed, untouched. The final accent therefore lands at reel 55.285 s, frame 1327 of 1331, and the decay runs out on the last frame:
``` reel 55.24 55.26 55.28 55.30 55.32 55.34 55.36 55.38 55.40 55.42 55.44 dB -19 -19 -13 -12 -14 -14 -16 -16 -19 -25 -36 ^ the accent decay -> ^ last frame ```
This skips 0.94 s of cue, deliberately. `-24` plays the motif from 0:00 to 14.583 and then resumes at cue time 14.583 over the alley, leaving off at cue 20.625 s. Continuing from exactly there would end the music at cue 25.292 — mid-phrase, with the accent unplayed — and the only way to have both the exact continuation and the accent on the frame is to stretch the cue, which was ruled out. So the in-point is 21.5719 rather than 20.625. After fourteen seconds of silence the join is not a continuation anyone can hear, and the accent is worth more than the arithmetic.
A 10 ms fade-in at the in-point, which is a click guard and nothing else: the cue is mid-phrase there, at −9.8 dBFS, and a hard start on a non-zero sample clicks. It does not touch the timing or the speed. The start itself is hard on the cut, which is this cut's own grammar — the motif stops dead at 14.583 in `-24` and resumes dead on the M-09 cut.
| M-11 slot | mean | peak |
|---|---|---|
| `M-11-12` location sound | −34.7 dB | −13.1 dB |
| motif tail | −12.6 dB | −0.5 dB |
| mixed | −12.6 dB | −0.4 dB |
The music carries the slot, as it does over M-01, M-02 and the alley in `-24`. Whole-reel peak is +0.030 dBFS, one sample — **the same single sample as `-31`, at 32.409 s in the untouched `-24` head**. The motif added no overshoot of its own.
| segment | mean | peak |
|---|---|---|
| `-24` head | −15.3 | −0.2 |
| `M-07-45` + bed | −38.2 | −13.7 |
| `M-08-26` + bed | −27.1 | −7.4 |
| `M-11-12` + motif | −12.7 | −0.4 |
Free: ffmpeg and numpy only, no credits, no generation. `-31` is untouched and nothing was renumbered.
Mabel's direction: "we're skipping m10." The morning loses its ninth shot and gains nothing in its place: M-08 cuts straight to M-11, the boy's nothing since last week answered by the runner in the lane a beat later instead of by a close-up of a composing stick. Thirteen shots, M-01..M-15 less the cut M-06 and now the cut M-10.
What the row said, kept here because the sheet no longer carries it:
| # | Shot | Framing | Cut | Gen | Refs | Action & camera | Audio |
|---|---|---|---|---|---|---|---|
| M-10 | The type case | INT · CU hands/face, rack focus | 9s | 12s | `apprentice-tq-03` · `shop-day-26` | An Apprentice sets a line at a type case, lips moving, the letters backward in his stick. | VO over the shop bed: „Der Kienruß gehet zur Neige. Genug auf die Woche, mehr nicht." — „Ich hab gestern mehr bestellt." (EN: Lampblack's near out. Enough for the week, no more. — I ordered more yesterday.) |
It was never rolled. No take, no prompt, no plate, no credits — the shot existed only as this row, so nothing on disk, in the bucket, in the ledger or in `assets.json` refers to it and nothing had to be culled or hidden. The whole cost of the decision is text.
**The dialogue went with it, and that is the part that touches the source of truth.* The exchange — APPRENTICE „Der Kienruß gehet zur Neige. Genug auf die Woche, mehr nicht." / OLD PRINTER „Ich hab gestern mehr bestellt."* (EN: Lampblack's near out. Enough for the week, no more. / *I ordered more yesterday.*) — was scripted, and M-10 was the only shot that played it. Asked what should happen to the lines, Mabel chose to cut them with the shot, so both speeches are gone from `script/the-offer.fountain` and `script/the-offer-de.fountain`, and `scratch-timings.md` was regenerated: **the morning falls from six scripted speeches to four, and from 22.4 s of dialogue to 13.6 s*. The IDs renumber with it: the lampblack lines were* MOR-03 and MOR-04, and the two that survive — the runner's *Frankfurt ist dahin and the Old Printer's Zween Aufträge* — move up from MOR-05/MOR-06 into MOR-03/MOR-04, so any older note citing a morning MOR number is reading the pre-cut numbering. This is the same class of knock-on the market cut had on 7 Aug, when the fountain lost `EXT. WITTENBERG - MARKET - DAY` — a shot leaving the sheet took a beat out of the screenplay with it.
The drought still gets planted, which is why the lines are affordable. Their job was to say the shop is running thin before the letter arrives, and M-08 does that work on its own and better: *„Sind neue Aufträge gekommen?" / „Keiner seit dem von voriger Woche."* is the same information carried by the same two speakers, with the thin stack of paper in the boy's hands saying it a second time without a word. Losing the ink stock costs a texture, not a plant.
What the fountain still carries, and it is now an orphan. The action line "At a type case, an APPRENTICE sets a line, lips moving, letters backward" stays in the screenplay — only the two speeches were cut. No shot plays it any more: M-07 is the type case with Lufft distributing, which is the opposite operation, and the boy never composes on camera. It joins the pull as a screenplay beat with no shot behind it, and the morning block's standing note holds — the screenplay names nobody at the press and has not been rewritten to match the sheet. Open, deliberately: either a later pass rewrites the morning block to what is actually being shot, or the line stays as prose the edit does not owe.
Numbers. The grid drops from fourteen rows to thirteen, 76s cut / 109s generated to 67s cut / 97s generated, ~631 credits for one take of everything at 720p on `seedance_2_5`. The sheet's header had read 113s since before M-05 and M-07 settled at their present lengths, so the new figure is a recount of the rows rather than 113 minus 12 — the arithmetic is stated on the sheet so nobody re-derives it and finds a different number.
And one model claim expires with the shot. M-10's 9 s cut was the only thing in the morning that would not fit Veo's 4/6/8 s grid, and it is the reason `PLAN.md` kept `kling3_0` on the list for its flexible 3–15 s durations. With M-10 gone the longest shot is M-15 at 8 s, so nothing in the morning requires a flexible-duration model. Both notes in `PLAN.md` now say so.
Mabel, from the terminal: *"approve morning scene 32 and whatever m08 clip was in that one"*. Two approvals, one of them named only by where it sits.
Not taken from the note above but from the bytes, because the whole point of the request is that the clip was identified by its position in a cut. `-32`'s picture is `-31`'s, whose M-08 slot is frames 1050–1218; decoded to raw `yuv420p` and hashed, that segment is `5c69e306d881f249bf10065e8398636c`, and the same hash over each of the eight 5 Sep rolls' whole video streams matches **`M-08-26` alone**:
| Take | MD5 of the whole video stream |
|---|---|
| `M-08-23` | `7e6fbbc1…` |
| `M-08-24` | `989436a0…` |
| `M-08-25` | `82ba3a57…` |
| `M-08-26` | `5c69e306…` — the cut's segment |
| `M-08-27` | `9328da02…` |
| `M-08-28` | `e041544d…` |
| `M-08-29` | `87821d98…` |
| `M-08-30` | `943d3095…` |
Worth doing rather than reading off `-29`'s write-up: `-26` through `-30` share a prompt head and all four reference thumbnails, and that near-identity is exactly what made the original panel identification hard.
Key `approved/M-08/M-08-26-67a87ec0.mp4`. Job `1945dc48`, `seedance_2_5`, 7.042 s at 720p/24, own generated audio. The shot's second approval and the first that stands; `M-08-05` held the slot from 3 Sep until it was withdrawn earlier the same day.
The 1:1 numeral check was run before the row was written, because this take is printed stock and so carries no structural guarantee. First, last and five intermediate frames, with the drying sheets and the table stack cropped and enlarged 3×: the printing is illegible texture, **no letterform resolves and no numeral appears at any point**. THE NUMBER is safe here by inspection, not by construction — the weaker guarantee, and it covers this take only.
Three defects went in with it, all recorded in the sheet row: printed stock against the 31 Aug blank-stock line, the boy no longer sorting a countable stack so the count is the drought has no prop to carry it, and no Lufft in frame. The staging is the 5 Sep swap — boy at the press, Old Printer at the table — so the approval also makes that the staging of record and the 31 Aug settlement historical.
Key `approved/CUT-morning/morning-scene-32-7babf524.mp4`. **It supersedes `morning-scene-24`**, approved 27 Aug and the morning cut of record until now. `-24`'s entry stays in `assets.json` and its approved key is untouched; what changed is which cut the drafts index leads with.
55.458333 s, 1331 frames, 1280×720/24 — `morning-scene-24` entire, then `M-07-45`, then `M-08-26` with `shop-bed-m07-m08-01` under the pair at −6 dB, then `M-11-12` with `runner-motif.m4a` back-timed onto the last frame. The build and its measurements are in the four sections above.
The takes are on whole, with their handles. The sheet asks for 6 s of M-07's 7 s and 5 s of M-08's 7 s and neither trim point is settled, so the approved cut runs 2 s longer than the sheet's own lengths. That is a known state, not an oversight: a version at the sheet's lengths is a minute's work once the ends are decided.
`assets.py approve` recorded it without provenance, as it did for `-24` and for the same correct reason — a local ffmpeg assembly matches no Higgsfield job. Unlike `-24`, the derivation was then written into the ledger with `provenance.py derive` (`assembled` from `morning-scene-31` and `runner-motif.m4a`) and copied into the `assets.json` entry, so the approved cut carries its build record in git rather than only in prose.
Nothing was hidden. `-24` and `-29` … `-31` stay on the page; the 27 Aug hide-the-rest sweep was reversed the same afternoon and has not been repeated.
Free: two uploads, ffmpeg and hashing. No credits, no generation.
Mabel, in two messages: "delete m13, we dont need it." and *"we can also combine m14 with m12"*. The morning goes from thirteen rows to eleven.
M-13 was free to cut. It had never been rolled — no takes on disk, nothing in `refs/index.json`, `assets.json` or the ledger — and unlike M-10 it owned no dialogue, so neither fountain changes and `scratch-timings.md` is untouched. Its premise had also already gone: the row turned on *the press is allowed to stop, the talk dies with it*, and Mabel had said that day that nobody is on the press. A shot whose beat is a press stopping cannot play in a shop where no press is running. Only two text references existed. The row itself is gone; the other is in `resources/film-style.md`, which granted one of its two camera-movement exceptions to *M-13's slow pan across a shop going quiet, where the move is the beat*. That exception is retired with the shot rather than reassigned — the remaining exception is the runner's exteriors alone.
M-14 is a retired name, not a gap. IDs stay stable, as they did for M-06 and M-10, so the morning now reads M-01…M-15 less M-06, M-10, M-13 and M-14. The door and the letter are one shot. Nothing is lost in the merge: M-14's German VO (MOR-03, Frankfurt ist dahin…) survives into M-12's audio, and the fountains carry no shot IDs at all, so they needed no edit.
What the combine costs, priced honestly. M-12 was 5 s cut and M-14 was 6 s, so the combined row is 11 s of screen time. The sheet's own bookkeeping had been able to say, since M-10 went, that no row passed Veo's 8 s ceiling; that is no longer true, and M-12 is the exception.
*(Corrected the same day. This entry first claimed 11 s was past what a single generation would give on either Seedance model. That was wrong and the ledger disproves it: `seedance_2_5` has rolled a 10 s take and an 18 s one on this film, and M-15's row has asked for 11 s of Gen since it was written. The real limit is Veo's, it is on screen time rather than generation, and it binds the edit rather than the roll. The error came from reasoning off the sheet's floor sentence — "nothing below 4 s, both Seedance models floor there" — and reading a floor as though it implied a ceiling.)*
So M-12's Gen cell is left unset because nobody has chosen it, not because it cannot be done — one longer generation carrying an internal cut, or two rolls — and the credit estimate that used to close the Reading-it block is withheld until that number exists rather than restated on a guess. This is the same pressure that produced Mabel's first instruction on this beat: M-12/13/14 as a single generation with cuts in it, "I was thinking maybe two". Deleting M-13 and folding M-14 in is that instinct reaching the sheet.
The camera is the whole open decision. Two options are recorded in the row and neither is chosen: one generation carrying an internal cut, or the over-the-shoulder push blocked in Blender the same day — `refs/blender-movies/printshop-shoulder-push-01.mp4`, ten seconds, the Young Printer entering the east side door and crossing to the long table while the camera comes over Lufft's shoulder. The insert grammar is a casualty either way: `shots-morning.md` reserves shallow focus for the inserts, M-03 and the letter landing, and if M-12 is one continuous move from a door to a table then the letter is read in the same breath as the room and has no insert to live in. Recorded as a cost, not a decision.
Reported but not confirmed. A parallel session reported Mabel reversing on the handover — *"Fine you can leave it on the table. But young printer still needs to speak"* — which would take the audio off VO and onto his mouth while he crosses, and would mean he does not stop at the table. The Blender blocking holds him there from f120, so that would need re-keying. It is second-hand and is marked as such in the row.
Free: text only. No generation, no credits, nothing rolled.
Mabel: *"pull all the new clips from higgsfield. put the last generated one together with the aprpoved m11"*.
Higgsfield's video history held 32 completed jobs the ledger did not know. Twenty-four of them are this film and were pulled; **eight are not and were left where they are** — five rolls of 1 Sep (a man airborne over mountains, a camera darting around him) and three of 3 Sep (parkour in a modern city at dusk). They are somebody's other work in the same account; nothing about them is Wittenberg, and pulling them into `refs/` would have put them in the gallery as takes of this film.
The twenty-four sort into three families by prompt, and the names follow the family rather than the download order:
| what | where | jobs |
|---|---|---|
| M-08 — the "Sind neue Aufträge gekommen?" two-shot, 7 s, 2 refs, 15:53 | `M-08-31` | `4bbdd1cd` |
| the two-door wall, ten static "REFERENCE-BASED ROOM RECONSTRUCTION" plates, 16:13–18:07 | `refs/set/shop-doorwall-01…10` | `545d7260` … `d026af22` |
| M-12 — the over-the-shoulder push, the Runner crossing and the letter, 18:17–21:06 | `M-12-01…13` | `b90eee34` … `c4827847` |
Numbering inside each family is chronological by job creation, so `M-12-01` is the 18:17 roll and `M-12-13` the 21:06 one. The doorwall plates are set material, not takes: they carry the prompt's own *NO camera movement, NO moving objects*, and they exist to give M-12 the wall Reference 1 never showed — so they live in `refs/set/` beside `runner-path-04-sign-*`, which are videos there for the same reason.
M-12's rolls walk the duration up: 4 s once, then 10 s five times, then 13 s seven times. That is the open Gen decision in `PLAN.md` being worked on directly — 11 s of screen time against what one generation will give — and thirteen seconds of Seedance is now on disk, so the ceiling is not the obstacle. Nobody has chosen the camera yet and this does not choose it; the whole family is the over-the-shoulder push, so the internal-cut option has still never been rolled.
One job was still running when this was written: `b5e4a3c2`, started 21:17, 13 s, `in_progress`. It is not on disk and is not in the ledger. Pull it when it lands; it will be `M-12-14` if it is the same push.
All twenty-four were verified against the history's own `Content-Length` before being counted as pulled — one (`M-12-07`) came down short on the first pass and was re-fetched — and `tools/provenance.py sync` then matched every one of them to its job by bytes, so the model, prompt, references and settings on the gallery are first-hand rather than inferred. Free: downloads only, no credits, nothing generated.
"the last generated one" is `M-12-13` — job `c4827847`, 21:06, the newest completed job at the time of writing. `b5e4a3c2` is newer but had not finished, so it is not it.
| From | To | What |
|---|---|---|
| 0.000 | 4.667 | `M-11-12` whole — the approved M-11, the local trim of `M-11-08` |
| 4.667 | 17.708 | `M-12-13` whole, 13.042 s — the newest M-12 roll |
17.708333 s, 425 frames (112 + 313), 1280×720/24. Cut order: M-11 is the runner reaching the door, M-12 is the door and the letter, so the join is the runner going in and arriving.
The time_bases did not agree, and that was checked before the concat as this page's rule requires: `M-11-12` carries 1/12288 and `M-12-13` carries 1/90000 — the second such mismatch on this film. Both were remuxed video-only to a common 1/12288 and then concat-copied, so the copy still holds.
Every frame is bit-identical to its source, checked by decoding each range back out of the finished file:
| frames | decodes to | which is |
|---|---|---|
| 0–111 | `3838eb20…` | `M-11-12`'s whole video stream — the same MD5 `morning-scene-31` recorded |
| 112–424 | `6bf0eeca…` | `M-12-13`'s |
The audio is assembled sample-exact, not copy-concatted, for the reason `-27` first wrote down: AAC segments drift one 1024-sample frame per join under `-c copy`. Each segment was decoded to 48 kHz, fitted to its own picture length, concatenated and encoded once at 192k/48k.
Levels.
| segment | mean | peak |
|---|---|---|
| `M-11-12` | −34.8 dB | −13.2 dB |
| `M-12-13` | −32.0 dB | −6.2 dB |
| whole reel | −32.6 dB | −6.2 dB |
`M-11-12` measures exactly what it measured inside `morning-scene-31`, which is the check that the head went in at unity and untouched.
Nothing was levelled, nothing was layered and no music was added. This is the plain join Mabel asked for — two takes end to end at their own levels — not a `-32`-style build with a motif over it. `M-12-13` carries the Seedance rolls' native audio, which is not the film's sound and will be replaced by the dub.
M-12 has no approved take and this cut does not make one. `M-12-13` is here because it is the newest, which is a fact about the clock and not a judgement; twelve other M-12 rolls are on the gallery beside it.
Free: ffmpeg only, no credits, no generation. `-32` is untouched and nothing was renumbered.
Mabel: "pull more from higgsfield". Six new completed jobs since the pull an hour earlier, all of them M-12, all 13 s, all nine references. Numbered chronologically as before:
| take | job | rolled |
|---|---|---|
| `M-12-14` | `b5e4a3c2` | 21:17 — the one that was still running at the last pull |
| `M-12-15` | `ee6f958b` | 21:29 |
| `M-12-16` | `5a9cb9fa` | 21:43 |
| `M-12-17` | `9dd36c04` | 21:56 |
| `M-12-18` | `1e23e080` | 22:06 |
| `M-12-19` | `e1cd73bd` | 22:17 |
Nothing new in the image or audio histories — both were checked this time, not just video, and every completed job in them is already in the ledger. The eight unrelated rolls (airborne, 1 Sep; parkour, 3 Sep) are still left where they are, and one job was still running at 22:30 (`b70e17d3`); it will be `M-12-20`.
THE PROMPT WAS CUT ROUGHLY IN HALF AT 21:43. `M-12-14` and `-15` carry the same 16,900-character prompt as `M-12-13`; `M-12-16` drops to 7,814 and `-17` through `-19` sit at 8,121. That is the sharpest break in the M-12 family so far and the takes either side of it should not be compared as though they were the same ask. What changed with it, read off the short version:
It is still the shoulder push. *The camera begins behind Lufft's shoulder and never shows him from the front*, one continuous slow dolly, no cut. So the second option on M-12's open Gen decision — **one generation carrying an internal cut — still has not been rolled once** across all nineteen takes. `PLAN.md`'s camera question is not being narrowed by this run; it is being explored down one branch.
Free: downloads only, no credits, nothing generated. `morning-scene-33` is untouched and nothing was renumbered.
Mabel: *"pull anything else from higgsfield. not any dumb ones with the guy falling over." — which *settles the eight unrelated jobs by instruction rather than by an agent's judgement**. The five airborne rolls of 1 Sep and the three parkour rolls of 3 Sep stay out of `refs/` for good; they are not this film and nobody has to re-decide it at the next pull.
Seven new completed jobs, 22:30 through 00:49, all M-12, all 13 s, nine references each:
| take | job | rolled | prompt |
|---|---|---|---|
| `M-12-20` | `b70e17d3` | 22:30 | 17,811 |
| `M-12-21` | `848100fd` | 22:45 | 17,811 |
| `M-12-22` | `5d4d6b6e` | 23:11 | 17,290 |
| `M-12-23` | `ed8be07a` | 23:40 | 19,617 |
| `M-12-24` | `9241f7db` | 00:07 | 41,289 — doubled, see below |
| `M-12-25` | `9390d788` | 00:31 | 41,289 — the same doubled prompt |
| `M-12-26` | `2c99d051` | 00:49 | 21,655 |
Image and audio histories checked again; nothing new in either. One job was still running at 16:25 on 8 Sep (`449e14f1`) and will be `M-12-27`.
THE SHORT PROMPT WAS ABANDONED. `M-12-16…19` were the ~8,100-character rewrite of 21:43 — camera on sticks, named 24 mm lens, opening wide and well back. Every one of these seven returns to the long prompt of `M-12-13`: *THE CAMERA. It begins CLOSE BEHIND ONE MAN'S SHOULDER, one camera, no cut anywhere in it, no dissolve, no fade, no wipe, no change of angle and no second camera*. So the short experiment ran four takes and stopped, and the family is long-prompt either side of it.
`M-12-24` AND `-25` WERE ROLLED ON A PROMPT THAT CONTAINS ITSELF TWICE. Of the 41,289 characters, 18,822 are duplicate paragraphs — 36 of them, including the whole `THE CAMERA` block, the whole `SOUND` block and the galley description. Checked by counting paragraphs over 200 characters: `M-12-23` has 30 with no duplicates, `M-12-26` has 35 with no duplicates, and `M-12-24` has **75 with 36 duplicated**. It reads as an accidental double-paste rather than deliberate emphasis, and it is the same prompt for both rolls.
What that means for looking at them: `-24` and `-25` are not a clean point of comparison against their neighbours. Seedance weights repetition, so a doubled prompt is not a neutral restatement of the same ask — whatever these two do differently may be the duplication talking rather than the direction. If either looks right, **re-roll it on `M-12-26`'s clean 21,655-character version before building anything on it.** No claim is made here about how they actually look; that is Mabel's eye, and both are on the gallery.
What the long prompt grew between `-23` and `-26` (setting the duplication aside): the contents of the long oak table, laid out object by object as *the things the camera comes to rest among*, and a long block of reaction direction — *NONE OF THE THREE MEN IS SURPRISED… their faces are tired and flat rather than shocked, but THEY DO STOP, AND THEY DO PAY ATTENTION. *That is M-15's beat being written into M-12.* `shots-morning.md` gives M-15 A chain of faces. No one gasps. No one is even surprised — that is the worst of it.* If M-12 now carries the non-reaction, M-15 either pays off something the audience has already been shown or it duplicates it. Recorded as a consequence to decide, not a decision.
The people count moved too: the 20:22 roll (`M-12-11`) shouted *EXACTLY FOUR PEOPLE IN THE SHOP* — Lufft, the Old Printer, the Apprentice, the Runner — and these say the three men, the Runner counted separately as he crosses. Worth knowing before the takes are compared for who is in frame.
Still no internal cut. Twenty-six M-12 takes, every one of them the over-the-shoulder push. The second option on the row's open Gen decision has never been rolled.
Free: downloads only, no credits, nothing generated. `morning-scene-33` is untouched and nothing was renumbered.
Pulled at the end of the session, all M-12, all 13 s, nine references.
| take | job | rolled | prompt |
|---|---|---|---|
| `M-12-27` | `449e14f1` | 16:25 | 21,655 — the same clean prompt as `M-12-26` |
| `M-12-28` | `db460ab1` | 16:45 | 23,122 |
| `M-12-29` | `9d734885` | 16:53 | 14,614 — a third rewrite |
`M-12-29`'s prompt is a new one, shorter than the long family and longer than the abandoned 8 k version, and it **names Lufft in the camera block for the first time*: The camera begins CLOSE BEHIND HANS LUFFT'S SHOULDER, inside the shop*, where every earlier long-prompt roll said only ONE MAN'S SHOULDER. The move is unchanged — one continuous dolly forward about two metres, drifting slightly right, a physical push forward. Whose shoulder it is has been implicit since the short-prompt run said so at 21:43 the night before; this is the first time the long line carries it.
Twenty-nine M-12 takes, and every one is the shoulder push. The internal-cut option remains unrolled.
Free: downloads only, no credits, nothing generated.
Mabel asked for the prompt for the internal cut. Written to `probes/video/m12-internal-cut-prompt.txt` (9,766 characters) and posted to thread t13. Nothing was rolled and no credits were spent.
It is the second of the row's two live camera options — *a single generation carrying an internal cut*, which is where her first instruction on this beat was already pointing (*M-12/13/14 as a single generation with cuts in it, "I was thinking maybe two"*). Twenty-nine M-12 takes exist and every one is the other option, the over-the-shoulder push, so this prompt is the first thing written for the branch nobody has rolled.
The structure: one generation, exactly one hard straight cut, two locked-off shots and no camera movement in either.
This is the option that buys the insert grammar back. `PLAN.md` records the insert grammar as a casualty of the push — *one continuous move from door to table reads the letter in the same breath as the room* — and `shots-morning.md` reserves shallow focus for M-03 and the letter landing. The cut gives the letter its own shot at its own focal length, which is exactly what that reservation was written for. **That is an argument for this option and it is now on the record; it is not a decision, and Mabel has taken neither.**
Three choices made inside the prompt, all reversible and all flagged to her.
1. No fall. The prompt carries an explicit *DOES NOT TRIP, DOES NOT STUMBLE AND DOES NOT FALL*. Only `M-12-26` and `-27` were rolled on a prompt containing the trip over the table stretcher and the body going down full length; `-28` and `-29` dropped it again. Mabel's *"not any dumb ones with the guy falling over"* was said of the eight unrelated jobs, but it reads on this material too, and the prompt is written the safe way round. **Ambiguity recorded rather than resolved** — if she wants the fall it goes back in. 2. He does not stop at the table. This follows the **reported but not confirmed* reversal in the row ("Fine you can leave it on the table"*). It suits the structure, since shot two ending on the letter with nobody in frame is the reason to have the cut at all. Still second-hand. 3. VO, not on camera — NO DIALOGUE IS SPOKEN ON CAMERA, so the Frankfurt line stays dubbed as the row has it. **The other half of the same reported reversal ("young printer still needs to speak") pulls against this**: if he speaks on camera, shot two needs his face in it and the letter loses its clean last frames. The two halves of that reversal are in tension under this structure and that should be settled before it is rolled.
THE NUMBER is protected by construction here, not by inspection — the stronger of the two guarantees, and the one the M-08 rows lost. The prompt forbids numerals on any surface in either shot and makes the letter an illegible brown scrawl even though it is the sharpest thing in the second shot. A 1:1 read of any result is still owed: this puts a written surface closer to the lens than anything else in the morning.
Free: text only. No generation, no credits, nothing rolled.
Mabel: "pull any unpullen vids from higgsfield". Seven new completed jobs since the last pull, 17:16 through 18:48, all M-12, all `seedance_2_5` at 720p24, all nine references — the same nine reference images for all seven, so nothing in this run varies by what was fed in.
| take | job | rolled | duration | prompt |
|---|---|---|---|---|
| `M-12-30` | `ca08ca6c` | 17:16 | 13 s | 14,614 — byte-identical to `M-12-29`'s |
| `M-12-31` | `1fdf3037` | 17:30 | 13 s | 14,614 — the same again |
| `M-12-32` | `10a248dc` | 17:45 | 13 s | 14,080 — a rewrite, see below |
| `M-12-33` | `16abf8eb` | 18:07 | 13 s | 14,080 — byte-identical to `-32`'s |
| `M-12-34` | `6cd106e3` | 18:24 | 13 s | 14,080 |
| `M-12-35` | `953567ea` | 18:37 | 13 s | 14,080 |
| `M-12-36` | `78b75fe8` | 18:48 | 10 s | 14,080 |
Numbered chronologically by job creation as the family always has been. No duplicated paragraphs in any of the seven — checked the way `M-12-24`/`-25` were, counting paragraphs over 200 characters — so unlike that pair these are clean points of comparison against each other. Image and audio histories were checked too: nothing new in either, and no job is currently in flight — the first pull in a while where the history has nothing still running.
Four jobs in the history are refusals and have no result to pull, which is not the same as being unrelated work. `ab141052` (video, 1 Sep 17:03) is *this film — no camera movement at all… change the signs and make them more classy… make sure everything is authentic* — a sign plate for the runner's path, of a piece with `refs/set/runner-path-04-sign-*`; Higgsfield returned status `nsfw` and no `result_url`. Three image jobs of 12 Aug (`0d4741ef`, `342b3f66`, `37d35656`) are the same story. Nothing to download, and the ledger cannot record them: there are no bytes.
The eight unrelated jobs are still out, by Mabel's instruction of 8 Sep: the five airborne rolls of 1 Sep and the three parkour rolls of 3 Sep. They are still the eight, still not Wittenberg, and re-verified by prompt on this pass rather than assumed.
The rewrite at 17:45 is small in character count and large in what it says. `M-12-29`'s prompt insisted **EXACTLY ONE DOOR IN THE ENTIRE SHOP. It is the street door. No second door, interior doorway, or additional opening exists.** `M-12-32` onward says Exactly two street doors throughout, and describes both doors in the same plank-and-iron-band terms. That is the ten doorwall plates in `refs/set/shop-doorwall-01…10` — rolled on 7 Sep precisely to give M-12 a wall Reference 1 never showed — arriving in the prompt. The one-door line had been the family's hardest constraint since the beat was first rolled; it is gone.
Three smaller changes came with it, all in the same direction — **the Runner is dialled down**:
Also dropped: The camera never pans, tilts, or reframes to follow him, and the negative lighting list (*No candles, lamps, fireplace, brazier, smoke, steam, vapor, haze) shortened to Daylight only*. Both are constraints removed, not directions added.
`M-12-36` is the first M-12 rolled at 10 s since `M-12-02…06` — the family walked 4 → 10 → 13 back on 7 Sep and has sat at 13 ever since. The row needs 11 s of screen time, so a 10 s take is under it; whether that is a retreat or a trim is Mabel's call and this page does not make it.
Still the shoulder push. All seven carry the `CAMERA` block that begins CLOSE BEHIND HANS LUFFT'S SHOULDER and makes *ONE continuous movement: a slow, steady dolly forward approximately two metres. *Thirty-six M-12 takes, and the internal-cut option has still never been rolled** — the prompt for it has been written (`probes/video/m12-internal-cut-prompt.txt`, posted to thread t13) and is still sitting unrolled.
All seven were verified against the history's own `Content-Length` before being counted as pulled — every one landed complete on the first attempt, no re-fetch needed — and `tools/provenance.py sync` then matched all seven to their jobs **by bytes**, so the model, prompt, references and settings on the gallery are first-hand. Every one decodes to 1280×720 at 24 fps, `time_base` 1/90000 (the value that had to be remuxed for `morning-scene-33`'s concat — expect the same if any of these are cut against an older take), 313 frames for the six 13 s rolls and 241 for `M-12-36`.
Free: downloads only, no credits, nothing generated. Nothing was renumbered and no cut was built.
Mabel: "pull new takes from higgsfield". Six new completed video jobs since the last pull, 19:15 through 20:23 UTC, all M-12, all `seedance_2_5` at 720p24, all 10 s.
| take | job | rolled (UTC) | refs | prompt |
|---|---|---|---|---|
| `M-12-37` | `3c898110` | 19:15 | 9 | 14,480 — a rewrite, see below |
| `M-12-38` | `13ae4ad5` | 19:34 | 9 | 14,480 — byte-identical to `-37`'s |
| `M-12-39` | `aed00d8d` | 19:46 | 9 | 14,325 — two anti-movement lines cut |
| `M-12-40` | `f9dcb0a4` | 19:57 | 8 | 14,325 |
| `M-12-41` | `cee45fac` | 20:13 | 8 | 14,325 |
| `M-12-42` | `0fa2ff27` | 20:23 | 8 | 14,103 — the lapped-doublings note cut |
Numbered chronologically by job creation, as the family always has been. No duplicated paragraphs in any of the six. Image and audio histories were checked: nothing new in either.
The camera instruction is reversed. For thirty-six takes the `CAMERA` block opened CLOSE BEHIND HANS LUFFT'S SHOULDER and called for *ONE continuous movement: a slow, steady dolly forward approximately two metres*. From `-37` it opens The camera is essentially LOCKED OFF for the entire shot and forbids the move outright — *NO deliberate camera movement… The composition remains essentially unchanged from first frame to last* — with the Runner now required to leave frame and return into the edge of the SAME STATIC FRAME. The ending changed with it: *the camera reaches the NEAR/HEAD END OF THE LONG OAK TABLE and stops became the camera remains fixed in its original position*.
But the wording alone did not hold it. `-37`, `-38` and `-39` still push: Lufft's shoulder is gone from frame by t≈3.3 s, exactly as in `-36`. What actually stopped the camera was dropping a reference. `-40` onward run eight references instead of nine, and the one dropped is `refs/blender-movies/printshop-shoulder-push-01.mp4` — the Blender blocking of the very move the prompt was now forbidding. It had been in the bundle for every M-12 take from `-02` to `-39`. In `-40`, `-41` and `-42` the shoulder sits in frame at t=0 and is still there at t=9.9 s.
Measured on the ceiling strip (top 60 px of a 480×270 grey reduction, sampled at 4 fps, mean difference against the take's own first frame — people do not walk through it, so what moves there is the camera):
| `-36` | `-37` | `-38` | `-39` | `-40` | `-41` | `-42` | |
|---|---|---|---|---|---|---|---|
| drift | 33.8 | 39.0 | 31.3 | 27.2 | 20.2 | 17.1 | 10.0 |
A proxy, not a measurement of the camera itself, but it agrees with what the frames show: the reference bundle was beating the prompt, and `-42` is the most locked-off take the family has.
**This is a third camera option, and it is now the only one that has been rolled as such.* `PLAN.md` still frames the open decision as the internal-cut version, or the over-the-shoulder push blocked in Blender* — a static over-the-shoulder frame is neither, and it is not recorded there. The internal-cut option remains unrolled (`probes/video/m12-internal-cut-prompt.txt`, posted to thread t13). Left for Mabel; nothing in `PLAN.md` was changed.
`-42` also drops the paragraph asking for printed sheets in *LAPPED DOUBLINGS… continuous ripples of paper*, and hangs them as evenly spaced individual sheets instead, and softens a prosperous working print shop to a working print shop.
A seventh job was still in flight at pull time (`ebade4a3`, 20:32 UTC, 10 s, same family) — it will be `M-12-43` on the next pull. The one `nsfw` refusal in the video history (`ab141052`, 1 Sep) is the sign plate already written up in the previous entry, not new. Nine other completed jobs in the window belong to another project entirely — an airborne figure (1 Sep) and urban parkour (3 Sep) — and are left unmatched on purpose.
All six were verified against the history's own `Content-Length` before being counted as pulled — every one landed complete on the first attempt, no re-fetch needed — and `tools/provenance.py sync` then matched all six to their jobs **by bytes**, so the model, prompt, references and settings on the gallery are first-hand. Every one decodes to 1280×720 h264 yuv420p at 24 fps, `time_base` 1/90000 (remux still needed if these are concatenated against an older take), 241 frames, with AAC stereo at 32 kHz.
Free: downloads only, no credits, nothing generated. Nothing was renumbered and no cut was built.
Mabel: "pull more". Six more completed video jobs, 20:32 through 21:50 UTC, all `seedance_2_5` at 720p24, all 10 s. The history is now **empty of anything in flight** — `ebade4a3`, which was still running at the last pull, is `M-12-43`.
| take | job | rolled (UTC) | refs | prompt |
|---|---|---|---|---|
| `M-12-43` | `ebade4a3` | 20:32 | 8 | 13,963 — the door goes half open |
| `M-12-44` | `18b85cc6` | 20:42 | 8 | 13,963 — byte-identical to `-43`'s |
| `M-12-45` | `77b73777` | 20:52 | 7 | 15,330 — the anti-startle rewrite |
| `M-12-46` | `9f30ad36` | 21:21 | 7 | 14,820 |
| `M-12-47` | `5afe4a7a` | 21:31 | 7 | 14,094 — the shoulder is removed |
| `M-12-48` | `3a34fcd2` | 21:50 | 7 | 14,061 — truncated mid-word, see below |
A second reference is dropped, and it should have gone long ago. From `-45` the bundle is seven references, not eight. The one dropped is a raw **Blender viewport screenshot** — 841×499, and not a render: it carries the selection gizmos, the light empties, the dashed camera-frame overlay, the 3D cursor and the viewport sidebar icons. It had been fed to Seedance as a reference image for every M-12 take from `-01` to `-44`, forty-four of them, and for three `shop-doorwall` stills besides. Nothing in the repo matches it by size, so it was never saved locally; it exists only as an upload.
`-45` is an anti-startle rewrite. The men had been snapping round at the door, and `-45` answers it at length — each of the three now gets *NO JERK. NO FLINCH. NO STARTLE. NO SUDDEN HEAD SNAP., and the group beat gains IMPORTANT: THERE IS NO DRAMATIC STARTLE REACTION… their movements remain smooth, calm, and unhurried, as if they heard the door and recognized someone entering.* That is what takes the prompt to its longest yet, 15,330 characters. `-46` trims some of it back out.
`-47` removes the over-the-shoulder framing altogether. *Camera is positioned inside the shop, close behind HANS LUFFT'S SHOULDER. His back and near shoulder fill the lower-left foreground, dark, soft, and out of focus. The far side of the room is sharp beyond him becomes, in full, Camera is positioned inside the shop. The core instruction survives — LOCKED OFF* and the Runner's return into the SAME STATIC FRAME are both still there in `-47` and `-48` — but several reinforcing lines go with the shoulder (The camera does NOT follow the Runner, NO deliberate camera movement). The frames follow the prompt exactly: the shoulder holds the foreground for all ten seconds in `-43`, `-44`, `-45` and `-46`, and is simply absent from `-47` and `-48`, which sit inside the room as a clean locked-off wide.
So M-12 now has two rolled locked-off options, not one: the static over-the-shoulder (`-40`…`-46`) and the static wide with no shoulder at all (`-47`, `-48`). Ceiling-strip drift, measured as in the previous entry:
| `-43` | `-44` | `-45` | `-46` | `-47` | `-48` | |
|---|---|---|---|---|---|---|
| drift | 8.8 | 12.9 | 5.2 | 19.8 | 4.2 | 12.2 |
`-45` and `-47` are the two stillest takes the family has produced.
Three prompt defects went out in these rolls, and they are in the takes:
None of the three is obviously visible in the footage, but all three are in the prompt of record for those takes, and `-46`'s survives into the two newest.
All six were verified against the history's own `Content-Length` before being counted as pulled — every one landed complete on the first attempt — and `tools/provenance.py sync` matched all six to their jobs by bytes. Every one decodes to 1280×720 h264 at 24 fps, `time_base` 1/90000, 241 frames.
The history window has begun to turn over. Video is at its 100-job cap, and the `nsfw` sign-plate refusal `ab141052` written up two entries ago has now fallen out of it — a reminder that `provenance.py sync` can only ever reconstruct what is still inside the window, which is why the ledger is committed.
Free: downloads only, no credits, nothing generated. Nothing was renumbered and no cut was built.
M-15 is written and unrolled. It was the last morning row with no prompt of any kind — nine of the eleven shots have approved takes, M-12 has 48 takes and no pick, and M-15 had nothing. The prompt is one slow right-to-left pan on a tripod at chest height, pivoting in place, deep focus, no rack between faces: it opens already moving on Lufft at his type case, crosses the Apprentice at the long table and the Young Printer beyond its near end, decelerates over its last two seconds and holds motionless on the Old Printer at the counting desk with his head down. About two and a half seconds a man. A pan needs none of M-01's exceptions — it is inside the motivated-camera rule as written.
Three things the writing settled.
The reference list was short by three. The row named `old-printer-summer-02` and `shop-day-26` — the set and one face out of four — for a shot that pans across four men. That hands the model three faces to invent, which is the unapproved-face failure M-11's watchers-behind-glass staging exists to prevent and the one `M-01-18` demonstrated when a reference-free take came back with the legwear invented. All four sheets now go in, and the runner's is `young-printer-smear-08` rather than `young-printer` — the same correction this sheet already made to M-11, for the same reason: both approved runner takes were built on `-08`.
THE NUMBER is safe here by construction, and it had to be designed. M-15 is the one morning shot that ends on the counting desk, which is exactly where the number would live: `shop-day-26`'s account book is hand-ruled and hand-filled with gulden, groschen and pfennig columns. So the book is closed — front cover up, clasp fastened — for the whole shot, nobody opens or touches it, and the Old Printer rests both hands on the shut cover and thinks about the accounts instead of reading them. The letter stays where M-12 dropped it, written-side down, and the camera passes it without stopping or tilting to it. No readable text surface means no 1:1 numeral inspection is needed to clear the take — the strong guarantee, where `M-08-26` has only the weak one.
Nobody speaks, so nothing needs lip-syncing. The Old Printer's line is VO, laid in at edit stage as the runner motif is, so the clip is generated silent of speech. That is the opposite of M-08, which still holds an undecided lip-sync question because it has two named speakers on camera.
And one thing the writing exposed, which is Mabel's to settle. The Old Printer is in two places. Every rolled M-12 take has him beneath the drying cords with a printed sheet in both hands; M-15's row has him at the counting desk with the book. A hard cut between them walks him across the room in no time at all. Three ways out, none chosen: end the pan on him where M-12 left him and lose the counting desk, which is the thematic point of the shot; accept the transit as an off-screen beat and let the pan imply the time; or re-stage M-12's Old Printer at the desk, which means re-rolling a family 48 takes deep. It is the only thing between this prompt and a roll, and the roll is free — 11s at 720p on `seedance_2_5` with Unlimited on, under the corrected duration rule of 7 Sep. M-15 is the first row specced knowing that; every earlier row wanting more than five seconds was written as though it were a credit spend.
**The M-12 wide's three prompt defects are repaired in a working prompt, not in the ledger.** `refs/provenance.json` is evidence and is untouched: `-46`, `-47` and `-48` keep the text that actually made their pixels. What is repaired is the prompt a next roll would start from, and the two families now have one working file each — `probes/video/m12-lockedoff-wide-prompt.txt` (from `-47`, the stillest of the wide) and `probes/video/m12-lockedoff-shoulder-prompt.txt` (from `-45`, the stillest of the shoulder). Both are scaffolding and stay out of git; what is committed is this note and the sheet.
The two M-12 families are not the same prompt minus a shoulder. Diffed today: the wide also drops six clauses the shoulder version keeps — the explicit *does NOT pan, tilt, orbit, track, dolly, crane, zoom list; NO deliberate camera movement; the account book's closed, front cover up, clasp fastened*; the Apprentice's must not be confused with the brown-haired Runner; the four-line NO ONE JERKS block; and the note that the Runner leaves frame because the camera is static. It still measured the lower drift, 4.2 against 5.2. If the wide is picked, the next roll should carry those clauses back rather than inherit `-47`'s trimmed text. The closed-book clause matters most of the six: it is a THE NUMBER protection, and the wide has it only as Nobody touches it.
Free: no generation, no credits. Nothing was renumbered and no cut was built.
Mabel: "ok clip m12 47 with the approved m11", then *"make sure you include the music"*. So this is `morning-scene-33`'s join — the approved M-11 against one M-12 roll — rebuilt on `M-12-47` and with `runner-motif.m4a` over the M-11 slot, which is `-32`'s treatment. 14.708333 s, 353 frames (112 + 241), 1280×720/24.
| From | To | What |
|---|---|---|
| 0.000 | 4.667 | `M-11-12` whole — the approved M-11, the local trim of `M-11-08` |
| 4.667 | 14.708 | `M-12-47` whole, 10.042 s |
Cut order is the sheet's: M-11 is the lane and the runner reaching the door, M-12 is the door and the letter.
The time_bases did not agree and were reconciled before the concat, as this page's rule requires: `M-11-12` carries 1/12288 and `M-12-47` 1/90000 — the third such mismatch on this film. Both were remuxed video-only to a common 1/12288 and then concat-copied, so the copy still holds.
Every frame is bit-identical to its source:
| frames | decodes to | which is |
|---|---|---|
| 0–111 | `3838eb20…` | `M-11-12`'s whole video stream — the same MD5 `-31` and `-33` recorded |
| 112–352 | `176ae4ba…` | `M-12-47`'s |
The audio is assembled sample-exact, not copy-concatted, per `-27`'s rule. `M-11-12`'s audio decoded 3328 samples long — the same 3328 `-31` and `-33` measured — and was trimmed to 224000; `M-12-47`'s decoded 1840 long and was trimmed to 482000.
Back-timed, not stretched. `runner-motif.m4a` decodes to 26.238563 s at 48 k (1259451 samples) and its final solid accent is at 26.065 s. The cue's own end is aligned to the end of the M-11 slot, so what plays is its last 4.666667 s — in-point sample 1035451, cue 21.571896 s — at unity and at its recorded speed. Because the M-11 slot is the same 4.666667 s it was in `-32`, the in-point is the same 21.5719 that entry recorded, arrived at independently here.
The final accent therefore lands at reel 4.493 s, frame 108 of 112, and the decay runs out on the last frame of M-11:
``` reel 4.475 4.500 4.525 4.550 4.575 4.600 4.625 4.650 | 4.675 dB -14 -12 -13 -14 -14 -16 -24 -41 | -36 ^ the accent decay -> | ^ cut to M-12-47 ```
A 10 ms fade-in at the in-point, a click guard and nothing else: the cue is mid-phrase there and a hard start on a non-zero sample clicks. Timing and speed untouched. No music over M-12 — the interiors are unscored.
The 4 Aug approval note says the cue was trimmed to stop dead on its final accent "so the M-12 door bang plays as the sound after the music's last hit." `-32` placed the hit for a door that had no footage. This is the first build where M-12 footage actually follows it, so the effect can be heard for the first time — and it does not land, because `M-12-47` does not open on the door.
Checked frame by frame: the take opens on the shop working quietly — Lufft at the type case, the old printer with a sheet, the apprentice at the table — and the runner does not appear at the door until about 2.5 s in (a figure enters the right edge at frame 60, the men begin turning by frame 68). The first 1.9 s of the M-12 slot sit between −36 and −47 dB: near-silence. So what plays is the hit, then two and a half seconds of calm interior, then the entrance.
That is a fact about which roll this is, not about the placement. A take that opens on the door — or a trim of this one that starts at its frame 60 — would put the bang where the cue was built to leave room for it. **Nothing was trimmed here: Mabel asked for `M-12-47`, so `M-12-47` goes in whole.**
| segment | mean | peak |
|---|---|---|
| `M-11-12` + motif | −12.6 dB | −0.4 dB |
| motif tail alone | −12.6 dB | −0.5 dB |
| `M-12-47` location | −26.8 dB | −3.1 dB |
| whole reel | −17.2 dB | −0.4 dB |
The motif tail measures the −12.6 mean / −0.5 peak `-32` recorded for it, which is the check that it went in at unity and untouched. Whole-reel peak is −0.4 dBFS — no overshoot; `-32`'s single +0.030 sample lived in the `-24` head, which is not in this reel.
M-12 still has no approved take and this cut does not make one. `M-12-47` is here because Mabel named it; fifty-one other M-12 rolls are on the gallery beside it.
Free: ffmpeg only, no credits, no generation. `-32` and `-33` are untouched and nothing was renumbered.
Mabel: "cut one second off the first part of m12 47". `-34` had just shown why: `M-12-47` opens on the shop working quietly and the runner does not reach the door until about 2.5 s in, so the motif's final accent — placed on the M-11/M-12 cut, where the door bang was meant to answer it — was followed by two and a half seconds of calm interior.
The first second (24 frames) off the head: 241 frames → 217, 9.041667 s. Made the way `M-11-12` was made from `M-11-08`, with the same encode settings:
``` ffmpeg -y -ss 1.0 -i refs/takes/M-12-47.mp4 -c:v libx264 -crf 12 -preset slow \ -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart refs/takes/M-12-53.mp4 ```
It is a re-encode, so it is not bit-identical to its source and cannot be checked by MD5 the way a stream copy can. **The cut point was confirmed by PSNR instead**, which is the check that fits a re-encode:
| aligned against `M-12-47` at | average PSNR |
|---|---|
| offset 23 frames | 30.29 dB |
| offset 24 frames | 51.16 dB (min 49.99) |
| offset 25 frames | 30.27 dB |
Fifty-one dB against thirty either side: the trim starts on frame 24 exactly, not near it. The residual against a perfect copy is the crf-12 re-encode and nothing else. `M-12-47` is untouched on disk and stays on the gallery.
It is a take number, not an approval — the same status `M-11-12` had before Mabel picked it. M-12 still has no approved take.
`-34` with `M-12-53` in place of `M-12-47` and nothing else changed. 13.708333 s, 329 frames (112 + 217), 1280×720/24.
| From | To | What |
|---|---|---|
| 0.000 | 4.667 | `M-11-12` whole — the approved M-11 |
| 4.667 | 13.708 | `M-12-53` whole, 9.042 s |
The time_bases agreed for once — the re-encode wrote `M-12-53` at 1/12288, which is `M-11-12`'s — so the reconciliation this page usually records was not needed. Checked before the concat regardless.
Both segments are bit-identical to their sources, the check that survives here because the concat is a stream copy even though the trim was not:
| frames | decodes to | which is |
|---|---|---|
| 0–111 | `3838eb20…` | `M-11-12`'s — the same MD5 as `-31`, `-33` and `-34` |
| 112–328 | `042aa6b6…` | `M-12-53`'s whole video stream |
Audio assembled sample-exact per `-27`'s rule: `M-11-12` decoded 3328 long and was trimmed to 224000, `M-12-53` decoded 2224 long and was trimmed to 434000.
The cue is placed identically to `-34` and `-32` — back-timed to end on the M-11/M-12 cut, in-point sample 1035451 (cue 21.571896 s), 10 ms fade-in, unity, no stretch. The M-11 slot did not change, so nothing about the music needed to. The accent still lands frame 108 of 112.
Everything in the M-12 slot moved exactly one second earlier, which is what the measurement shows and what the PSNR guarantees:
| `-34` | `-35` | |
|---|---|---|
| music's last accent | 4.493 s | 4.493 s |
| cut to M-12 | 4.667 s | 4.667 s |
| first loud event in the slot | 6.550 s | 5.550 s |
| runner visible at the door | ~7.2 s | ~6.2 s |
The dead patch between the hit and the shop coming alive is **0.9 s instead of 1.9 s**. It is tighter and it is better, and it is still not the bang landing on the hit: `M-12-53` opens on the same quiet shop, one second less of it. Only a roll that opens on the door — or a deeper trim, which starts eating the quiet the shot wants before the interruption — puts the bang where the cue leaves room for it. **A second was asked for and a second was cut; the rest is a note, not a change.**
| segment | mean | peak |
|---|---|---|
| `M-11-12` + motif | −12.6 dB | −0.4 dB |
| `M-12-53` location | −26.4 dB | −3.1 dB |
| whole reel | −16.9 dB | −0.4 dB |
`M-11-12` + motif measures −12.6 / −0.4, the same as in `-34` and `-32`, which is the check the head went in untouched. No overshoot.
Free: ffmpeg only, no credits, no generation. `-34` is untouched, `M-12-47` is untouched, and nothing was renumbered.
Mabel: "approve m12 53". M-12 has an approved take for the first time — `refs/takes/M-12-53.mp4`, keyed at `approved/M-12/M-12-53-f14847ac.mp4`.
It is the local trim recorded above: `M-12-47` less its first second, 217 frames, 9.042 s, from the locked-off camera prompt — the wording that holds the frame still, 0 px drift measured first frame to last. `M-12-47` itself stays on the gallery unapproved, as do the other fifty-one M-12 rolls.
No job made these bytes, so `assets.json` carries the derivation rather than a model: `trimmed` / `local`, from `M-12-47` (job `5afe4a7a-3fec-49b5-b27f-ef5143bec708`, `seedance_2_5`, 10 s 720p). The approval note first went in citing `5533da` as that job id, which was wrong — `5533da` is the prompt-hash label from the grouping used to sort the rolls by prompt, not a job id. Corrected in place the same minute; recorded here because the note is the durable record and a wrong job id makes the take unreferenceable.
This settles the take, not the shot. M-12's Gen and camera decision is still open in `PLAN.md`: the approved take is a 10 s roll trimmed to 9.042, and the combined row asks for 11 s of screen time. The internal-cut and mild-pan options are both still unrolled against it.
With this, the morning has ten of eleven shots approved — only M-15 is now without a take.
Mabel: "take morning scene 32 and add the approved m12 clip". So this is `morning-scene-32` entire with `M-12-53` whole after it, and nothing else changed. 64.500000 s, 1548 frames (1331 + 217), 1280×720/24.
| From | To | What |
|---|---|---|
| 0.000 | 55.458 | `morning-scene-32` entire — black, `M-01-20`, `M-02-02`, `M-03-11`, `M-04-26`, `M-05-09`, `M-09-13`, `M-07-45`, `M-08-26`, `M-11-12`, with its music and beds exactly as approved |
| 55.458 | 64.500 | `M-12-53` whole, 9.042 s — the approved M-12 |
This is every approved take in the morning, in cut order. Nine shots were in `-32`; M-12's approval this afternoon made it ten. M-15 is the only gap, and it has a prompt and no footage.
Both `time_base`s agreed on 1/12288 — `-32` carries it and the `M-12-53` re-encode wrote it — so the reconciliation this page usually records was not needed. Checked before the concat regardless, as the rule requires.
Every frame is bit-identical to its source, the picture being a stream copy:
| frames | decodes to | which is |
|---|---|---|
| 0–1330 | `40b8c51f…` | `morning-scene-32`'s whole video stream — the same MD5 that entry recorded against `-31` |
| 1331–1547 | `042aa6b6…` | `M-12-53`'s — the same MD5 `-35` recorded |
The audio is assembled sample-exact, not copy-concatted, per `-27`'s rule. `morning-scene-32` decoded 400 samples long and was trimmed to 2662000; `M-12-53` decoded 2224 long and was trimmed to 434000 — the same 2224 `-35` measured, arrived at independently here. `M-12-53`'s own audio is 32 kHz where the reel is 48 kHz, so it was resampled on decode; the trim is exact at 2000 samples a frame either way.
No music was added and none was moved. `-32` already carries `runner-motif.m4a` back-timed to end on the M-11/M-12 cut, and M-12 is unscored by the sheet's own rule — the bang kills the motif dead and the shop's sound starts with it. So the question was only whether the hand-off still reads at reel length, and it does, to the millisecond:
``` reel 55.20 55.24 55.28 55.32 55.36 55.40 55.44 | 55.46 55.60 56.00 56.20 56.35 dB -15 -17 -12 -13 -14 -20 -39 | -42 -47 -43 -40 -12 ^ motif's final accent cut ^ ^ the bang ```
The accent lands at 55.285 s, the decay runs out on `-32`'s last frame, the cut to M-12 falls at 55.458 s into a quiet shop at −42 dB, and the loudest thing in the next three seconds — the door — is at **56.348 s, 0.890 s after the cut**. That is `-35`'s 0.9 s reproduced exactly, which is the point of building it: the trim that bought the second holds at reel length, and the dead patch between the music's last hit and the shop coming alive is nine tenths of a second rather than the 1.9 s `-34` had.
It is still not the bang landing on the hit. `M-12-53` opens on the same quiet shop as `M-12-47`, one second less of it, and closing the last 0.9 s would mean either another second off the head — which starts eating the shop before the door — or moving the cue, which `-32` fixed deliberately.
Free: ffmpeg only, no credits, no generation. Nothing was renumbered, `-32` and `M-12-53` are untouched on disk, and `-33`, `-34` and `-35` stay as they are.
Mabel: *"do the same thing but cut another second off the begining of the approved m12 before putting it". Both were built. *The cut works and the arithmetic is clean; what it costs is the door bang, and that is the whole reason to look at it before it goes anywhere near an approval.**
Two seconds off `M-12-47`'s head: 241 frames → 193, 8.041667 s. Made from `M-12-47` rather than from the approved `M-12-53`, so the picture carries **one re-encode and not two**; the content is identical either way.
``` ffmpeg -y -ss 2.0 -i refs/takes/M-12-47.mp4 -c:v libx264 -crf 12 -preset slow \ -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart refs/takes/M-12-54.mp4 ```
A re-encode, so it is not bit-identical to its source and was checked by PSNR, the same way `M-12-53` was:
| aligned against `M-12-47` at | average PSNR |
|---|---|
| offset 47 frames | 31.75 dB |
| offset 48 frames | 51.09 dB (min 49.97) |
| offset 49 frames | 31.74 dB |
Frame 48 exactly. `M-12-47` and `M-12-53` are both untouched on disk. `M-12-54` is a take number, not an approval — `M-12-53` is still the approved M-12 and nothing here changes that.
`morning-scene-32` entire with `M-12-54` after it. 63.500000 s, 1524 frames (1331 + 193), 1280×720/24. Both `time_base`s 1/12288. Picture stream-copied and bit-identical: frames 0–1330 decode to `40b8c51f…`, the same MD5 `-32` and `-36` carry, and frames 1331–1523 to `55adf3a9…`, which is `M-12-54`'s whole video stream. Audio sample-exact per `-27`'s rule — `-32` decoded 400 long and was trimmed to 2662000, `M-12-54` decoded 2608 long and was trimmed to 386000.
The door opens at frame 44 of `M-12-47`, 1.833 s in. Mean luma of the right-hand third of frame, where the daylight lands:
``` frame 36 40 44 48 52 56 60 64 luma 84 84 88 108 120 124 125 122 ^ the light starts up ^ the door leaf is in shot ```
The bang is at 1.875 s in, from the audio: the loudest 40 ms anywhere in `-36`'s M-12 slot sits at +0.875 s from the cut, which is 1.875 s into `M-12-47`. The two agree within one frame, which is what a door swinging into sunlight should look like.
`M-12-54` starts at frame 48 — 2.000 s — so both are behind it. The bang has already sounded 0.125 s before the first frame and the light has been coming up for 0.167 s. What survives into the reel is the bang's decay:
| `-36` (`M-12-53`) | `-37` (`M-12-54`) | |
|---|---|---|
| loudest 40 ms in the M-12 slot | −11.8 dBFS at +0.875 s | −17.1 dBFS at +0.010 s |
| first 100 ms of the slot | −43 dB — a quiet shop | −19 dB — a bang already in progress |
| dead patch after the music's last hit | 0.9 s | none |
So `-37` does close the gap: the music's final accent at 55.285 s is answered immediately instead of after nine tenths of a second. **But it is answered by a decay rather than a transient** — five and a half dB down, with no attack in front of it — and the sheet's own line for this shot is *the bang lands out of pure music and kills the motif dead*, which needs the attack to be there.
The door leaf is still seen swinging: it enters shot around frame 56 of `M-12-47`, which is 0.333 s into `M-12-54`. **What is gone is the moment it starts** — the shut door, the latch giving, the light coming up off a dark floor — and the sound that goes with it.
Neither cut is wrong; they answer different questions. `-36` keeps the whole door event and pays 0.9 s of quiet for it. `-37` buys a tight join and pays the bang. A third way exists and is not built: trim between the two — about 0.7 s rather than 1.0 s — which would leave the transient intact and close most of the gap. Nobody has asked for it.
Free: ffmpeg only, no credits, no generation. Nothing was renumbered; `-36` and `M-12-53` stand as they were.
Mabel: "approve morning scene 37" — the deeper trim, taken after the measurements, the frame strip and the 0.7 s alternative were all put in front of her. Key `approved/CUT-morning/morning-scene-37-3b281de6.mp4`.
It supersedes `morning-scene-32`, approved 5 Sep, which ended on M-11 and had no M-12 in it. The approved morning reel now runs to the end of M-12 — every approved shot in cut order plus M-12 — and M-15 is the only gap.
The defect is recorded at approval and is still true of the footage, the same way `M-08-26`'s three were. The M-12 in this reel is `M-12-54`, and that trim starts after the door bang: the door begins to open at frame 44 of `M-12-47` and the bang is at frame 45, where `M-12-54` starts at frame 48. So what answers the motif's final accent is the bang's decay — −17.1 dB at +0.010 s from the cut, against −11.8 dB at +0.875 s in the `-36` version — and the shot's own line in `shots-morning.md` is *the bang lands out of pure music and kills the motif dead*, which the attack is what delivers. What it buys is the 0.9 s dead patch between the music's last hit and the shop coming alive, which is gone. It cannot be trimmed out: it needs `M-12-54` rebuilt at about 0.7 s, or the `-36` version.
`-36` is not deleted and not hidden. It stands in `refs/cuts/` and in the gallery as the alternative this was picked over, which is what the take numbers are for.
The approved M-12 take is `M-12-53` — one second off the head, approved this afternoon — and the approved reel carries `M-12-54`, two seconds off. Both approvals stand and neither was withdrawn. That is a real divergence and it is recorded rather than resolved: approving the reel is not the same act as approving the shot, and Mabel asked for one and not the other. It matters at the next join — anything rebuilt from the approved shot will carry the bang and be 0.9 s longer in its head than the approved reel does.
Provenance. `-36` and `-37` are local ffmpeg assemblies and match no Higgsfield job, so both were given local-edit ledger entries of the shape the other cuts carry — the command, what they derive from, the bit-identical MD5s and the sample counts. `-37`'s was written after `assets.py approve` had already run, which is why that command warned no generation record for this file; the entry was then attached to the approved record by hand so the gallery accounts for it rather than showing an approved reel nothing explains. `assets.py approve` will not refresh an already-approved key, which is worth knowing: write the ledger entry before approving, not after.
Free: no credits, no generation.
**M-15 was rolled twice from the browser as a forward video extension, and the second take is the shot.** The row had been the only morning gap since 9 Sep — prompt written, unrolled, not offered. Both rolls came down from Higgsfield the same evening and were cut against the approved M-12.
| cut | contents | frames | duration |
|---|---|---|---|
| `morning-scene-38` | `M-12-54` + `M-15-01` | 193 + 240 = 433 | 18.041667 s |
| `morning-scene-39` | `M-12-54` + `M-15-02` | 193 + 192 = 385 | 16.041667 s |
| `morning-scene-40` | `morning-scene-37` + `M-15-02` | 1524 + 192 = 1716 | 71.500000 s |
**THE JOIN IS FREE, AND IT LANDS ON THE APPROVED M-12 BY LUCK RATHER THAN DESIGN. Both rolls were extended from `M-12-53`*, the superseded* M-12 — byte-identical to the video input Higgsfield was given, confirmed by MD5. But `-53` and `-54` are the same trim of `M-12-47` cut at different heads (24 frames off and 48 frames off), so they share a last frame, and an extension rolled off one lands on the other. `morning-scene-37`'s last frame is pixel-identical to `M-12-54`'s — PSNR `inf` — so the reel takes it too. Had the two M-12 trims been cut from different tails this would not have worked at all, and the next extension should be rolled off the approved take rather than relying on it.
Seam measurements. `M-15-01` 39.0 dB and `M-15-02` 38.9 dB against `M-12-54`'s last frame. **One frame of ordinary motion in this footage is 33–34 dB** (measured within each clip: `M-12-54` frame 191→192 is 33.4, `M-15-02` frame 0→1 is 34.4), and the same frame re-encoded is 44.6. The film's only other extension, M-04 into M-05, is 30.7 dB.
ONE DUPLICATED FRAME AT EACH SEAM — the thing M-05 did not have. Because the extension figures sit above the natural one-frame step rather than below it, **frame 0 of each extension is M-12's last frame re-rendered, not the next instant**. Cut, the join holds one frame for 2/24 s. The M-05 write-up says of its own seam "no duplicated frame at the seam", so this is a difference between the two extensions and not a property of the method. It was left in: it falls inside the dead-still opening hold and cannot be seen, and dropping it costs a re-encode of the M-15 half. Note the M-04/M-05 rule — *trimming picture at either end works too and costs the seam, so don't* — does not apply to it, because dropping a duplicate does not cost the seam: the join would become `M-12-54` last → extension frame 1, which measures 32.6 dB, i.e. an ordinary frame of motion. If the hitch is ever seen, that is the fix.
Every cut is stream-copied and bit-identical to source, checked by decoded frame hash rather than by eye: `M-12-54`'s half decodes to `55adf3a9…`, the same hash `assets.json` already records for it inside `morning-scene-37`.
Audio, and a short tail on both takes. Assembled sample-exact per the `-27` rule. `M-12-54` decodes 2608 samples long and is trimmed to 386000, exactly as the approved reel records; `morning-scene-37` decodes 448 long and is trimmed to 3048000. Both M-15 takes run short instead — `M-15-01` 476160 against 480000 (3840 samples, 0.080 s) and `M-15-02` 380928 against 384000 (3072, 0.064 s) — so each cut pads silence at its tail. That is at the end of the file, not at the join. No music was added or moved: `-37` already carries `runner-motif.m4a` back-timed to the M-11/M-12 cut, and M-15 is unscored — its own prompt asks for no music at any point.
`M-15-02` APPROVED (Mabel: "approve m1502"), and with it the morning has eleven of eleven shots approved. Job `2e5d87be`, `seedance_2_5` / `video_extension` / `extension_mode: forward`, 8 s at 720p/24. Only the second take in the film made by extension rather than generation, after `M-05-09`. Rolled at 8 s and cut at 8 s, so unlike every other morning shot **it has no handles** — the row asks for 8 s out of 11 s of Gen and got 8 out of 8.
IT SUPERSEDES THE ROW'S PAN AND SETTLES THE ROW'S OPEN QUESTION. The row specced *one slow pan right-to-left across four faces, settling on the Old Printer at the counting desk. The approved take is not that: *one arc around the Young Printer's head**, passing behind it, settling into an over-the-shoulder with the Old Printer clean centre-right in a medium from the chest up. It ends on him beneath the drying cords where M-12 leaves him, not at the desk — which closes THE OLD PRINTER IS IN TWO PLACES AND SOMETHING HAS TO GIVE in favour of the first of the three ways out the row listed. **The counting desk is therefore out of the morning**, and with it the image the row wanted the shot for: the man at the accounts, not looking up.
The line is on camera, not VO. The row has it laid in at edit stage so the shot would need no lip-sync; the take speaks it with the lips moving to the German. **M-15 now has a named speaker on camera and inherits M-08's undecided lip-sync question.**
Why `-02` over `-01`. `M-15-01` (job `d146d3f9`, 10 s) does what the prompt asks and `-02` does not: he leans forward, lays the printed sheet flat on the long table, and ends with his eyes lowered to it. **`M-15-02` never puts the sheet down** — he holds it in his right hand to the last frame and stays looking at the Young Printer. It was picked anyway, because `-01` settles further off with him bent over the table while `-02` settles into a clean medium: chest up, facing camera, sharp, the shoulder soft at frame left. The prompts differ only in trim — `-02` dropped That is what the shot is of, softened the costume preamble, and changed He looks at the Young Printer while he speaks to *He looks around* — plus 10 s down to 8 s.
**THE NUMBER IS SAFE IN BOTH TAKES, BUT BY INSPECTION AND NOT BY CONSTRUCTION — and the row had promised the strong guarantee.** Two things removed it. The row's protection was the account book closed, clasp fastened, for the whole shot; in the inherited wide the book is open. And the prompt's `NO TEXT SURFACE / NO NUMERALS` block **was taken out at Mabel's direction at 10:41 that morning* (thread `t14`: "Take out number four and give me the new prompt"*). So the check was done for real rather than inherited — every text surface in both takes, enlarged 6–8×, on the first, last and intermediate frames: the counting-desk book, the drying sheets overhead, the pamphlet on the long table, the sheet in his hand. **The printing is illegible texture, no letterform resolves anywhere, and NO NUMERAL APPEARS AT ANY POINT — no 400, no digit of any kind. The result belongs to these two takes only. And `M-15-02` holds a printed sheet closer to the lens than any other morning shot**, so a regrade, an upscale or a reroll needs its own read rather than inheriting this one. This is the same weaker footing `M-08-26` stands on, now for the same reason at the other end of the scene.
`morning-scene-40` IS THE APPROVED MORNING REEL (Mabel: *"approve morning scene 40", the same evening, a few minutes after the shot). It *supersedes `morning-scene-37`**, approved 9 Sep, which ended on M-12 and had no M-15 — and it is the first reel that is the whole scene, because M-15-02's approval the same day left the morning with no gap in it. `-37` is untouched in `refs/cuts/`, the bucket and the gallery, and stays the record of the reel it was.
The 9 Sep lesson held. That note ends *write the ledger entry before approving, not after* — `-40`'s local-edit entry was written before `assets.py approve` ran, the command raised no no generation record warning, and the approved record carries its provenance (`via: local`, `how: assembled`, derived from `morning-scene-37` and `M-15-02`) without anything being attached by hand afterwards.
Free: both rolls were Mabel's own, and every cut here is local ffmpeg.
`morning-scene-41` is the approved reel with `M-02-03` in the M-02 slot (Mabel: "make morning scene 41, swap m0203 for m0202"). 1716 frames, 71.500000 s — the same length as `morning-scene-40`, because **both M-02 takes are 193 frames**, so nothing after the swap reflows and no music needed re-timing. It is not approved; `morning-scene-40` is still the approved reel.
**THE AUDIO WAS NOT REBUILT — IT WAS COPIED WHOLE, AND IS BYTE-IDENTICAL TO THE APPROVED REEL.** Neither `M-02-02` nor `M-02-03` carries an audio stream at all (video only, checked with `ffprobe`), so **everything under that slot is edit-stage bed and music* — as Mabel put it, no audio from m0202, just the runner motif that was on the previous runner clip*. Nothing under M-02 belongs to the take, so nothing under M-02 had to move: `-41`'s audio is `morning-scene-40`'s stream copied across, 3432448 samples decoding to md5 `d6f4734d…`, `cmp`-identical. The mix, the beds and the motif keep their exact timing by construction rather than by re-derivation.
IT IS NOT A SPLICE OF `-40`, BECAUSE `-40` CANNOT BE SPLICED. The reel is a single GOP — `ffprobe` finds exactly one keyframe in 1716 frames, at frame 0 — so there is no copy-cut point at the M-02 boundary, and re-encoding `-40` to get one would cost an encode generation on all 1716 frames including the segments that are currently pristine. **So it was rebuilt from the source takes instead**, every segment stream-copied:
`black` 36 · `M-01-20` 121 · `M-02-03` 193 · `M-03-11` 97 · `M-04-26` 121 · `M-05-09` 168 · `M-09-13` 145 · `M-07-45` 169 · `M-08-26` 169 · `M-11-12` 112 · `M-12-54` 193 · `M-15-02` 192 = 1716
All eleven take segments verified bit-identical to their source takes by decoded frame hash, and the M-02 slot now hashes `0bb8bcc4…`, which is `M-02-03`'s whole video stream. The 36-frame black leader was regenerated at Y=16 and decodes identical to `-40`'s own frames 0–35; the leader is flat video-black with no fade, and frame 36 cuts hard into M-01.
**SIDE EFFECT, DELIBERATE AND WORTH KNOWING: `-41` IS ONE ENCODE GENERATION CLEANER THAN `-40` OVER ITS FIRST 881 FRAMES.** Segment-by-segment checking of `-40` against the source takes shows a clean boundary — **frames 0–880 (black through M-09) differ from source and frames 881–1715 are bit-identical copies** — which is exactly the "picture head is a fresh encode rather than a copy" recorded at `morning-scene-24`'s approval, still carried forward through `-32`, `-37` and `-40`. Rebuilding from the takes returns that head to source-identical. There is no build that both swaps M-02 and preserves `-40`'s head exactly; the only alternative was a third-generation re-encode, which is strictly worse. **If the reel is ever approved from here, this is a picture improvement to the first 37 seconds that nobody asked for and should be told about.**
What actually changed on screen. `M-02-02` plays the gate from outside: a wide, bright exterior, the runner tiny under the arch and growing as he comes, past a loaded cart, ending as he runs by the lens down the lane. `M-02-03` plays it from inside the gate passage: warm light on the stone vault, a handcart with sacks in the near foreground, the runner coming through the arch at the camera — and it ends on him running away from the lens into haze, where `-02` ends on him crossing it. That is a change of screen direction at the outgoing cut, so how it sits against M-03 is worth a look before this is approved.
Free: no credits, no generation, no re-encode of any take.
**`M-02-03` is the approved M-02, and `morning-scene-41` is the approved morning reel* (Mabel: "approve morning scene 41 instead and approve m0203 instead of m0202"). Both in one instruction, which is the point: *the shot and the reel were approved together and agree**, rather than diverging the way M-12 did on 9 Sep and having to be closed the next day.
THIS REVERSES A DECISION, NOT A GAP. `M-02-03` is not a new take — it is the take that lost on 19 Aug 2026, when `M-02-02` became **the first approved take in the film**, and it has sat in the gallery as the alternative it beat ever since. Both were rolled the same day from the same prompt with the same two job-id references (`young-printer-smear-08`, `runner-path-02`), 8 s at 720p under `mode omni_reference`. `M-02-02`'s record is left standing as the superseded pick, as `M-03`'s, `M-09`'s and `M-12-53`'s are, and it is **still the M-02 in `morning-scene-24` through `morning-scene-40`** — every approved morning reel before this one. `M-02-01` stays hidden; it came back with no letter in his fist.
What changed on screen. `M-02-02` played the gate from outside: a wide, even daylight exterior, the gatehouse across frame, the runner small under the arch and growing as he came, ending as he crossed the lens. `M-02-03` plays it from inside the passage: cool blue stone and the two open oak plank doors framing a hot sunlit arch, a loaded handcart standing in the light, the runner coming through at the camera — and **it ends on him running away from the lens into haze**. A darker, more enclosed, much warmer image than the one it replaces.
**Continuity was checked before the approval and holds: the crushed letter is in his RIGHT fist.** Read on the close pass where the hand is largest — he runs screen-left, so the camera sees his right side, and the letter is in the near arm swung forward with the left arm behind him. That matches `M-02-02`'s continuity line and is exactly the check `M-02-01` failed. The cheek smear of `young-printer-smear-08` is present and the costume matches.
THE ONE THING NOBODY HAS ASSESSED IS SCREEN DIRECTION AT THE OUTGOING CUT. `M-02-02` ended with him crossing the lens; this take ends with him running away from it. **How that sits against M-03 was flagged before the approval and was not the reason for it** — it is still open, and it is the first thing to look at if the head of the reel ever feels wrong.
The reel's audio did not move, and could not have. Neither M-02 take carries an audio stream at all (`generate_audio: false`), so **everything under that slot is edit-stage bed and music* — as Mabel put it, no audio from m0202, just the runner motif that was on the previous runner clip*. `morning-scene-41`'s audio is `morning-scene-40`'s copied whole and `cmp`-identical, so `runner-motif.m4a` keeps its back-timing onto the M-11/M-12 cut by construction rather than by re-derivation. Both takes are 193 frames, so nothing after the swap reflowed.
`morning-scene-41` supersedes `morning-scene-40`, which it is identical to except for the M-02 slot, and which superseded `-37` earlier the same evening. `-40` is untouched and stays the record of the reel it was. The build, the single-GOP problem that forced a rebuild from sources, and the deliberate side effect — **the head is now one encode generation cleaner than `-40`'s over frames 0–880** — are written up in the `morning-scene-41` entry above and in the approved note.
Approval order, and the 9 Sep lesson again. Both ledger entries existed before `assets.py approve` ran — `morning-scene-41`'s local-edit entry from the build, `M-02-03`'s first-hand `gen.py` entry from 19 Aug — so neither approval raised no generation record for this file, and both approved records carry their provenance without anything attached by hand.
Free: no credits, no generation. `M-02-03` was paid for on 19 August.
The first evening cut. Mabel: *"take the latest higgsfield generation and clip it with the approved e01"*. The latest generation was the "use their hands" roll of the E-02 prompt (job `75490648`, 12:39 PDT, `seedance_2_5` / `video_extension` / forward, 10 s at 720p/24, with sound). It had not been pulled, so it came down as `E-02-05`. It is not approved and has not been reviewed.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-01` | `E-01-01-nosmoke` + `E-02-05` | 229 + 240 = 469 | 19.541667 s |
The picture is stream-copied and bit-identical to its sources, checked by decoded frame hash: all 469 frames match `E-01-01-nosmoke` then `E-02-05`. Both sources carry `time_base` 1/12288, checked before the concat. Their `avcC` extradata differ by one byte (46 vs 45). The decode did not care, but it is the first thing to suspect if a browser hitches at frame 229.
Seam. The roll was extended from the original `E-01-01` (result `095f61ff`), not from the approved no-smoke edit. That still lands, because the smoke patch only touched the head and the 36 new frames sit before the clip, so the two share a last frame. `E-01-01-nosmoke` last frame against `E-02-05` frame 0 measures 40.7 dB, and against frame 1 it measures 39.8 dB. `E-02-05`'s own 0→1 step is 47.9 dB because it opens nearly still. As with M-15, frame 0 is E-01's last frame re-rendered, so the join holds about one frame. It was left in, for the same reason as M-15.
Audio is assembled sample-exact at 48k and encoded once at 192k. The approved E-01 is silent at Mabel's request, so the first 458000 samples are digital silence (measured −91 dB). `E-02-05`'s 32k track decodes 317440 samples, 0.08 s short of its picture, so it was resampled and padded with silence at the tail to 480000. No music.
Free: no credits. `E-02-05` was rolled by Mabel in the browser.
Mabel, on `evening-scene-01`: *"we need to add sound back to the e01 clip. not the music though… i would like an audible flare from the candle. plus the transition noise from 01 to 02 is awful, silence and then sudden noise and movement"*.
| cut | picture | audio |
|---|---|---|
| `evening-scene-02` | same as `-01` | A: E-01's own sound without music, room-tone bed, E-02-05 faded in |
| `evening-scene-03` | same as `-01` | B: as A, plus a synthesized whoomph layered on the flare |
The picture is unchanged from `-01`, confirmed by decoded frame hash. Only the sound differs.
The music came out by stem separation, locally. `htdemucs` (Demucs, CPU, in a scratch venv outside the repo) split `E-01-01`'s original track into four stems. The music is the steady −42 dB bed in other. The candle's own flare hit is in drums and vocals, with onset 2.72 s and peak 2.78 s, which matches frames 66–73 of the picture. The post-flare crackle sits around −47 dB. E-01's sound is vocals + drums + bass, with other dropped. The same split of `E-02-05` puts only about −65 dB in other, so that take has no real music, and its own track is used as it came.
The join. `-01` went from digital silence to E-02-05's movement sound at frame 229. Three changes fix it: 1. A room-tone bed runs from the first frame to 1.2 s past the cut. It is a loop of `E-02-05`'s no-music track between 2.1 and 4.0 s (steady at −48 dB) with 0.3 s equal-power crossfades. It sits at −9 dB in daylight and rises to −3 dB over the flare, as the night arrives. 2. E-01's tail eases out over its last 0.4 s. 3. `E-02-05`'s audio fades in over the first 0.6 s after the cut, and the bed hands over to it between 0.5 and 1.2 s after the cut.
Measured in quarter-seconds, the level across the cut runs −47 −50 −51 −47 −44 −41, with no hole.
The movement jolt is in the picture and was not touched. Frame-to-frame PSNR in `E-02-05` holds at about 52 dB for frames 0–4, then drops to 42–41 dB by frame 8, so the orbit starts within a quarter-second of the cut. Sound can soften it but not remove it. The real fixes are a re-roll that opens on a held beat, or a local speed ramp on the head of E-02-05.
The flare in `-03` is a synthesized whoomph (numpy; free), made of low-passed noise with a 40 ms attack and a 0.35 s decay, a falling 70→45 Hz thump, sparse crackle, and a soft steady hiss. It is scaled 4 dB under the original hit's peak and starts 20 ms before it. `-02` peaks at −24 dB (quarter-second RMS) on the flare; `-03` comes in earlier at −32 and peaks at −22.
Neither is approved. The approved `E-01-01-nosmoke` take is still silent: the sound lives only in these cuts until Mabel picks a flare. Audio is sample-exact at 48k, 938000 samples, AAC 192k encoded once. Free: no credits.
UNAPPROVED LATER THE SAME DAY. Mabel: *"unapprove any captioned morning
scenes and go back to the old one"*. `morning-scene-42`'s row was removed
from `assets.json`. It was the only captioned reel ever approved; `-43`, `-44`
and `-45` never were. **`morning-scene-41`, uncaptioned, is the approved
morning reel again.** The files, their provenance entries, the content-addressed
copy in the bucket (`approved/CUT-morning/morning-scene-42-ab75686c.mp4`) and
`subtitles/` are all left in place for when subtitles are picked up again. See
the entry after `-45`.
**`morning-scene-42` is `morning-scene-41` with English subtitles burned in, and it is the approved morning reel.* Mabel: "add subtitels in english to the morning scene approved cut", then "and then approve that new cut"*. 1716 frames, 71.500000 s, the same as `-41`.
The text lives in git as `subtitles/morning-en.srt`, and the burn-in is built from that file. The file has seven events and covers every scripted line in the reel:
| # | in → out (s) | shot | German, as spoken | English on screen |
|---|---|---|---|---|
| 1 | 21.90 → 23.62 | M-04 | Papier! / Kommt schon! (O.S.) | - Paper! / - Coming up! |
| 2 | 45.05 → 47.30 | M-08 | Sind neue Aufträge gekommen? | Have any new orders come in? |
| 3 | 47.40 → 49.50 | M-08 | Keiner seit dem von voriger Woche. | None since the one from last week. |
| 4 | 58.65 → 61.30 | M-12 | Frankfurt ist dahin. Basel auch. | Frankfurt is gone. Basel too. |
| 5 | 61.40 → 63.45 | M-12 | Leipzig hat's beidemal wohlfeiler geben. | Leipzig undercut us on both. |
| 6 | 67.60 → 69.70 | M-15 | Zween Aufträge an einem Tage. | Two orders in one day. |
| 7 | 69.80 → 71.50 | M-15 | Hernach ist es der ganze Handel. | Next it will be the whole trade. |
The English is the fountain's, not a new translation. Events 1 and 4–7 are `script/the-offer.fountain` word for word, apart from the capital and "!" on Coming up. Events 2–3 are the EN glosses on the M-08 row of `shots-morning.md`, because that exchange is in the sheet but not in either fountain. That gap is worth closing at lock. The unscripted walla stays unsubtitled, as the German script directs.
Timing comes from the audio, not from guesswork. A local faster-whisper pass (`small`, German, word timestamps, in the `review-voice` venv; nothing uploaded) located each line. Each event starts about 0.1 s before its first word and holds long enough to read. Every event stays inside its own shot: event 1 ends 2 frames before the M-04/M-05 cut at 23.67 s, and event 5 ends before the M-12/M-15 cut at 63.50 s. The whisper text itself was only used for timing; the words on screen come from the script.
Style. Liberation Sans, white with a thin black outline and a slight shadow, bottom-centred, sized for 720p. It is plain, not blackletter, following PLAN Phase 6: subtitles are edit text in the film's voice.
THE PICTURE IS ONE RE-ENCODE GENERATION, ON ALL 1716 FRAMES. A burn-in cannot be stream-copied. The encode is x264 `slow` at crf 12, and it measures 51.96 dB PSNR against `-41` over an unsubtitled stretch (30–35 s). **The audio is stream-copied** and decodes identical to `-41` (md5 `d6f4734d…`).
`-41` STAYS THE CLEAN MASTER. It is superseded as the approved reel but not retired. Any later picture or sound change should be made on an unsubtitled reel and re-subtitled from the SRT, not built on top of `-42`. PLAN Phase 6 wants a sidecar for the web and burn-in only where a platform demands it, and the SRT in `subtitles/` is that sidecar. The Phase 6 checkbox stays open: the morning is subtitled, the evening is not, and the opening title card is not in the reel yet.
Recorded with `provenance.py derive` (`subtitled`, from `-41` and the SRT) before `assets.py approve`. Free: no credits, no generation.
Mabel, on `-42`: "no i do not like the subtitles. much more classy please."
**`morning-scene-43` is `morning-scene-41` with the same subtitles in a new style.** The text and timing are unchanged, apart from one split described below. It is 1716 frames and 71.500000 s. It is not approved. `-42` is still the approved reel on record, even though its look was rejected.
The rejected look (`-42`) was Liberation Sans in pure white with a hard black outline and a drop shadow, which is television-caption styling.
The new look (`-43`) is closer to the cinema-release convention:
I compared three variants on the same frames before building:
Files.
Build. It was built from `-41` again, not from `-42`, so the picture carries one re-encode and not two. The encode is x264 `slow` at crf 12, which gives 51.96 dB against `-41` over an unsubtitled stretch. The audio is stream-copied, md5 `d6f4734d…`, identical to `-41`. All eight events were checked on stills. Free: no credits.
Mabel, on `-43`: *"i do need to be able to read them. keep them profesional, not too big not too small"*.
`morning-scene-44` keeps `-43`'s typeface and look but makes the text readable. The text and timing are the same eight events. It is 1716 frames and 71.500000 s. It is not approved. `-42` is still the approved reel on record.
What was wrong with `-43`. 38 px regular Garamond is too slight on a 720p frame. Garamond has a small x-height and thin strokes, so it reads smaller than its point size, and the thin hairlines break up over the bright table in M-12.
What changed:
| `-43` | `-44` | |
|---|---|---|
| weight | regular | bold (the variable font's 700 instance) |
| size | 38 px | 44 px, about 6% of frame height |
| halo | 55% black, outline 1.8 | 56% black, outline 2.4, blur 3 |
| letter-spacing | 0.8 | 0.5 |
| bottom margin | 46 | 40 |
The colour (ivory `#F2EDE3`), the absence of a hard outline or shadow, and the italic off-screen shouts are unchanged.
Chosen from three candidates rendered at full size on the three hardest frames (48.5 s, 62.5 s, 68.5 s):
`subtitles/morning-en.ass` carried this style until `-45` replaced it; see below. The SRT sidecar was unchanged here. It was built from `-41` again: one re-encode, 51.96 dB against `-41` away from the text, and the audio is stream-copied and identical to `-41` (md5 `d6f4734d…`). All eight events were checked on stills. Free: no credits.
Mabel, on `-44`: *"no. bigger, more bold, and rn they're too close to the bottom", then "no cursive" and "prob have them in white but outlined in black"*.
**`morning-scene-45` is `morning-scene-41` with the same eight subtitle events in a new style. It is 1716 frames and 71.500000 s. It is not approved.** `-42` is still the approved reel on record.
| `-44` | `-45` | |
|---|---|---|
| typeface | EB Garamond variable, faux bold | EB Garamond ExtraBold, the static cut |
| size | 44 px | 56 px |
| colour | ivory `#F2EDE3` | pure white |
| edge | blurred 56% halo | opaque black outline 3 px, plus a 1 px 50% shadow, no blur |
| italics | off-screen shouts | none |
| bottom margin | 40 | 80, twice as high off the edge |
WHY `-43` AND `-44` WERE NEVER REALLY BOLD. The Google Fonts EB Garamond is a variable font whose default weight is 400. libass does not move a variable font's weight axis, so the Bold flag in `-44`, and a requested weight of 800, both rendered Regular with synthetic emboldening. The 700 and 800 renders came out pixel-alike, which is how this was found. `-45` uses the static ExtraBold file from the typeface's own repository (`octaviopardo/EBGaramond12`, `fonts/ttf/EBGaramond-ExtraBold.ttf`, OFL). Static Bold was rendered beside it on the same four frames, and ExtraBold was the clearer of the two. A fontTools instance cut at `wght` 800 from the variable file also worked, but the upstream static file was preferred because anyone can fetch it again.
The font is not in the repo. Fetch the file above and pass its directory to libass as `fontsdir`.
`subtitles/morning-en.ass` now carries this style, with italics off for both styles. `subtitles/morning-en.srt` has lost its `<i>` tags to match. It was built from `-41` again: one re-encode, 51.96 dB against `-41` away from the text, and the audio is stream-copied and identical to `-41` (md5 `d6f4734d…`). All eight events were checked on stills. Free: no credits.
Mabel liked the transition in `-02` best. The join is sample-identical in `-02` and `-03`, and the two mixes differ only from 4.2 to 6.7 s, over the flare. She was told this, and then she said "approve". So the pick is the candle's own flare hit, without the synthesized whoomph.
`E-01-01-nosmoke.mp4` was rebuilt in place, as it was when its sound was removed earlier the same day. The video stream is copied, and the decoded frame hashes match the silent approved version on every frame. The audio is the first 458000 samples of `evening-scene-02`'s mix, i.e. E-01's own sound without the music on top of the room-tone bed, AAC 192k. Taken alone, the take's room tone ends hard at its last frame. In the reel, `evening-scene-02` carries the bed past the cut, and that version stays the reference for how the join sounds.
New sha256 is `0adf1378…`. It supersedes the silent approval `E-01-01-nosmoke-39365e62`, which stays in the bucket as the record. `-03` is not used.
Mabel: "clip the latest e02 with the approved e01." The latest roll was not `E-02-05`. It was job `510e9541` (13:07 PDT), rolled in the browser from the calm version of the E-02 prompt posted at 12:53: `seedance_2_5` / `video_extension` / forward, 10 s at 720p/24, with sound, extending the original `E-01-01` result `095f61ff`. It had not been pulled, so it came down as `E-02-06`. Provenance was reconciled from history. It is not approved and has not been reviewed.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-04` | `E-01-01-nosmoke` (approved, `0adf1378`) + `E-02-06` | 229 + 240 = 469 | 19.541667 s |
Picture: stream-copied, and all 469 frames are hash-identical to their sources. Both sources have time_base 1/12288.
Seam: E-01's last frame against `E-02-06` frame 0 measures 41.0 dB, and against frame 1 it measures 38.7 dB. `E-02-06`'s own 0→1 step is 40.9 dB. As with `-01`, frame 0 re-renders E-01's last frame and the join holds about one frame. This was left in.
Audio: the `-02` join, with the E-02 track swapped. The build starts from `-02`'s lossless mix A, which was left in the evening session's scratchpad.
Level in quarter-seconds across the cut runs −47 −50 −51 −45 −42, with no hole. `E-02-06` was not stem-checked for music. By ear-level measurement it has two loud passages, at 2–4 s and 7–8 s, which are the two spoken lines.
What the take does: the orbit the prompt asks for, travelling right. It ends looking past the Young Printer's shoulder at the Old Printer, with Lufft in profile at the right edge. No text surface resolves in the frames sampled at 1 s intervals.
Free: no credits. `E-02-06` was rolled by Mabel in the browser.
Mabel: "approve eveninng sceen 03 and whatever e02 clip helped make it". I asked whether she meant `-04`, the cut made just before this. She confirmed **`-03` + `E-02-05`**.
| shot | approved | sha256 |
|---|---|---|
| `CUT-evening` | `evening-scene-03` (E-01-01-nosmoke + E-02-05, mix B) | `05483941…` |
| `E-02` | `E-02-05` (job `75490648`, the "use their hands" roll) | `a45fb38a…` |
This is the first evening cut approved and the first `E-02` take. `-04` and `E-02-06` are not approved.
The approved E-01 and the approved cut no longer agree on the flare. `-03` carries mix B, which layers the synthesized whoomph 4 dB under the candle's own hit. The approved `E-01-01-nosmoke` (`0adf1378`) carries mix A, which has the candle's own hit alone. The two differ only between 4.2 and 6.7 s. I have not re-approved E-01 with mix B; that waits for Mabel to say which flare the shot keeps. The same kind of divergence happened on M-12 on 9 Sep.
`E-02-05` has not been read for the number. No enlarged text-surface pass has been done on it yet, and it needs one before it goes into a reel.
Free: no credits.
Mabel: "clip the latest higgsfield with the approved m02". The latest roll is a continuation of `E-02-05`, not of any M-02 take. I asked, and she confirmed E-02. She added: "when i say m02 you can usually assume i mean e02."
The latest roll is job `a79d2e9e` (14:04 PDT): `seedance_2_5` / `video_extension` / forward off `75490648` (`E-02-05`), 8 s at 720p/24, with sound. It is the "moves forward over the young printer's shoulder" camera variant. A parallel session had already pulled it as `E-03-01` and reviewed it on thread t17, so the file was left where it was. This session claimed `evening-scene-05` on t17 before building. The 13:57 roll `8c77cc5d` has the same prompt with an almost-still drift in toward Lufft. It has not been pulled.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-05` | `E-02-05` (approved) + `E-03-01` | 240 + 192 = 432 | 18.000 s |
E-01 is not in this cut; it is just the two shots that were asked for.
Picture: stream-copied, and all 432 frames are hash-identical to their sources. Both sources have time_base 1/12288.
Seam: 28.5 dB from `E-02-05`'s last frame to `E-03-01` frame 0, against 28.6 dB for `E-03-01`'s own 0→1 step. The join lands at the pace of ordinary motion, and by eye it is continuous.
Audio: assembled at 48k, sample-exact to picture, and encoded once at AAC 192k.
No music was added. Free: no credits.
Mabel, on `-05`: *"i love it that clip is so great. add e0301 to the approved evening scene". Then, while the cut was being built: "approve e0301"* and "approve the new evening scene".
| shot | approved | contents |
|---|---|---|
| `CUT-evening` | `evening-scene-06` | `E-01-01-nosmoke` + `E-02-05` + `E-03-01`, 229 + 240 + 192 = 661 frames, 27.541667 s |
| `E-03` | `E-03-01` | job `a79d2e9e`, the first E-03 take |
`-06` supersedes `-03` as the evening cut. `-03` stays as the record.
Picture: stream-copied from the three takes. All 661 frames are hash-identical to the sources, and the first 469 are identical to `-03`.
Audio: `-06` is the two approved mixes spliced together.
Carried forward, unresolved:
Free: no credits.
Mabel: "pull any new vids from higgsfield". There was one new completed job since the last pull: `8c77cc5d`, the 13:57 PDT roll that the `evening-scene-05` entry lists as not pulled. Image and audio histories have nothing new. Nothing is in flight. The three parkour jobs of 3 Sep are still left out, per Mabel's 8 Sep instruction. The three `nsfw` image refusals of 12 Aug have no result to pull.
| take | job | rolled (PDT) | model | length |
|---|---|---|---|---|
| `E-03-02` | `8c77cc5d` | 13:57 | `seedance_2_5` / `video_extension`, forward off `75490648` (`E-02-05`) | 8 s, 192 frames |
Numbered after `E-03-01` although it was rolled seven minutes before it. `-01` was already pulled, reviewed and approved, and existing numbers are never changed.
Same prompt as `E-03-01` except the `CAMERA` line. `-01` has *moves forward over young printer's shoulder … accelerates to the middle and deaccelerates*. `-02` has almost still. A very very slow, slight drift in toward Lufft. The references are the same four stills plus `E-02-05`, and the settings are the same.
What the frames show (sampled at 0, 2, 4, 6 and 7.9 s):
The job's `Content-Length` (5,030,436) matches the download. `tools/provenance.py sync` matched the file to its job by bytes. It decodes to 1280×720 h264 at 24 fps, time_base 1/12288 (the same as `E-02-05` and `E-03-01`), with AAC at 32 kHz. It is pushed to the bucket.
Free: download only, no credits. Nothing approved, renumbered or cut.
Mabel: "actually forget that i'll do it later", then *"unapprove any captioned morning scenes and go back to the old one"*.
**Only one captioned reel was ever approved, `morning-scene-42`, and its row is gone from `assets.json`.** `-43`, `-44` and `-45` were never approved, so there was nothing to undo on them. With `-42`'s row removed, the live `CUT-morning` approval is `morning-scene-41` again: the uncaptioned reel with `M-02-03` in the M-02 slot, approved 10 Sep 2026. `-40` shares that date with no recorded time, and `build.py`'s current-approval rule then falls back to row order, which the manifest sorts by key, so `-41` wins.
Nothing was deleted. These all stay in place for when subtitles are picked up again:
`assets.py` has no `unapprove` command, so the row was removed by hand, and the file was rewritten in `save_manifest`'s own format so the diff shows only that row.
Where the subtitle work stands, for whoever returns to it. Mabel's last notes asked for bigger text, bolder text, text higher off the bottom, no italics, and white outlined in black. `-45` answers all five: static EB Garamond ExtraBold at 56 px, a 3 px black outline, and a bottom margin of 80. She had not reacted to `-45` when she set subtitles aside. Free: no credits.
Mabel: "cut the latest vid from higgsfield with the approved e03".
The latest roll is job `a9b0d465` (14:50 PDT), `seedance_2_5`, 8 s at 720p/24, with sound. It is not an extension: it is the new-angle E-04 written on t18, version A (over the Old Printer's shoulder, orbiting round to his face), rolled on Mabel's edited prompt with the five reference stills, the fifth being `evening-e03-lastframe-01`. Pulled as `E-04-01`, the first E-04 take. `tools/provenance.py sync` matched it to its job by bytes. It decodes to 1280×720 h264, 193 frames, time_base 1/12288, AAC 32 kHz.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-07` | `E-03-01` (approved) + `E-04-01` | 192 + 193 = 385 | 16.041667 s |
Only the two shots asked for, as with `-05`; E-01 and E-02 are not in it.
Picture: stream-copied; all 385 frames hash-identical to their sources.
Seam: 15.8 dB, against 53.5 dB for E-03-01's own last step and 39.2 dB for E-04-01's first. That is a real cut to a new angle, which is what the prompt asked for, not a continuity join.
Audio: 48k, sample-exact to picture, AAC 192k once. `E-03-01`'s 64 ms shortfall is filled with its own mirrored tail (10 ms crossfade in), as in `-05`. `E-04-01` is 74 ms short; eased out over 10 ms and padded. The room tone steps down about 5 dB across the cut (−40.8 → −45.8 dB over half a second each side). No bed, no music.
What E-04-01's frames show (0, 2, 4, 6, 8 s):
Nothing approved. Free: download and local assembly, no credits.
Mabel, on `-07`: *"can you blend the sound on evening scene 7 to make it more cohesive and together"*.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-08` | `-07`'s picture (`E-03-01` + `E-04-01`), new mix | 192 + 193 = 385 | 16.041667 s |
What was wrong in `-07`: measured on 100 ms windows. The two rooms' tone was never the mismatch: the floor (10th percentile) is −48.1 dB in `E-03-01` and −47.1 dB in `E-04-01`, with bands within about 2 dB of each other from 20 Hz to 16 kHz. The mismatch was the dialogue: the 90th percentile is −17.6 dB in E-03 and −23.6 dB in E-04, so the Old Printer's line came in 6 dB below the Young Printer's. At the cut, E-03's last sound (−41) dropped straight into E-04's silent head (−47).
The mix:
Result:
Not yet done:
Nothing approved. Free: no credits.
Mabel, on `-08`: "ok why not. can you add that blend to the approved evening scene?"
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-09` | `E-01-01-nosmoke` + `E-02-05` + `E-03-01` + `E-04-01` | 229 + 240 + 192 + 193 = 854 | 35.583333 s |
It is built on `evening-scene-06`, the approved `CUT-evening`.
Picture: `-06`'s video stream with `E-04-01` stream-copied on. All 854 frames are hash-identical to their sources.
Audio:
Not approved. `CUT-evening` is still `-06`. Carried forward from `-06`:
Nobody has listened to it yet. Free: no credits.
Mabel: "approve evening scene 9".
| shot | approved | contents |
|---|---|---|
| `CUT-evening` | `evening-scene-09` (`3f52c3bc`) | `E-01-01-nosmoke` + `E-02-05` + `E-03-01` + `E-04-01`, 854 frames, 35.583333 s, the `-08` blend from E-03 on |
Superseded: `-09` supersedes `-06` as the evening cut, approved at 15:12 PDT against `-06`'s 14:15. `-06` stays as the record.
Not approved: `E-04-01` as the E-04 shot. Mabel approved the cut, not the take.
Carried forward:
Free: no credits.
Mabel: "pull both new higgsfield takes. cut the most recent one with the approvede04".
The takes. Higgsfield had two new completed rolls, both E-05, the Young Printer's count in close-up (thread t19). A third roll, `1cc3b50c` at 15:40, was flagged nsfw and has no result.
| take | job | rolled (PDT) | note |
|---|---|---|---|
| `E-05-01` | `3a34547d` | 15:47 | already pulled by the t19 session at 15:50; sha256 matches this download, left as it was |
| `E-05-02` | `27a76d93` | 16:07 | pulled now; Mabel's edited, tidied t19 prompt (handheld over the Old Printer's shoulder, focus racks to the counting hand) |
`E-05-02` is 11 s at 720p/24, 265 frames, time_base 1/12288, AAC 32 kHz, 7,022,124 bytes. `tools/provenance.py sync` matched both files to their jobs by bytes.
"The approved e04" was read as `E-04-01`. It is the only E-04 take and the one in the approved `evening-scene-09`; E-04 has no shot-level approval.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-10` | `E-04-01` + `E-05-02` | 193 + 265 = 458 | 19.083333 s |
Picture: stream-copied; all 458 frames hash-identical to their sources.
Seam: 11.7 dB, against 23.2 and 35.0 dB for each side's own step. It is a hard cut to the new angle.
Audio: the `-08`/`-09` blend, 48k, AAC 192k once.
Result: dialogue at −18.6 / −18.6 dB and floors at −40.4 / −40.8. Across the cut the level falls from E-04's last words to about −36, then E-05 comes in, with no dropout.
What E-05-02's frames show (0, 2, 4, 6, 8, 10.9 s):
Nothing approved. Free: downloads and local assembly, no credits.
Mabel, after `evening-scene-10`: "oh sorry approve the e04 take".
| shot | approved | contents |
|---|---|---|
| `E-04` | `E-04-01` (`1bb2cd9b`) | job `a9b0d465`, the first E-04 take: version A of the t18 new angle, over the Old Printer's shoulder into an orbit |
Where it is used: it is already in the approved `evening-scene-09` and in `evening-scene-10`. In both reels its sound runs +5 dB. The approved file itself is the untouched download.
Known faults, approved over:
Still to do:
Free: no credits.
Mabel: "pull the next one and clip it with e0502".
The take. The newest roll is job `029d8084` (16:35 PDT), `seedance_2_5`, 10 s at 720p/24, with sound. It is the E-06 wide orbit of the whole table written on t20, rolled on Mabel's edited prompt with the five evening reference stills. Pulled as `E-06-01`, the first E-06 take. `tools/provenance.py sync` matched it to its job by bytes. It decodes to 241 frames, time_base 1/12288, AAC 32 kHz.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-11` | `E-05-02` + `E-06-01` | 265 + 241 = 506 | 21.083333 s |
Picture: stream-copied; all 506 frames hash-identical to their sources.
Seam: 13.0 dB, against 37.2 and 43.8 dB for each side's own step: a hard cut, close-up to wide.
Audio: the `-08`/`-10` blend.
Result: dialogue at −18.7 / −19.5 dB. Floors are −41.1 / −38.2: E-06's own room tone is louder, and the gain lifts it. Across the cut the level stays between −35 and −39 dB.
What E-06-01's frames show (0, 2, 4, 6, 8 s):
Nothing approved. Free: download and local assembly, no credits.
Mabel: "pull the latest generation", then "clip it with the approved e04".
The take. The newest roll is job `e9abff32` (09:11 PDT), `seedance_2_5`, 11 s at 720p/24 with sound: the calm rewrite of E-05 on thread t19 (quiet, even voice; sits back; hand opens palm-up). A parallel session had already pulled it as `E-05-06` at 09:16; its byte length matches the job's result and the ledger names the job, so it was left as it was. It decodes to 265 frames, time_base 1/12288, AAC 32 kHz.
"The approved e04" is `E-04-01` (`1bb2cd9b`), the approved E-04 take; the file's sha256 matches the approval.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-12` | `E-04-01` + `E-05-06` | 193 + 265 = 458 | 19.083333 s |
Picture: stream-copied; all 458 frames hash-identical to their sources (framemd5). A hard cut from the Old Printer, lit from below, to the Young Printer with his eyes lowered.
Audio: the `-10` blend, rebuilt with ffmpeg filters, 48k, AAC 192k once.
Result: −18.9 LUFS over E-04 and −18.6 over E-05; peak −3.3 dBFS. Across the cut the 100 ms RMS falls from about −19 to −29 dB with no dropout.
sha256 `74d4ee42527cb1b04fa530567262c18a43fd6f8bd2d069af7ce02a618434a38a`.
Nothing approved. Free: local assembly, no credits.
Not pulled: the only other completed job never recorded in the ledger is `f770fae2` (3 Sep, `seedance_2_5`), a 15 s parkour and urban acrobatics clip unrelated to the film. It is held pending Mabel's word rather than added to the gallery.
Mabel: "pull the latest clip from higgsfield and cut it with the approved e04".
The take. The newest roll is job `c19d354d` (10:58 PDT), `seedance_2_5`, 10 s at 720p/24 with sound, pulled here as `E-05-08`. It is the second roll of the voice-reference prompt: five image references plus the two voice clips (`refs/char/old-printer-voice.wav` as AUDIO REFERENCE 1, `young-printer-voice.wav` as 2), `generate_audio` on. Its prompt differs from `E-05-07`'s by one clause — the Young Printer no longer "draws a small, uneasy breath" before he speaks. 241 frames, AAC 32 kHz.
"The approved e04" is `E-04-01` (`1bb2cd9b`); the file's sha256 matches the approval in `assets.json`.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-13` | `E-04-01` + `E-05-08` | 193 + 241 = 434 | 18.083333 s |
Picture: stream-copied; all 434 frame hashes identical to their sources.
Audio: `-12`'s blend, at 48k, AAC 192k once.
Result: −18.0 LUFS over each half, −18.1 over the whole, peak −3.8 dBFS.
sha256 `a1680faee0e6ac5e…`.
Nothing approved. Free: local assembly, no credits.
Mabel: "add the approved m05 to eveing scene 9", then "yes E-05" — M-05 is a morning shot, and the piece she meant is `E-05-08`, approved half an hour earlier.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-14` | `evening-scene-09` (`E-01-01-nosmoke` + `E-02-05` + `E-03-01` + `E-04-01`) + `E-05-08` | 854 + 241 = 1095 | 45.625000 s |
**This is the evening as far as it goes: five of five approved takes, in order, with no gap.** `evening-scene-09` is the approved evening cut of 14 Sep and goes in untouched; `E-05-08` is the E-05 take approved today.
Picture: stream-copied; all 1095 frame hashes identical to their sources.
Audio: `-09`'s track unchanged, `E-05-08` at −3.3 dB (the same gain it took in `evening-scene-13`, since it came off the roll at −15.7 LUFS). Each side padded with its own mirrored audio to picture length plus 120 ms — `-09`'s tail 5,728 samples, E-05's first 5,760 reversed ahead of it and its last 4,304 reversed behind — then a 240 ms equal-power (`qsin`) crossfade on the E-04/E-05 cut. 2,190,000 samples, `alimiter` at −1 dBFS.
Measured: −18.5 LUFS over the `-09` part, −18.0 over E-05, −18.4 over the whole, peak −3.0 dBFS. `-09`'s room-tone bed stops where `-09` does: E-05-08 runs on its own production sound, as it did in `-13`.
Inherited, unchanged: the E-01 flare is still mix B and still disagrees with the approved E-01 take (mix A) — carried since `evening-scene-03`.
sha256 `a2e8b3942d5b09ca…`.
Nothing approved. Free: local assembly, no credits.
Mabel: *"can you combine the full morning scene with evening scene 14. dont put it on either reference gallery but a dif page idk"*.
| file | contents | frames | duration |
|---|---|---|---|
| `refs/film/the-offer-cut-01.mp4` | `morning-scene-41` + `evening-scene-14` | 1716 + 1095 = 2811 | 117.125000 s |
Both halves are the approved cuts, carried whole: `morning-scene-41` (the morning reel, eleven of eleven shots, approved 10 Sep) and `evening-scene-14` (the evening through E-05, approved today). **Picture stream-copied; all 2811 frame hashes identical to their sources.** Audio decoded and rejoined sample-exact at 48k, each scene trimmed to its own picture length (3,432,000 and 2,190,000 samples), then AAC 192k once. No gain, no crossfade, nothing re-mixed — a first look, not a grade.
**THE TWO SCENES ARE 7 dB APART: the morning measures −11.4 LUFS and the evening −18.4.** The morning carries music and its peak already sits at 0.0 dBFS, so the join is a real drop in level, not a subtlety. Nothing was done about it here because both halves are approved as they are; matching them means either pulling the morning down or lifting the evening, and that is a decision, not a build step.
A new home, and why it is not `refs/cuts/`. `refs/cuts/` is the one flat, scene-named series (`morning-scene-NN`, `evening-scene-NN`); a whole-film assembly is neither scene, and starting a third family in that directory is exactly what the naming rule forbids. It lives in `refs/film/` instead, which is new, and is mirrored to the bucket like the rest of `refs/`.
Its own page. `build.py` now keeps `refs/film/` off both reference galleries (`scenes_of` returns no scene for it) and writes `public/film.html` instead: every assembly in `refs/film/`, newest first, each with its size, its date, what it was assembled from and how — with a card on the index pointing at it.
sha256 `b5c76e9dfb015e71…`.
Nothing approved. Free: local assembly, no credits.
Mabel: "rebuild evening scene 14 on the new one" — the new one being `E-05-09`, the tail trim of `E-05-08` approved minutes earlier for the E-06 continuation.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-15` | `evening-scene-09` + `E-05-09` | 854 + 193 = 1047 | 43.625000 s |
It supersedes `evening-scene-14`, approved earlier today, which carries the untrimmed `E-05-08` and ran 45.625 s — **two seconds longer, all of it the dead hold after his last word**. `-14` is untouched in `refs/cuts/`, the bucket and the gallery, and stays the record of the reel it was; this closes the reel/shot disagreement the trim opened, the same way 9 Sep closed M-12's.
Picture: stream-copied; all 1047 frame hashes identical to their sources.
Audio: built exactly as `-14`'s — `evening-scene-09`'s track unchanged, `E-05-09` at −3.3 dB, each side padded with its own mirrored audio to picture length plus 120 ms (`-09`'s tail 5,728 samples; E-05's first 5,760 reversed ahead, its last 464 reversed behind), a 240 ms equal-power (`qsin`) crossfade on the E-04/E-05 cut, 2,094,000 samples, `alimiter` at −1 dBFS.
Measured: −18.5 LUFS over the `-09` part, −18.0 over E-05, peak −3.0 dBFS — the same figures as `-14`, since only the tail is gone.
Still inherited: the E-01 flare is mix B against the approved E-01 take's mix A. Still owed: `the-offer-cut-01`, the whole-film assembly on `film.html`, carries `evening-scene-14` and is now a reel behind.
sha256 `8feb712027da2191…`.
Nothing approved. Free: local assembly, no credits.
Mabel: "can you pull the clip and cut it with the approved m05" — E-05 again, as at 11:28; the morning M-05 has no business in the evening.
The take. Job `611bc264` (12:35 PDT), `seedance_2_5`, 8 s at 720p/24 with sound, pulled as `E-06-02`. The first E-06 rolled since the line moved to the Young Printer, and the first rolled as a continuation: five image references, `E-05-09` as a video reference, and `refs/char/young-printer-voice.wav` as AUDIO REFERENCE 1.
| cut | contents | frames | duration |
|---|---|---|---|
| `evening-scene-16` | `E-05-09` + `E-06-02` | 193 + 192 = 385 | 16.041667 s |
Picture: stream-copied; all 385 frame hashes identical to their sources. Audio: both takes at −3.3 dB (they came off the platform at −15.7 and −15.9 LUFS), each padded with its own mirrored audio to picture length plus 120 ms, a 240 ms equal-power crossfade on the cut, 770,000 samples, `alimiter` at −1 dBFS. Measured −18.0 and −18.3 LUFS, peak −3.9.
THE CONTINUATION WORKED. Across the cut the framing holds — the Old Printer close and dark in the near left, Lufft's hands at his chin, the young man right of the candle — and the grade matches. It plays as one shot. That is the first time a shot in this film has been built to continue another.
THREE FAULTS IN THE TAKE, all in the take and none in the join. 1. A sentence is missing. He goes from "wem es ihn gelüstet" straight to *"als wären sie nicht dieser Stadt ganzer Handel"; "Als wären sie nichts."* is not spoken. Speech runs 0.6–6.8 s of the 8 s, so it was not cut for time. 2. The camera barely travels. It widens a little and stops; the prompt asked to end on all three men small in a wide of the whole table. Prose describing a move has now failed twice here (the orbit in `E-06-01`, this pull-back). 3. Paper and a candle holder are back in frame — white sheets pinned along the top throughout, and a dish under the candle by the last frame. Both bans had been taken out of the prompt at Mabel's direction earlier the same day. **The paper is a text surface: this take needs the enlarged read before it can go in any reel.**
The prompt was rewritten against all three for the next roll (three numbered sentences, the camera move as a start frame and an end frame with a size test in it, and the paper and holder bans back), at 12 s rather than 10.
sha256 `507cd7403f5fbde9…`.
Nothing approved. Free: local assembly, no credits.