← From Article to Film

Technical appendix: a bounded, local production workflow

Prepared 30 October 2026. This documents the implemented system and its recorded tests. It is not an installer, a model distribution, or a promise that these settings are optimal for another workstation.

What executes what

The Codex session interprets the stage prompts, constructs and reviews plans, implements needed graphics, and invokes the local toolkit. Artie/ChatGPT supplies strategy and specifications through Alejandro's handoffs. Alejandro directs and accepts or rejects results. There is no direct Artie-to-Codex communication in this production history.

The PowerShell wrapper selects the configured Python runtime and invokes python -B -m film_pipeline. The CLI itself does not invoke an LLM. It reads canonical manifests, runs validation and selected local operations, and records results. Generation jobs are opt-in. Stage 04 assembles selected assets; it does not independently invent every shot or automatically approve completed generations.

Record Operational purpose
article.json Exact text, paragraph/sentence relationships and source revision
studio.json Project-specific snapshot of output, voice, style, hardware and rights settings
narrative.json Beats, opening checkpoints and creative intent
narration.json Sentence takes, review evidence and word timing
shots.json Stable shot ID, narrative purpose, technique, selected asset and duration
assets.json Selected source path, SHA-256, provenance, model and review status
timeline.json Ordered clips on an integer frame grid, chapters and edits
jobs.json Graph, model dependencies, prompt, seed, input map and output selection
qc.json Machine checks and explicitly scoped review results
state.json Task fingerprints, status, outputs and cached-result evidence
delivery.json Current delivery products and status

Additional attempts/, events.jsonl, reports/, cache/, inputs/ and delivery/ directories separate submission history, decisions, evidence, derived media, selected assets and deliverables. Private voice references are not a public source-package input.

Frames are [start_frame, end_frame): start inclusive, end exclusive. Thus a 0–96 clip is 96 frames, or four seconds at 24 fps. Historical hook_01, hook_02 and hook_03 span 0–96, 96–192 and 192–305. The pilot spans 0–1514 across eight contiguous clips.

Content-based sentence IDs preserve unchanged wording across edits. Repeated identical sentences require occurrence disambiguation; a changed article still needs explicit reconciliation. The splitter handles common abbreviations and decimals but is not a general linguistic parser. The JSON validator implements the schema features used by the project; it is not claimed to implement all of JSON Schema 2020-12.

Recorded environment and actual model roles

Component Recorded use, not a universal requirement
RTX 4090, 24 GiB VRAM; 128 GB host RAM Historical workstation. Offloading was used; minimum host RAM was not established.
Python 3.13.12 Existing isolated TTS/media environment; reused without installation for this editorial package
ComfyUI 0.43.1; Torch 2.12.1+cu130 Recorded historical native image/video workflow environment
Qwen3-TTS-12Hz-0.6B-Base Local voice cloning; revision 5d83992436eae1d760afd27aff78a71d676296fc
faster-whisper 1.2.1 / small.en Independent transcription and timing checks; an ASR match does not establish performance quality
Qwen Image 2.1 INT8 ConvRot Historical illustrated plates; matching Qwen3VL encoder and Qwen 2.1 VAE; licensing restriction below
Wan 2.2 I2V 14B FP8 High-/low-noise image-to-video models; native ComfyUI nodes
LightX2V four-step high-/low-noise I2V LoRAs Acceleration used with the recorded Wan graphs
Python/Pillow/NumPy and compositing utilities Exact graphics, masks, layers, mechanical motion and frame rendering
FFmpeg 7.1 Historical NVENC delivery and stream operations; reusable toolkit defaults to CPU libx264 with two threads

Houdini was part of Alejandro's professional frame of reference, not an executed rendering stage. Chatterbox was investigated as an alternative but not installed or comparatively evaluated. Wan 5B was a fallback option, not the successful Experiment 06 generation.

Saved settings: first Wan test versus the pilot

Setting Experiment 06 Pilot 01 motion
Seed 6000601 1030003
Native size 768 × 432 768 × 432
Frames / rate 89 / 16 fps 41 / 16 fps
Native duration 5.5625 s 2.5625 s
Sampler / scheduler Euler / simple Euler / simple
Total steps / split 4 / 2 high + 2 low 4 / 2 high + 2 low
CFG / sampling shift 1 / 5 1 / 5
LoRA strength 1 1

Historical model filenames:

wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors
wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors
wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors
wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors
umt5_xxl_fp8_e4m3fn_scaled.safetensors
wan_2.1_vae.safetensors

The pilot image workflow was a separate native Qwen Image Edit 2511 graph. The selected second image used seed 1030002, a 1024 × 576 latent, 28 Euler/simple steps, CFG 4, denoise 1, AuraFlow shift 3.1, CFGNorm strength 1, and the index_timestep_zero reference-latent method. It loaded qwen_image_edit_2511_int8_convrot.safetensors, qwen_2.5_vl_7b_fp8_scaled.safetensors and qwen_image_vae.safetensors. These are not interchangeable with the Qwen 2.1 graph's dependencies.

The pilot added a reviewed, narrowly scoped adapter in its own engine copy, with four additional tests. Its 43-test result does not imply the preserved 39-test v1.0 baseline already supports that graph. Review and port the adapter deliberately if adopting it.

Prompt excerpts, with their real function

From prompts/00-master.txt:

Use the CLI scaffold only as a starting point; fill every narrative purpose/description.

Inspect the first minute and modified/high-risk shots, log shot/timecoded problems, then trim/reframe/reuse/composite before regeneration.

Never claim complete human viewing based on automated decode.

These excerpts are project-authored production instructions. The reusable structure is: establish scope and authority; define the exact stage outputs; state acceptance criteria; define evidence; preserve prior successes; identify blocked work without pretending it completed.

A representative passage from the actual historical style preset:

rounded volumetric painted forms with confident black ink contours, selective loose scratch marks and crosshatching, ivory paper breathing space, neutral charcoal and graphite shadows, bright saturated orange accents

The style passage described medium and palette. A separate identity passage described hair, glasses, face, hoodie and orange piping. Composition and motion were additional shot-specific instructions. Explicit identity references were more useful than repeating a generic style adjective.

From the selected pilot image prompt:

Picture 1 is the exact illustration medium and character design to reproduce. Picture 2 is an unmodified face crop for identity.

That prompt requested conspicuous ink and an upper-chest crop with hands outside the image. The generated result still needed a crop in compositing. A prompt records intent; the saved image records whether it happened.

For correction work, adapt the existing 08-targeted-correction.txt structure: identify shot and time range, describe the observed problem, constrain the permitted change, identify successful material to preserve, and specify the check that would demonstrate success. Do not overwrite the old take to hide the comparison.

Representative configuration, sanitized

This is an excerpt from the preserved preset, not a complete runnable studio.json. Private voice/reference paths are intentionally omitted.

{
  "output": {
    "width": 1920,
    "height": 1080,
    "fps": 24,
    "sample_rate": 48000,
    "audio_mode": "narration_only",
    "encoder": "libx264",
    "threads": 2
  },
  "generation": {
    "enabled": false,
    "maintenance_hold": true,
    "max_attempts": 8,
    "comfy_url": null
  },
  "voice": {
    "temperature": 0.75,
    "top_p": 0.95,
    "repetition_penalty": 1.05,
    "pause_sentence": 0.3,
    "pause_paragraph": 0.62
  }
}

Do not clear a maintenance hold because a GPU happens to look idle. Verify ownership of the intended isolated ComfyUI instance, project directories and production window. The adapter does not launch or take ownership of an arbitrary listening server. Model and reference rights must be cleared for the actual intended use before enabling generation.

Implemented commands and their boundaries

pipeline.ps1 is part of our implemented local toolkit, not a universally available command or an installer. Run from a configured, separately copied toolkit root. presets/workstation.local.json must point to the appropriate existing runtime. These commands were checked against the real argparse implementation; read-only --help checks are recorded with this package. No fresh film generation was run for this article.

# Create source records and scaffolds; fill and review the creative manifests.
.\pipeline.ps1 init projects/new-film --article 'C:\local\article.txt' --title 'Film title'
.\pipeline.ps1 run projects/new-film --stage 01
.\pipeline.ps1 run projects/new-film --stage 02
.\pipeline.ps1 validate projects/new-film
.\pipeline.ps1 status projects/new-film

# After a reviewed plan, authorized voice and cleared resource window:
.\pipeline.ps1 tts projects/new-film
.\pipeline.ps1 asr projects/new-film
.\pipeline.ps1 accept-narration projects/new-film --evidence 'C:\local\review-notes.txt' --reviewer 'Name and actual review scope'
.\pipeline.ps1 run projects/new-film --stage 03

# Substitute a real reviewed job ID from jobs.json.
.\pipeline.ps1 comfy projects/new-film JOB_ID
# Recovery only after checking the recorded submission and server history:
.\pipeline.ps1 comfy projects/new-film JOB_ID --recover

# Register reviewed selected assets before assembly.
.\pipeline.ps1 run projects/new-film --stage 04
.\pipeline.ps1 run projects/new-film --stage 05
.\pipeline.ps1 run projects/new-film --stage 06
.\pipeline.ps1 validate projects/new-film --assets
.\pipeline.ps1 package projects/new-film

JOB_ID, paths and review evidence are reader-supplied values, not literal existing jobs. --stage all attempts stages and records blockers; it does not manufacture missing approvals or creative plans. accept-narration records a real review and must not be used to manufacture one.

For a targeted voice correction, set a sentence override in the project snapshot, then use the actual selector:

.\pipeline.ps1 tts projects/new-film --sentences SENTENCE_ID

For retained historical assets, these are implemented bounded commands:

.\pipeline.ps1 render projects/historical --shots hook_01 hook_02 hook_03 --label opening
.\pipeline.ps1 regression projects/historical

They refer to a configured imported historical project. They are not instructions to regenerate a feature or run against another person's active workspace. No CLI command publishes to a website or YouTube.

Exact release assembly pattern

The Experiment 11 builder selected one video stream and one audio stream:

ffmpeg -i CORRECTED_PICTURE -i APPROVED_NARRATION \
  -map 0:v:0 -map 1:a:0 -c copy \
  -map_metadata 0 -map_chapters 0 OUTPUT.mp4

This is a readable argument pattern, not a shell-specific copy-and-paste command: the actual Python builder passes an argument list and concrete paths. CORRECTED_PICTURE was Experiment 10's picture source; APPROVED_NARRATION was Experiment 09's mono AAC source. Copying selected streams preserved the encoded content. Matching source hashes and packet payload/timestamp checks then established what the release contained.

Measurements with denominators

Measurement Recorded result What it does not mean
Experiment 01 selected TTS generation 222.1 s Excludes model load and setup; not total production time
Experiment 06 Comfy execution 48.72 s Not an end-to-end owner workflow
Experiment 06 sampled GPU use 22,208 MiB Whole device, about two-second samples; not exact model allocation
Experiment 08 images 3,177.81 s 75 logged image jobs; not 75 accepted images
Experiment 08 video 11,879.37 s 67 logged video jobs; not 67 selected clips
Experiment 08 TTS 1,282.11 s Recorded new narration job work
Experiment 08 combined generation 4.5387 h Not film elapsed time, active labor or savings
Pilot TTS 153.677 s Ten takes; includes first-use loading
Pilot image/video execution 170.868 s Three Comfy job executions; excludes launch and owner waiting
Pilot through delivery audit 2,644.1 s Includes research, orchestration, waits and benchmark; excludes subsequent archive replay
Pilot package replay 21.765 s Retained assets, no new neural generation

The pilot owner-attention entry was a rough self-report of zero active minutes, not a stopwatch measurement. Three decisions were still recorded: article approval, narration acceptance and benchmark delegation. Cost and token fields were unavailable, not zero. Do not calculate cost savings or a feature-to-pilot speedup from these records.

What the tests verified

Small model comparison

One paired invocation per model covered two text tasks: an eight-shot plan and a bounded correction plan. Sol (gpt-6.1-sol, High) and Astra (gpt-6-astra, Extra High) both passed the recorded hard constraints with zero corrective turns. Dispatch-to-result observations were 117.499 and 148.573 seconds respectively, including launch/tool overhead. The reviewer was not blind; no owner quality ranking, token accounting or cost was established. The separate 45-trial benchmark protocol in the toolkit was a proposal, not an executed result. Both actual films used Astra Extra High according to the owner's production context.

Color demonstration: the calculation

For equal, achromatic, normalized black and white in SDR sRGB, without a tone map:

encoded_average = (0.0 + 1.0) / 2.0
linear_average = (0.0 + 1.0) / 2.0

def srgb_encode(linear):
    return 12.92 * linear if linear <= 0.0031308 else 1.055 * linear ** (1 / 2.4) - 0.055

encoded_code = round(255 * encoded_average)         # 128
linear_code = round(255 * srgb_encode(linear_average))  # 188

The equality of the two input averages is specific to endpoints zero and one. The output encodings differ. For arbitrary encoded colors, first apply the inverse transfer function before the linear-light operation. The article does not prescribe applying color transfer functions to data maps. See the W3C sRGB conversion code.

Model and asset rights

Primary model/license pages were checked on 30 October 2026. Preserve the license text and exact checkpoint lineage for the version actually used; model-card labels alone are not a complete asset-rights audit.

Model/workflow Evidence and production consequence
Historical Qwen Image 2.1 Research license. Separate permission for commercial model use was not in the historical evidence. Owner proceeded with existing artwork while acknowledging unresolved interpretation; no independent legal clearance. New use blocked in the toolkit's commercial preset.
Pilot Qwen Image Edit 2511 Upstream Apache-2.0 model card. Pilot recorded local SHA-256 and matching upstream converted-weight LFS identities. This is a different model/workflow and does not clear historical 2.1 usage.
Qwen3-TTS 0.6B Base Apache-2.0 model card. Voice identity/reference authorization is a separate requirement; raw reference remains local.
Wan 2.2 Upstream Apache-2.0 license. Converted files, encoders and VAE still need exact provenance.
LightX2V Wan 2.2 Lightning Apache-2.0 model card. Record the specific high-/low-noise LoRAs used.

Output ownership provisions do not automatically permit every use of a model. A nonmonetized branded project is not automatically exempt from model terms. Reference art, likeness/voice consent, music, third-party content, dependencies and fonts remain separate considerations. YouTube's historical “No issues found” check was a platform result, not legal clearance.

The editorial package includes genuine historical images for private review, with a publication gate recorded in its asset manifest. It includes no model weights, credentials, raw voice reference or clone embedding. Pilot final visual approval is separately pending. Publication of this article and its excerpts requires the owner's next decision.

Troubleshooting drawn from this production

Observed issue Bounded response
Duplicate-looking protagonists; inconsistent glasses Repair the specified storyboard panels before motion. Keep successful panels unchanged.
Button drifts; invented passerby; generated talking lips Protect the necessary region with original art, use quieter footage or a still, or make a precise prop composite.
Gripper duplicates or geometry changes Use deterministic fixed-length mechanics for that shot.
Smooth plastic finish in pilot image Strengthen medium/reference instructions; evaluate the second result; crop remaining unwanted hands. Do not call prompt compliance proven.
Generic diagram dot does not follow spoken steps Tie procedural highlighting to actual word onset times.
Lost submission response Inspect the owned server's recorded history and recover the known job; do not blindly submit again or interrupt someone else's server.
Pilot server not yet ready; resource guard fires Retry readiness within the authorized window; do not weaken the guard to force generation.
Invalid review status rejected by validation Correct the field using actual review evidence. Do not bypass validation.
A broad adapter-code hash invalidates a usable TTS smoke cache Verify provenance and bytes, record an explicit rekey if justified, and avoid an unnecessary retake. Never fake a cache hit.
Rebuilt video passes decode but feels wrong Screen for meaning, rhythm and performance. Machine checks cannot accept the film on the owner's behalf.

This appendix summarizes retained production records. Private source paths, owner decision records and raw voice references are not distributed with it.