← All drafts

PLAN — from current draft to finished film

The roadmap for taking The Offer from the screenplay to a finished AI-generated short. Working order is top to bottom; checked boxes are done. Conventions live in `AGENTS.md` and still apply to every step here.

The two hard rules (apply to every phase)

1. The number is the reveal. The 400-gulden figure appears on screen exactly once: the INSERT of the unfolded contract in Katharina's hands, near the end of the courtyard scene (and the burn that follows it). In every other shot, in every scene, the contract's writing is angled away, back-to-camera, or folded. Reject any generation that leaks a legible sum earlier. 2. All in-frame text is period German. Blackletter (Fraktur/Schwabacher) for print, a 16th-century manuscript hand for the letter, ledger, and contract (the reveal reads `400 Gulden jährlich`). Reject any generation showing English words anywhere.

The platform (decision, 3 Aug 2026)

Higgsfield is the production platform for everything generated — picture, voice, music, sound design. The CLI is installed and authenticated (`plus` plan, 1,200 credits granted monthly); companion skills live in `.agents/skills/`. Model inventory, measured prices, and what this costs us are in Services below.

One consequence is load-bearing and is recorded here so it is not discovered late: no engine reachable through Higgsfield accepts phoneme (IPA) input. Period pronunciation is therefore forced by respelling the recording script, not by a pronunciation dictionary — see Phase 2a. That is a real capability we are choosing to give up in exchange for a single platform.

Phase 0 — Script lock

Phase 1 — German recording script, then generation sheets

Two deliverables, in a fixed order: 1a — `the-offer-de.fountain`, every spoken line in Early New High German (decision of 1 Aug 2026; English subtitles are authored later in the edit, and the English fountain stays the story's source of truth). 1b — one generation sheet per scene, quoting its dialogue verbatim from the German script. The order is fixed because the sheets quote the German word for word: 1a must pass verification before the remaining sheets are written or re-quoted.

1a — German recording script

1b — Generation sheets (one per scene, from the locked script)

Format per `shots-morning.md`: intro note naming the draft it was written against, a BOILERPLATE block, a shot grid (one row = one generation), a continuity checklist. The Audio column quotes the German script verbatim — no shortened speeches. The study and courtyard sheets also need the scratch-track timings (Phase 2a), so the practical order is: 1a → evening re-quote → scratch track → study and courtyard.

Phase 2 — Two decisions before any generation

Both get decided by cheap probes, not marketing pages. Speech timings must exist before picture is generated, because generated clips have fixed durations. Concrete services, prices, and tradeoffs live in Services below.

2a — Dialogue delivery

2b — Which model, not which service

The service is settled (the platform, above); what is open is which Higgsfield model does the bulk and which does the hero shots.

So the reference set fixes casting, and getting the prompt onto the wire is what lets the prompt fix anything at all. Neither costs a credit. Plates are the untested lever, and they are aimed at what is left. `m03-startframe-01` and `m03-endframe-01` are local composites of approved stills (the arms and sheet of `wet-sheet-04` over `shop-day-26`'s near press; M-03-09's landing frame with the press composited in behind it). They cost nothing to build and have never been rolled. The one defect prose and casting have not touched is in M-03-11 still: the sheet lands rotated about 90° — both headings along the top edge while he holds it, along the bottom edge reading sideways once it lands. Foreshortening cannot move which edge a heading sits on. That, and not staging, is what a pinned end frame is for. Frame pinning is API-only, and pinning is not what costs, 25 Aug 2026. Two facts measured on M-03 today, which together mean free and plate-pinned do not intersect:

So the trade is never "plates cost extra." It is one free web roll the model stages for itself, against one 26-credit roll whose first and last frames we decide. Trap: the Unlimited toggle resets when you leave the Create Video tab (25 Aug 2026). Stepping into another product and back kept the prompt and all three references but silently turned Unlimited off — the button went from Unlimited to 26. Re-read the button immediately before Generate and confirm it carries no credit figure. This is the likeliest way a roll believed to be free is charged. Unlimited stopped being free on 10 Sep 2026 (found 18 Sep from `higgsfield account transactions`). The ledger shows 254 `seedance_2_5` rolls charged 0 between 19 Aug and 8 Sep. **Every roll from 10 Sep on, 33 of them, was charged at 6.5 credits a second, 2,164 credits in all.** Most of those were the evening, 1,885 net of refunds. The rolls were set up as Unlimited, and the ledger shows no plan change, grant or reset between 8 and 10 Sep that would explain it. A session flagged this on 16 Sep (thread t21), but the flag never reached this file, and the rolls went on being proposed as free. Treat every video roll as paid at seconds × 6.5 credits. The evening's 1,885 credits bought seven shots, about 270 a shot at roughly four rolls each. The rest of the film at that rate is about 14,700 credits against a balance of 3,876.5. Only a recent roll charged 0 in the ledger shows that Unlimited works again. The trap above is not the explanation, because the label was re-read before each roll and they were charged anyway.

Phase 3 — Visual development (before volume generation)

Sequencing note, 3 Aug 2026. The morning slice of this phase depends on nothing still open in Phases 0–2: character and set appearance do not move when dialogue changes, the morning sheet is written and already re-quoted in German, and every spoken line in that scene is VO or off-camera walla — so no lip-sync, and none of the Phase 2a audio gates apply. (PLAN called the morning "wordless" under Phase 4; "no sync dialogue" is the accurate reason it is the cheapest scene to learn on.) Do the morning screen test first, ahead of script lock and the 1a verification pass, and scope its references to the morning's cast only — Young Printer, Old Printer, the print shop interior, the exterior street look. Luther, Katharina and Lufft do not appear in the morning and their stills can wait for lock. Of these, the **print shop interior is the harder consistency problem than any face**: it carries 9 of 14 shots — one interior fewer out of thirteen since M-10 was cut, 5 Sep 2026 — and the checklist pins two presses, counting desk, long oak table and window placement.

The exterior was missing from this list until 3 Aug 2026 and is not optional: four morning shots are outdoors (M-01/02/09/11) and the checklist requires them to read as one route — gate → alley → printers' lane → shop door — in consistent early light. Approve one town look (palette, architecture, morning sun) and generate the four locations from it by reference rather than approving them separately. *(It was five shots and four locations until the market was cut on 7 Aug 2026.)*

The stops are named `runner-path-NN` in route order (Mabel's direction, 7 Aug 2026), so the number says where in the run you are — and the four numbers are the four exterior shots, M-01/02/09/11, one each. M-01 gets `runner-path-01` even though it is feet on packed dirt with no architecture in frame: the surface, light and palette under those feet open the film and have to match the gate a cut later, and it is cheaper to pin them in a still than to hope. This is a different prefix from `town-ext-*` on purpose: `town-ext` is the hunt for the look, `runner-path` are the places generated from it. Full convention, with what each stop wants in frame, in `shots-morning.md`. The prefix is registered in `build.py`'s `SCENES`, which counts approved sets per scene by filename prefix — a new set slug that is not listed there is invisible on the index.

**One approved hero still per subject, plus supporting angles generated from it.* `seedance_2_0` conditions on an `image_references` array*, so feeding the character still and the set still together beats either alone — and a second or third angle of an approved set, generated from the hero, strengthens the lock further. Cheap: `flux_2` is 1 credit a go.

Prompt characters descriptively ("a heavyset, clean-shaven scholar in his fifties, black cap, 1539") — naming "Martin Luther" trips real-person filters and drags in stock Luther iconography.

Add the clause to each sheet's BOILERPLATE before its scene is generated; the morning's BOILERPLATE currently has none, and "1539" alone does not carry it.

The screen test (defined 3 Aug 2026)

What it is: a deliberately small trial run of the morning scene only — approve its reference stills, then generate two or three of its shots — to find out what the pipeline does wrong before ~70 shots are committed to it. The morning is chosen because it clears no gates: it needs no script lock, no Phase 1a verification and no voice engine (every line in it is VO or off-camera walla). It runs on `seedance_2_0` with `generate_audio: false`.

What it is not: a model bake-off (Phase 2b), or the start of the volume run — which waits on Seedance 2.5. What it teaches is prompt wording, QC and sheet corrections, and those transfer to whichever model wins.

Two probe runs exist — don't conflate their files. Before the platform decision there was a klingai.com free-credit probe (1 Aug 2026), driven by `probes/video/morning-prompt-kit.txt`: takes for M-01 and M-04 plus QC frames (labelled `clipB_*` for the M-04 clip) in `probes/video/morning/`, local-only — never pushed to the bucket. Its findings fed the sheet rules: the type-case labels rendered pseudo-blackletter (spelling nothing), and the runner's shoes came back as modern laced derbies — period costume needs checking down to the feet. The **Higgsfield screen test (3 Aug 2026)** is the M-03/M-02/M-07 run described here; its clips live in the bucket under `refs/probe/`. So M-07 is uncovered by both runs.

Shots chosen to stress the no-text rule rather than avoid it, a print shop being the worst case for it: M-03 (printed sheet is the subject), M-07 (full shop in motion), M-02 (exterior, character and set at once).

Phase 4 — Generation, scene by scene

Order: morning (wordless, cheapest to learn on) → evening → study → courtyard.

For each scene sheet:

Phase 5 — Audio

Any word in neither fails the gate and blocks generation. That way a newly written or edited line cannot reach the engine until someone has ruled on every word in it, and the check reports which words are unclassified rather than just failing. The waiver list is doing the real work here: it is what turns "we didn't think about it" into "we decided it was fine."

This is production tooling, not a probe — it belongs committed alongside `build.py`, and re-runs whenever the German script changes. *(If the direct-ElevenLabs route is ever taken instead, the same gate applies with the `.pls` lexicon standing in for the guide — the mechanism is identical, only the artifact changes.)*

Phase 6 — Edit and finish

Two placements were considered and dropped. **A hill overlooking the town, the runner pausing on it:** Wittenberg sits on the flat Elbe lowland, so the vantage is an invention needing a `DRAMATIC LICENSE:` flag for a shot whose only job is to carry text (worth verifying, not verified); and the pause deflates a runner who is carrying the news that Frankfurt and Basel are gone, breaks the tightening route the continuity checklist enforces (gate → market → alley → lane → door), and fights the runner motif, which is built to snap back in on every exterior cut. **A pull-back out through the shop roof mid-scene:** right instinct about where the tension is, wrong mechanics — an impossible camera move is a register this otherwise grounded, observational film never establishes, and it is not one generation but a composite, since no model will hold the approved shop interior and then produce a matching period town aerial in a single clip. The rooftop rise at 3 above is that idea with the move made possible and put at the scene break.

Sound is part of this choice. `shots-morning.md` kills the runner motif dead on the M-12 door bang and never brings it back. A title landing in the silence after M-15 is the one place a composer would naturally return it, transformed — decide that with the placement, not after.

Whichever wins, it is a shot: it goes in `the-offer.fountain`, gets a row on `shots-morning.md` (M-16), and the title card itself is still made in the edit and never generated into frame.

The edit toolchain (decision, 7 Aug 2026)

Constraint, stated 7 Aug 2026: post-production tooling is open source. Not a budget preference — a condition on the pick. DaVinci Resolve is proprietary (Blackmagic Design; the free tier is gratis, not open source) and is therefore out, including as a fallback for the grade. This constraint governs the edit, grade, and mix only; the generation platform is a separate decision already made in The platform above, and Higgsfield is a commercial service.

Kdenlive for the edit, MLT/`melt` as the engine underneath it. Both are GPL/LGPL, so the open-source constraint is met and there is no licence to buy.

Correction — none of it is installed, and the 7 Aug text said it was (25 Aug 2026). That paragraph read *"installed and checked on this machine: kdenlive 25.12.3, melt 7.36.1, ffmpeg 8.0.1, Blender 5.2.0 LTS. Nothing to procure."* Checked again on 25 Aug: no `kdenlive`, no `melt`, no `blender`, no `ardour`, no `audacity` — not on `PATH`, not in apt, snap or flatpak, not in `/opt`. The only post tool actually present is ffmpeg 7.0.2, a johnvansickle static build in `~/.local/bin` dated 4 Aug, which is also not the 8.0.1 that was claimed. Nothing downstream changes — the picks below stand on what the tools are, not on their being to hand — but **Phase 6 opens with an install step it currently assumes is done**, and the versions above are unverified until someone runs them. Re-check at install time rather than trusting a line in this file.

The reason to prefer it here is not cost. *Kdenlive's project file is* MLT XML, and `melt` renders that XML headless** — so the cut becomes a text artifact this repository can generate and regenerate, exactly like everything else here. That matters because of how this film is made: takes get regenerated constantly, and in a conventional NLE every swap is a manual relink. If the assembly is built from the sheets, swapping a take is an edit to a file and a re-render.

The pieces to make that real, when Phase 4 has produced enough to cut:

This is not a task for now — Phase 4 has to produce clips first. It is recorded here so that when assembly starts, nobody hand-cuts what could have been generated.

Where the choice bites: the grade. Unifying takes that drift between generations is the one job a colorist-grade tool is built for, and Kdenlive's grading UI is the weakest part of it — thin scopes, per-clip matching by eye. The correction filters themselves are not the problem; `frei0r.colgate`, `frei0r.levels`, `avfilter.lut3d` and `avfilter.colorlevels` are all present.

Plan A — measure it, don't eyeball it. Drift between generations of the same setup is a measurement problem before it is a taste problem, and this is the rare case where scripting beats a colorist's eye: the takes are supposed to match each other, so the target is arithmetic, not judgement. ffmpeg carries both halves — `signalstats`, `waveform`, `vectorscope` and `histogram` to measure a reference frame per clip, `lut3d` to apply the correction the measurement implies. Emit one LUT per clip, reference it from the MLT XML, and the grade stays in the same generated-and-regenerable path as the cut. Nobody has built this yet; do not assume it is cheap. But it is the version that survives a take being regenerated, which hand-grading is not.

Plan B — Blender's compositor, for what measurement can't fix. Blender 5.2 LTS is installed and GPL. Its compositor is node-based with real scopes (waveform, vectorscope, histogram), it reads and writes image sequences, and it is driveable from Python — so it fits this repo the way a GUI-only tool would not. Use it for shots that need an eye rather than a formula, and keep Kdenlive for the cut.

Blender is not the recommendation for the edit itself. Its sequencer can cut video, but for a dialogue short with subtitles and a music/SFX bed, Kdenlive is the better instrument and MLT XML is the reason. Use Blender as a compositor alongside it, not as a replacement for it.

Decide between A and B when there are real takes to look at, not before. If both fall short, the answer is a better open-source path — not a proprietary one; see the constraint at the top of this section.

Two smaller consequences, neither blocking. Kdenlive has a subtitle track that exports SRT and can burn in, which covers the English-subtitle checkbox above (sidecar for the web, burned where a platform demands it). Its audio mixing is basic, so the final mix goes to Ardour (GPL, and also not installed — see the correction above): a video timeline to cut against, EBU R128 metering for the master, and stem export for dialogue, music and SFX. Reaper would be the pragmatic alternative and is out under the constraint at the top of this section, exactly as Resolve is.

Everything before the mix stays in ffmpeg (decision, 25 Aug 2026). Cue trims at bar lines, SFX beds, loudness measurement and `morning-scene-*`-style assemblies are scripted, not dragged: `loudnorm`/`ebur128` for levels, `acrossfade`/`afade` for joins, `adelay`+`amix` for beds, `astats` and cross-correlation for measuring what a file actually is. The reason is the one that governs the cut — a scripted mix is regenerable when a take is re-rolled, and a hand-dragged waveform is not. It is also what recovered the `morning-scene` recipe when nobody had written it down. Audacity is fine as a pair of ears for auditioning a cue; decisions do not live there.

Phase 7 — Release

Services — the picks (researched 1 Aug 2026)

Numbers verified against vendor pages on 1 Aug 2026 — prices drift, so re-check at signup. Each category is down to its pick (and, where one is named, its fallback); the alternatives that were weighed are in git history if a probe overturns a pick.

Higgsfield — the whole stack, revised 3 Aug 2026

Higgsfield CLI is installed and authenticated (`higgsfield auth login`; `plus` plan, 1,200 credits granted monthly). **It carries all four picture picks** — `flux_2`, `nano_banana_pro`, `kling3_0`, `veo3_1` — so the picture stack sits behind one auth instead of a `FAL_KEY` plus a Black Forest Labs key plus a Google key. It also carries four TTS engines, a music model and a text-to-audio model, which is what makes a single-platform production possible at all. Companion skills are under `.agents/skills/`.

Measured with `higgsfield generate cost` on 3 Aug 2026:

Images (per generation)CrVideo (per second)Cr/s
`text2image_soul_v2`0.12`veo3_1_lite`1.0
`flux_2`1`kling3_0` std, sound off1.5
`nano_banana_pro`2`kling3_0` pro, sound off1.75
`gpt_image_2`7`veo3_1`2.75
`seedance_2_0`4.5

Audio: `seed_audio` ≈ 0.3 cr per generation. At 59 speeches the entire dialogue track costs well under 100 credits, so **audio is not a budget line** — it is a quality and control problem only.

What this changes:

Video generation — pick: `seedance_2_0`, revised 3 Aug 2026

A "pass" below ≈ 1,400 generated seconds (every shot × 3 takes).

Why this changed. The 1 Aug pick was Kling 3.0, chosen for **Subject Binding** — locking a character from 2–4 reference stills, called then "the strongest consistency feature on the market, and exactly our stated lever." Checking the parameters Higgsfield actually exposes, on 3 Aug: it isn't there. `kling3_0` takes `start_image` and `end_image` and nothing else, and `veo3_1` takes only `start_image` — Veo's "3 ingredient images" is likewise not reachable. Multi-reference conditioning survives in exactly one family:

ModelReference conditioning exposed
`seedance_2_0` / `_mini``image_references` + `video_references` + `audio_references` (mini: ≤9 images)
`minimax_h3``image_references` + `video_references`, 2K
`kling3_0``start_image` / `end_image` only
`veo3_1``start_image` only

Character and set consistency across ~70 shots is this film's hardest technical problem, and multi-reference conditioning is the stated lever for it. That decides the category.

Seedance 2.5 is the video model — Mabel's direction, 7 Aug 2026. All video generation goes to `seedance_2_5`; `seedance_2_0` is the fallback and nothing more. Released 31 July 2026, it generates a 30 s clip in one run with multi-turn extension, and our longest speech is ~29 s, so that ceiling removes the speech-splitting constraint entirely.

It reached the Higgsfield catalog on 7 Aug 2026 (this section's earlier "not on Higgsfield yet, 2.0 and 2.0-mini only" is superseded), but three measured facts stand between it and the direction, and each is a live task rather than an objection:

It also takes up to 50 reference items against 2.0's 9 images / 12 total, and both models floor at 4 s (M-01 is specced at 3 s: generate at 4 s, trim in the edit). A fourth cap, found the same day: **2.5 rejects prompts over 4000 characters** before generating anything, and shot prompts written for 2.0 run past it (the M-01 whole-figure prompt was 4446) — trim before rolling. Lifted, 19 Aug 2026: a 4704-character M-01 prompt generated normally, so the cap is gone or has moved well above 4700. Don't trim a shot prompt down to 4000 on this account any more; the reason to keep one short is that the model drops what it cannot hold, not that it refuses the job.

Why the gate will not clear by retrying (7 Aug 2026). The bullet above says re-test before every take. Do it once a day, not once a take: the cause is known and it is not ours. A plain 512×512 grey square, freshly uploaded, fails `omni_reference` with the identical error — content, source and age are all irrelevant, so there is nothing about our stills to fix. It matches open issue [higgsfield-ai/cli#49](https://github.com/higgsfield-ai/cli/issues/49), filed against `cinematic_studio_video_3_5`: the newer models gate on an `ip_detected` field that only UI-created jobs populate, and media attached through the public API's `medias` roles never receives that state, so the gate waits for a verdict that will never arrive. Older models skip the gate entirely, which is exactly why 2.0 takes the same uploads. Unresolved upstream, no maintainer response, no workaround posted; 2.5 is a second affected model.

**Of the two escape routes tried on 7 Aug, the first one won — a week later, and only because the CLI moved.* (1) Typed job references.* The API's media schema accepts `nano_banana_job`, `flux_2_job`, `seedance_2_0_job` and the like — pointing at the job that generated an image rather than at an upload of it, which is the shape most likely to carry the screening state. **This is the answer**, and the 7 Aug finding that "the CLI cannot express it: it converts every UUID to `media_input`" was true of the CLI of that afternoon and is no longer true of 1.1.22. The lesson is narrower than "the route is closed": a capability blocked by the client, not the API, is worth re-testing after a client release. (2) Calling the API directly. The gateway is `https://fnf-api-gw.higgsfield.ai/fnf`, endpoints under `/developer/v2alpha/` (`jobs`, `media`, `reference-elements`), and the CLI's stored OAuth token authenticates fine — but every request returns `X-Fnf-Workspace-Id: Field required` no matter how the header is sent, on every endpoint, because the gateway strips inbound `X-Fnf-*` identity headers and injects its own for trusted clients. Copying the CLI's user agent does not help. **The CLI is the only working route into this API** — the lesson is the opposite of "stop using the CLI." That leaves the web UI as the one untested path to 2.5 references, since UI-created media is what populates the field in the first place.

**The groundwork laid while the gate was shut is what made the fix usable the same afternoon it was found.** `tools/reindex.py` (which replaced the `media_ids.py` sketch) matches every still to the job behind it by content rather than by bytes — an average hash over the job's preview, so a re-save, crop or rescale still resolves, and a recomposite honestly does not. It records `job_content` and its distance in `refs/provenance.json`, deliberately apart from `job`, which stays byte-exact. Where a sheet was assembled from panels it records `panel_jobs`, which is what `--ref <sheet>#N` reaches. That store is what `gen.py` reads to translate a named still into a job id, and the reason the 7 Aug prediction — "those six have to be re-generated on the platform in their final form" — turned out to cost one still rather than six.

Two standing consequences: `gen.py` records the job id as each file lands (`provenance.job_by_result`, a lookup on the result URL it just downloaded, not an inference), so a still generated now is referenceable in the very next take; and the 18 MB turnaround is never re-uploaded — a job id is 36 characters.

Reference stills — pick: `flux_2`, with `nano_banana_pro` for text

Voices — four Higgsfield engines, picked by probe

No TTS anywhere is trained on Early New High German, so every engine gets judged on the same two things: how hard is it to force the period forms, and can delivery be directed.

The capability we gave up, stated plainly. None of the four exposes phoneme/IPA input. Going through Higgsfield means going without pronunciation dictionaries, so forcing is done by respelling the text (Phase 2a). Direct ElevenLabs would restore IPA — `eleven_v3` is the only ElevenLabs model that applies phoneme rules in German, and it does so from a word-level `.pls` lexicon — but that means a second vendor, a second key, and a second bill. Revisit only if the respelling route fails the probe.

Money does not decide this category: it buys minutes, not pronunciation control. Pick on capability.

Decision rule: whichever engine holds the period forms with the least respelling per line wins; directability breaks ties. Watch the ensemble problem — six generated voices across 11 minutes go samey fast, so differentiate hard and check them back to back before committing.

Registered voices — use these, don't clone again (16 Sep 2026). A clone is a Higgsfield voice element: 40 credits once to make, then a line costs the same as a preset on `seed_audio` (0.6 cr for his E-04 speech on 16 Sep, 0.2 for a three-word line — it scales with length). Cloning the same man twice buys a second, slightly different voice for him, which is the drift this exists to stop.

CharacterVoice idTypeCloned from
Old Printer`e7fb0e6d-3da5-4350-a02d-1f5b3161d265` ("Old-Printer")`element``refs/audio/voice-old-printer-evening-10s.wav` — E-04-01 speech + E-02-05 line, both evening

A line in his voice: `hf generate create seed_audio --prompt "<German line>" --voice_id e7fb0e6d-3da5-4350-a02d-1f5b3161d265 --voice_type element`.

Voice references — send them with every speaking take (17 Sep 2026, Mabel). The video models take no voice id, only sound files, and a take rolled with sound but without them invents new voices every time — which is how the Young Printer ended up with three (evening E-03-01 ~200 Hz, morning M-12-54 ~155 Hz, E-05-06 ~115 Hz). So **any take in which the Old Printer or the Young Printer speaks goes out with his voice clip as an audio reference, and with sound on**:

CharacterVoice reference (with the character sheets)Higgsfield upload idMade from
Old Printer`refs/char/old-printer-voice.wav` (11 s)`92945c7e-c2c5-4d70-9025-cba5ae69f3d4` (also `47a716c2…`, same bytes)E-04-01 speech + E-02-05 line, both approved, both evening
Young Printer`refs/char/young-printer-voice.wav` (9.9 s)`0840af95-4ca3-4c1a-a9d7-7fd751e005de`E-03-01 (evening) + M-12-54 (morning), both approved

The same bytes stay at `refs/audio/voice-old-printer-evening-10s.wav` and `voice-young-printer-approved-10s.wav` (hidden from the gallery, kept for the thread attachments and the Old Printer clone's record).

How, and what it takes:

Tried and dropped for the Young Printer, 17 Sep: Voice Change on M-12-54 (1 cr, web only — muddied the words and pulled the whole track down ~6 dB, door and room tone with it); a Seed Audio line in the `Archie` preset dubbed over M-12-54 (0.5 cr — Mabel: "awful"); Qwen TTS refuses the Audio page's presets outright. Preset voices, with gender and preview clips, are listed only in the web voice picker (Audio → Voice Change → Change); the CLI list carries names alone.

Not yet with a voice reference: Lufft (the E-02-05 sample shares the Old Printer's pitch; no usable sample), Apprentice (under 2 s), Luther and Katharina (no samples).

Music — pick: `sonilo_music`

Prompt plus duration, nothing else to configure. The cues are sparse (3–5, per Phase 5), so the ask is small; the flagship is now the morning's runner motif (Phase 5) — catchy and driving, but still on period instruments, so it takes the same ear test as everything else.

Grade it on the same ear test as before: *does this sound like 1539 or like a trailer? Exposed solo lute is where it will fail. *Licensing is now a question to settle, not a solved one** — the previous pick (ElevenLabs Music) was chosen specifically for being trained on licensed data with film use cleared, and that guarantee does not automatically transfer. Confirm Higgsfield's commercial terms cover a published, possibly monetized film before the cues go in the mix.

SFX — pick: `mirelo_text_to_audio`, with Freesound for ambience