# The Room Within

This project implements the recursive-room brief in `PROMPTS.txt`. The other four demonstrations in the transcript are context; they are not additional requested scenes in that prompt.

## Deliverables

- `output/recursive_room_final.mp4`: finished cinematic film, exactly 30 seconds, 1280×720, 24 fps, H.264/AAC, approximately 10 MB. Use this for ordinary playback.
- `output/recursive_room_lossless.mp4`: 160 MB lossless H.264 master; decoded first and last frames are **pixel-identical**, verified. Its High 4:4:4 Predictive profile may require a desktop player or editor even though pixels are 4:2:0.
- `output/cinematic_original.mp4`: untouched Seedance output, 721 video frames, 30.05-second container. Retained for comparison.
- `index.html`: local review page with film, preview, references, and verification links.
- `output/recursive_room.blend`: editable Blender 5.2.1 scene, rebuilt locally from the supplied concept and blocking.
- `output/blocking_preview.mp4`: 30 seconds, 960×540, 24 fps, 720 frames; silent Workbench preview.
- `output/blocking_frames/`: all 720 PNG frames, retained for editing and lossless re-encoding.
- `references/source_blocking.mp4`: the author's actual 30-second blocking from the supplied article, retained with attribution.
- `references/room_reference.png` and `references/character_reference.webp`: original appearance references recovered from the saved article assets.
- `scripts/build_scene.py`, `scripts/render_preview.ps1`: reproducible local scene construction and preview rendering. These do not call paid APIs.
- `verification/`: fresh-process scene tests, media checks, storyboards, and the exact generation request.

## Editing in Blender

Open `output/recursive_room.blend`. Press Numpad 0 for the camera and Space to play. The timeline is 1–720 at 24 fps. Named markers identify the entrance, discovery, sidestep, raised hand, threat, wardrobe, and scale reveal.

Edit objects in `ROOM MASTER — shared geometry and performance`. The other scales are collection instances, so changing a master object changes its twins. Select `ACTOR — edit position keys` for movement, `ACTOR torso lean` for posture, and the arm/leg shoulder/hip empties for gesture. The door and wardrobe hinges have their own animation keys.

The camera has editable location and rotation keyframes every three frames. The separate camera-path guide is for inspection and does not drive the camera; edit the camera's keys in the Graph Editor. Use `scripts/build_scene.py` to revise the named high-level camera waypoints and regenerate the scene. Regeneration overwrites the output scene, so save hand edits under a different filename inside this folder first.

The scene uses an open-top three-wall stage. Its 156 master objects include panelled walls, a working entrance door, floor lamp, curtained window, table, rug, wardrobe doors, and a simplified articulated man. Seven instances surround the master at powers of ten. Finite nesting approximates infinity; it is not an actual infinite mesh.

## Verification

The saved file reopened successfully in a separate Blender process. Camera position under the 10× similarity transform and orientation both have zero reported error. Five independent scene points agree across the first and endpoint cameras to a maximum normalized screen-position error of 1.7881393e-7. Every repeated collection references the same master; all character and hinge actions therefore share evaluation time exactly.

Frame 721 represents the mathematical loop endpoint and is excluded from the 720-frame video. The rendered first/endpoint images have mean absolute RGB difference 1.958 / 255, so they are **not pixel-identical**. Scale-dependent cavity shading and rasterization are present; geometric alignment does not imply identical render pixels. The video fully decodes without errors.

The preview was checked at key moments using rendered images and a storyboard. It reconstructs the action and loop logic; it does not recover the author's exact camera spline, which was not available as an editable file. The character is a simplified mannequin, without cloth simulation, fingers, detailed face, coat-hanger interaction, or generated sound effects. The cinematic generation is a separate image-to-video interpretation, not a Blender beauty render.

## Final film assessment and finishing

The generation completed successfully. Its storyboard shows the warm walnut study, man entering, approaching and leaning over the miniature, and a return to the opening room composition after the scale reveal. The specific dash into a full-sized wardrobe and closing doors over his face is **not clearly realized**. The generated miniature layout changes and exact pose synchronization across every frame are **not verified**. Treat this as a polished interpretation of the recursive concept, not exact compliance with every performance instruction. The deterministic Blender scene remains editable for those requirements.

The original output's first/last RGB mean absolute difference was 1.872 / 255. Local finishing retains frames 0–719 and applies a smooth closing-image blend over the final 12 frames (half a second), ending on the opening image. There is no new hard cut, but this is an editorial loop correction, so it is not an untouched continuous generated take. A 25 ms audio fade at each endpoint suppresses a hard audio seam. No music or narration was added; native audio was retained. The presence and levels of audio were verified, but an SFX-only content guarantee was not independently established. Source native audio measured −31.4 dB mean and −6.8 dB peak.

The lossless master has zero decoded endpoint difference. The compact CRF-18 playback copy has 1.369 / 255 RGB endpoint difference from compression; it is not pixel-identical. Both are exactly 720 frames / 30 seconds, and both fully decode without errors. All actual file hashes and measurements are in `verification/media_checks.json`. Reproduce the finishing with `python scripts/finish_video.py`.

Cost verified after submission: 195 credits deducted, 673.91 remaining. No reroll was submitted. The review page and Blender preview played in the Codex in-app browser; that browser then crashed at cinematic playback. No root cause is claimed and repeated crash retries were avoided. The final film was also checked in Chrome; see `verification/browser_checks.json` for the outcome.

## Source and generation provenance

- Tutorial: https://www.youtube.com/watch?v=vUYq38wC_xI
- Article: https://higgsfield.ai/@adilinthewildtempo/blogs/gpt-astra-6-blender-higgsfield-builds-the-craziest-cinematic-scenes
- Exact supplied direction: `PROMPTS.txt`; full locally supplied transcript: `transcript.txt`.
- The live YouTube fetch was throttled. The supplied transcript and saved article were read, and the original blocking was downloaded from the article's embedded media URL and inspected as rendered frames. No claim is made to have independently watched the complete online tutorial.
- Film motion reference: `6e10cd51-9122-4264-a093-40020b9d8eb6.mp4` on the source article's CloudFront host. This is the source author's preview, not our reconstruction.
- Source room asset: `6640b33a-e01e-467a-9182-6f545480f5c2.png`; character asset: `d7e6bc4c-d6fc-4067-b476-78f64ad8977d.webp`.
- Seedance 2.5: 30 seconds, 720p, 16:9, native audio requested, one output. Read-only estimate: 195 credits. Account balance before submission: 868.91 credits. Existing free attempts were for Genjutsu and Viral; unlimited generation was not available. No subscription or top-up was purchased.
- Job ID: `d4b4da3d-a2ef-4306-9a41-b076670eb331`. Exact request is retained in `verification/generation_request.json`.
- The initial submission was rejected before generation because video URLs require a confirmed media ID. The source clip was transferred into a confirmed upload, then one successful job was submitted. No second output or reroll was requested.
- The root `.env` was not opened or copied. Authentication used the installed Higgsfield connection. The API secret is absent from project outputs.

The Blender executable was invoked directly because this task did not expose callable local Blender MCP tools. No add-on reinstallation or changes to other project folders were required. The tool's temporary remote upload staging was used only to transfer the already-public source blocking to Higgsfield.
