# Same prompt, two 3D irises GPT-6 Astra and Claude Fable 5.1 receive the same frozen user prompt: build an animated six-blade mechanical iris in Blender. The shot opens the aperture, closes it, separates the construction, reassembles it and opens again. This is one visual programming challenge, not a general model ranking. The models write Python scene code; Blender produces the video. Neither model is being used as a native video generator. Both models returned complete code in the separately registered [HIGH-effort round](HIGH-EFFORT-ROUND.md). Watch the **[16-second side-by-side video](evidence/high/comparison-high.mp4)**: Astra is on the left, Fable on the right. Both full native renders passed the same checks. Individual previews are available for [Astra HIGH](evidence/astra-high/preview.mp4) and [Fable HIGH](evidence/fable-high/preview.mp4). See [results and method disclosures](RESULTS.md) for visual observations, source-level mechanical findings and all earlier attempts. ![The two native scenes at the preselected nine-second exploded view](evidence/high/comparison-high.png) The earlier [Astra MAX video](evidence/astra/preview.mp4) is a separate bonus, with its own [evidence](evidence/astra/README.md). No Fable MAX scene was returned, and no MAX source is substituted into the HIGH pair. A conditional [MEDIUM round](MEDIUM-CONDITIONAL-ROUND.md) was registered but never triggered; no MEDIUM challenge calls were made. ## Study conditions The public release is a reviewed snapshot, not the original study's Git history. Registration dates and commit IDs below refer to the privately retained study repository; those IDs are provenance records, not resolvable public commit references. This snapshot alone does not independently prove the registration timing. - [Original prompt](PROMPT.md), committed before generation. SHA-256: `a472b1886f45abc960748178e9d44a0504370a72993a28402675f62c1eafd712`. - [Registered protocol](PROTOCOL.md). The registration commit is `f3384dc082e21030d53e422f38f3bb43d261ac83`. - Earlier MAX attempts include an [Astra operator timeout and redispatch](PROTOCOL-ADDENDUM.md), and a [Fable output-allowance correction and redispatch](FABLE-RUNTIME-ADDENDUM.md). Their different failures and interruptions remain visible in the [attempt history](RESULTS.md#attempt-history); they are not all model coding failures. - The HIGH pair was registered at 20:00:27 UTC on 8 September 2026, before either HIGH dispatch, in commit `c5b8642411109f753a237eb021e87adb0293adaa`. Each model received one operator dispatch in that round. Fable's invocation exposed two primary provider requests, including an automatic output-limit continuation before its completed answer. This is not one API request each or a clean one-shot study. - Exact requested models: `gpt-6-astra` and `claude-fable-5-1`, through existing primary subscriptions. The main round uses `high` for both; earlier `max` trials are separately labeled. Identically named effort settings do not establish equal compute. - Generation tools were disabled; no model tool use was observed. Neither model received reference images, a pre-existing scene, execution feedback or access to the other response. Operator testing and rendering happened separately, after source freezing. - Same Blender version, engine, frame size, samples, color management and timestamps. Each model supplies its own geometry, materials, lights and camera. - Untouched generated source. Removing a surrounding code fence is a mechanical extraction, not a repair. The product harnesses differ. Codex CLI 0.153.4 retains its normal product system instructions while user configuration, host skills and tools are disabled. Claude Code 2.1.263 uses safe mode, disabled tools and the neutral system instruction “You are a helpful assistant. Follow the user request.” These are identical user prompts, not identical complete model contexts or a controlled API benchmark. Fable HIGH's completed text answer reports the exact requested model. Codex events do not expose answer-level server model identity, so Astra's receipt establishes the exact requested route and successful completion, not that additional identity field. Visible request counts are lower bounds; the product streams may not expose every internal request. Same-named effort is not equal compute, and the setup differences do not support speed or reliability rankings. Sanitized receipts preserve outcomes and observed counts without publishing private identifiers or hidden reasoning. ## What the sources actually build Both HIGH sources construct six separate, thin, rigid blades around a real changing geometric opening, with an analytically coordinated slotted actuator behind the blades. Both preserve the main plate ordering during explosion. Neither changes a cover disk or hides blades to simulate the aperture. These source-derived findings do not establish final appearance or collision-free mechanics. There are concrete physical limitations: Astra's support spacers overlap its actuator, and some blades move sideways before clearing their pivot shafts. Fable's blade roots lack holes for the pivot pins; its centered pedestal neither contacts the surrounding rear plate nor leaves a straight view through the optical axis. The [plain-language findings and detailed reviews](RESULTS.md#source-derived-geometry-and-physical-limitations) explain these separately from runtime and visual judgments. The prompt asks for kinematic visualization, not manufacturing certification. ## Reproduce the native scene frames Requirements: Blender **5.2.1 LTS**, Python 3.10 or newer for the outer scripts, FFmpeg with `libx264`, and `rsvg-convert` for the two static model-name labels. The registered settings are EEVEE, 64 render samples, AgX with look `None`, 960 × 960 pixels per candidate and 30 native frames per second for 16 seconds. A completed run must contain 480 source frames per candidate, at `i / 30` for `i = 0 … 479`. Review any generated Python before running it. The static screen is conservative defense-in-depth, not proof that arbitrary Python is safe. The macOS wrapper additionally denies network access and signals, restricts user/shared-temporary file reads, strips inherited credentials and limits writes to the selected run. It is not advertised as a complete hostile-code sandbox. Run the trusted helper tests: ```sh python3 -m unittest discover -s tests -v ``` On macOS, explicitly point at your reviewed Blender installation: ```sh python3 harness/isolation.py \ --blender /Applications/Blender.app/Contents/MacOS/Blender \ --source candidates/astra-high.py --output runs/reproduce-astra-high --mode render python3 harness/isolation.py \ --blender /Applications/Blender.app/Contents/MacOS/Blender \ --source candidates/fable-high.py --output runs/reproduce-fable-high --mode render python3 harness/compose.py \ --left runs/reproduce-astra-high --right runs/reproduce-fable-high \ --output runs/reproduce-comparison-high.mp4 \ --labels 'GPT-6 Astra' 'Claude Fable 5.1' ``` Every output path must be new; old evidence is never silently overwritten. A structural or safety rejection is recorded as a failure, not repaired by the rendering driver. `probe` runs structural checks without final frames; `smoke` is for the tiny trusted fixture at 128 pixels, not for judging the candidates' appearance. The compositor puts simultaneous frames next to each other and adds a 120-pixel band containing only the model names. It does not rescale either candidate, change its camera, interpolate frames, color-grade one side or hide failed phases. Static header pixels are not counted as newly simulated content. ## What the evidence can establish The render reports record source and harness hashes, Blender build identity, structural probes, native frame timestamps and file hashes. Geometry, function and visual craft still need inspection: a six-object list cannot establish a working aperture, and deterministic matrices cannot certify a manufacturable mechanism. No saved `.blend` files are included in the public release: Blender files can embed local machine paths. The original files remain privately retained, and reports may record their hashes without making those files publicly available. Regenerate the scene using the exact Python source and common harness above. Each resulting `scene.blend` contains the constructed scene at the initial time; the source's `set_time(t)` supplies the animation during reproduction. The blend file alone is not a baked timeline animation. The prompt prohibits external meshes, textures, HDRIs and fonts; source safety review checks this before execution. The label typography belongs to the shared compositor only. The retained [MAX transform evidence](evidence/astra/transforms.json.gz) is the complete JSON, losslessly gzip-compressed because the uncompressed file exceeds GitHub's individual-file limit. It is not sampled. Verify it without creating the large decompressed file: ```sh gzip -t evidence/astra/transforms.json.gz gzip -dc evidence/astra/transforms.json.gz | shasum -a 256 ``` The second command must print `ff86df84db50ddf2772131d54b87da098d0db8c449e0b8a29f05d39239d41703`, matching the uncompressed evidence hash recorded by the [MAX report](evidence/astra/report.json). `gzip -dc` also lets a JSON viewer or parser read the complete data from stdin. Compression and video hashes are listed in the [MAX evidence notes](evidence/astra/README.md). Raw provider streams, request/session identifiers, local account details, saved Blender files and the original Git history stay private. Sanitized generation receipts and exact source hashes document the public comparison without publishing credentials or hidden reasoning.