Status: implemented for local MiniMax H3. EP001 Draft 1.7 runs three accepted H3 shot classes through a real operator CLI. Hosted MiniMax remains a secondary path (Nous/FAL blocked; direct API unused). The model is still not the editor.
V2 keeps the boring center that made V1 reliable. AI video may generate selected illustrative candidates. Humans still choose the assets. Python plus FFmpeg still make the episode.
V1 proved we could build Milo’s Hardware Reviews from real evidence, an approved script, synthetic narration, programmatic graphics, and ordinary video engineering.[1] V2 adds a controlled AI-shot lane without handing the timeline to a model.
What changed since the August 5 proposal: we did not wait on hosted H3 pricing. Local MiniMax H3 on the M3 Ultra (MLX FL2VA via mlx-serve PR122, loopback-only) became the primary generation path after explicit lab authorization. The first product canary, then bumper and lab atmosphere classes, then a full workflow redo, all completed with receipts and economics.
127.0.0.1:11234mhr h3 · mhr reviewArchitecture at a glance
Evidence and script still feed the contract. AI is a replaceable shot source. Download the editable SVG.
The boundary (unchanged)
| AI may generate | Must remain real or deterministic |
|---|---|
| Short product beauty motion | Product behavior used as evidence |
| Abstract section bumpers | Measurements and telemetry |
| Lab atmosphere and visual texture | Ratings, prices, certifications, caveats |
| Controlled transitions / texture beds | Apple Home and Home Assistant operation |
| Shot variations for human selection | James’s voice and appearance |
| Silent clips only (default) | Narration, captions, timeline, mix, master |
If a visual supports a factual review claim, it must be a real capture or a deterministic graphic made from measured data. Generated video can illustrate tone and motion. It cannot prove anything.
shots.yaml is the editorial contract
Implemented. Generated shots require fallback, silent audio, mode, prompt file, provider, resolution, and max_candidates ≤ 4. A selected ACCEPTED asset requires a generation receipt with status=accepted.
shots:
- id: 03-product-push-in
kind: generated_video
claim_role: illustrative
duration_s: 4
selected_asset: production/local-h3/…/ACCEPTED-1080p.mp4
fallback_asset: assets/video-generation/…/fallback.mp4
generation:
provider: local-mlx-serve
mode: first-last-frame
prompt_file: production/prompts/03-product-push-in-first-last.md
resolution: "960x544"
max_candidates: 4
generation_record: production/local-h3/…/receipt.json
audio: silent
approval: accepted_via_mhr_2026-08-06
What we actually ran
| Shot class | Mode | Selected | Notes |
|---|---|---|---|
03-product-push-in | first-last-frame | take-03 | Real product pins; silent 4 s beauty |
04-section-bumper | text-to-video | take-02 | Abstract, no text/UI |
05-lab-atmosphere | first-frame | take-02 | Real lab still pin; no faces |
Local economics (receipts): 6 measured gens, mean wall ~682 s, accept rate 0.86, estimated energy ~0.11 kWh at an assumed 100 W (replace with measured draw later). Hosted Nous/FAL H3 died on unsupported_pricing_meter and was abandoned as primary.
Operator loop (the real product)
Not a queue service. A thin CLI on the M4 episode tree, generation on M3 Ultra over SSH:
cd production
python3 mhr h3 preflight --start
python3 mhr h3 gen --shot-id … --take N --prompt-file … --execute
python3 mhr h3 normalize --shot-id … --take N
python3 mhr h3 accept --shot-id … --take N --reason '…'
python3 mhr review validate
python3 mhr review build
python3 mhr review qc --label draft-1.7
python3 mhr h3 economics
Runtime: LaunchAgent com.milo.minimax-h3, bind 127.0.0.1:11234 only, ctl minimax-h3-ctl. Stop frees ~69 GB when Kimi needs the box.
Receipts before abstractions
Every local take lands under production/local-h3/<shot>/take-NN/ with prompt, redacted request, receipt, raw + normalized + ACCEPTED hashes, and review notes. Secrets and base64 pins stay out of the long-lived tree after stage. We still have not built a multi-provider plugin registry — one working backend first.
The deterministic center stays
- Validate manifest / resolve selected assets or fallbacks.
- Normalize geometry, frame rate, pixel format (silent 1080p/24).
- Assemble visual timeline from VO anchors (script-v3).
- Build narration + music separately; loudnorm to −16 LUFS.
- Mux optional English captions.
- Emit review MP4, contact sheets,
qc.json.
Generated audio is discarded. Native model audio never replaces James, Milo, captions, or the final mix.
Hosted H3 (secondary)
Direct api.minimax.io remains optional if a key appears. Nous Portal managed FAL is blocked until a pricing meter exists. Hosted privacy for private lab/likeness still requires explicit approval. Local loopback is the default production path for MHR lab use after James’s authorization.
Definition of done — scored
| Gate | Status |
|---|---|
| One command validates manifest, builds, QC package | Met (mhr review validate|build|qc) |
| Three useful shot classes with receipts | Met (product, bumper, lab) |
| Measured wall economics | Met (ledger; kWh still assumed watts) |
| Human accept before selected asset | Met |
| Fallback always present | Met |
| Public promote of latest cut | Open (1.7 local; 1.6 public) |
Next action (discussion): EP001 “Max-H3” densification — more accepted MiniMax seconds under the same evidence gates (target ~45–60 s of H3 presence, frozen script-v3 VO). Plan lives in-repo at production/plans/EP001-MAX-H3-PLAN.md. Not started until density tier and accept policy are locked.
What we are still not building
| Not in V2 | Reason |
|---|---|
| AI director / model-controlled timeline | Editorial decisions stay explicit |
| Provider plugin registry | One working backend ≠ framework |
| Queue service / VLM auto-judge | Premature vs human A/B |
| Generated narration | Voice path already approved |
| Default 2K generation | 960×544 selection first |