{
  "schema_version": "1.0.0",
  "review_date": "2026-09-05",
  "units": {
    "time": "seconds from recipe start, half-open intervals",
    "rect_norm": "[x,y,width,height] divided by full frame width/height, top-left origin",
    "font_h": "font em size divided by frame height",
    "w": "fraction of frame width",
    "h": "fraction of frame height",
    "opacity": "0..1",
    "frame_index": "zero-based"
  },
  "status_contract": {
    "measured-observation": "Delivered pixels or PTS in the stated inspection window.",
    "editorial-interpretation": "An account of sequence or attention; not an authorial intent claim.",
    "fitted-approximation": "A numerical model fitted to observations. None of the easing or fonts in these recipes is fitted.",
    "proposed-production-default": "A chosen implementation value to test; not an official source token."
  },
  "render_settings": {
    "width_px": 1280,
    "height_px": 720,
    "fps": 30,
    "format": "mp4",
    "codec": "libx264",
    "crf": 18,
    "pixel_format": "yuv420p",
    "audio": false,
    "color": "sRGB raster converted explicitly to BT.709 limited-range YUV",
    "font": "Bundled DejaVu Sans and Sans Bold; chosen, not recovered from a film"
  },
  "coordinate_contract": "Every rect_norm is measured in the full untransformed design frame. coordinate_space=workspace means parent the element to the common workspace camera; it does NOT mean normalize coordinates by the window size. frame-space layers bypass that camera. All geometry scales uniformly with 16:9 output dimensions.",
  "evidence": [
    {
      "id": "opening-codex",
      "film_slug": "codex-first-look",
      "film_title": "A first look at the Codex app",
      "source_url": "https://www.youtube.com/watch?v=0e-Brv-gS9Q",
      "source_sha256": "d5f8b05e7d123aa336f22d01210b315bfd914aa3d380e70ca21783f023174895",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 0,
      "end_s": 9,
      "dataset": "opening-studies.json",
      "record_id": "codex-opening",
      "study_route": "/videos/openings/#codex-opening",
      "claim": "A complete title cuts to a formed app, which rests before focused interaction.",
      "claim_status": "editorial-interpretation",
      "precision": "The 0\u20139 s excerpt includes the first app handoff, workspace selection, and start of prompt entry, not a completed result. Native evidence is restricted to the title-to-app cut and immediate full-window view. No click event, application latency, original camera/easing setup, or audio synchronization is inferred.",
      "contrast": "contrast: direct cut, not continuous container growth"
    },
    {
      "id": "opening-atlas",
      "film_slug": "atlas-intro",
      "film_title": "Introducing ChatGPT Atlas",
      "source_url": "https://www.youtube.com/watch?v=Ej6hnsQgV_c",
      "source_sha256": "74bd47a01176497da7c28cfb61233a9a6ae5a9d40b199654bd8310f72ddf125f",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 0,
      "end_s": 14,
      "dataset": "opening-studies.json",
      "record_id": "atlas-opening",
      "study_route": "/videos/openings/#atlas-opening",
      "claim": "A retained icon and later composer precede a gradual reveal of browser context.",
      "claim_status": "editorial-interpretation",
      "precision": "The full 0\u201314 s excerpt was inspected at nearest-frame 125 ms targets. Only the dock reduction received an every-frame check. No source animation layers, exact easing curves, pixel displacement measurements, or product response times were recovered. The query result lies outside this excerpt.",
      "contrast": "contrast: staged reveal of context"
    },
    {
      "id": "opening-study",
      "film_slug": "study-mode",
      "film_title": "Introducing ChatGPT Study Mode",
      "source_url": "https://www.youtube.com/watch?v=XDYilxy1dn8",
      "source_sha256": "42dab89d7579b9e742a018291063b5e573bc3f3dbf61423e10e95c06543a9785",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 0,
      "end_s": 10,
      "dataset": "opening-studies.json",
      "record_id": "study-opening",
      "study_route": "/videos/openings/#study-opening",
      "claim": "A homework thumbnail reappears inside a composer through a cut; recognizable content preserves identity.",
      "claim_status": "editorial-interpretation",
      "precision": "The menu, book, benefit statement, and title were sampled across the full 0\u201310 s excerpt. Every-frame inspection covers only the attachment-to-composer change. The pass does not measure upload time, verify an input event, recover a morph or camera pipeline, or include the answer after the visible partial prompt.",
      "contrast": "cut-based object continuity"
    },
    {
      "id": "chapter-workspace",
      "film_slug": "workspace-risk",
      "film_title": "Workspace agents in ChatGPT: Third-party risk management agent",
      "source_url": "https://www.youtube.com/watch?v=HnSPedbA02Q",
      "source_sha256": "5835f85d7e330116302428404d11e7774edb533602094fcc0aa908b9d4a7a5bc",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 68,
      "end_s": 76,
      "dataset": "motion-studies.json",
      "record_id": "test-chapter-reset",
      "study_route": "/videos/motion/#test-chapter-reset",
      "claim": "A title separates setup from testing; the same workspace returns.",
      "claim_status": "editorial-interpretation",
      "precision": "Bounded study interval; see linked source record for inspection precision.",
      "contrast": "chapter with typed title",
      "additional_inspection": {
        "dataset": "playbook-inspection.json",
        "record_id": "chapter"
      }
    },
    {
      "id": "sidebar-codex",
      "film_slug": "codex-first-look",
      "film_title": "A first look at the Codex app",
      "source_url": "https://www.youtube.com/watch?v=0e-Brv-gS9Q",
      "source_sha256": "d5f8b05e7d123aa336f22d01210b315bfd914aa3d380e70ca21783f023174895",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 17,
      "end_s": 22,
      "dataset": "motion-studies.json",
      "record_id": "codex-sidebar-return",
      "study_route": "/videos/motion/#codex-sidebar-return",
      "claim": "Pointer action precedes the wider new-thread framing; the selected excerpt ends before full settlement.",
      "claim_status": "editorial-interpretation",
      "precision": "This excerpt ends during the wider framing; it is not evidence of the complete settling time beyond 22 s.",
      "contrast": "interaction-led progression"
    },
    {
      "id": "review-codex",
      "film_slug": "codex-first-look",
      "film_title": "A first look at the Codex app",
      "source_url": "https://www.youtube.com/watch?v=0e-Brv-gS9Q",
      "source_sha256": "d5f8b05e7d123aa336f22d01210b315bfd914aa3d380e70ca21783f023174895",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 92.5,
      "end_s": 98,
      "dataset": "motion-studies.json",
      "record_id": "codex-review-reframe",
      "study_route": "/videos/motion/#codex-review-reframe",
      "claim": "The pane is established, then the camera moves, then an inline action opens.",
      "claim_status": "editorial-interpretation",
      "precision": "The sampled push is visible around 95.26\u201395.64 s. Blur is present in intermediate frames, but the renderer and easing curve are not known.",
      "contrast": "native frames support qualitative deceleration, not an exact ease"
    },
    {
      "id": "cut-atlas",
      "film_slug": "atlas-intro",
      "film_title": "Introducing ChatGPT Atlas",
      "source_url": "https://www.youtube.com/watch?v=Ej6hnsQgV_c",
      "source_sha256": "74bd47a01176497da7c28cfb61233a9a6ae5a9d40b199654bd8310f72ddf125f",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 72,
      "end_s": 76,
      "dataset": "motion-studies.json",
      "record_id": "atlas-context-pullback",
      "study_route": "/videos/motion/#atlas-context-pullback",
      "claim": "Close crop at 72.300 s is followed by the whole window at 72.333 s.",
      "claim_status": "measured-observation",
      "precision": "The 125 ms samples alone only bracket the reframe. The consecutive-frame check below resolves it as a cut in this source, not a smooth pullback. The wash is a film observation, not a reusable product feature.",
      "contrast": "contrast: adjacent-frame cut rather than a push"
    },
    {
      "id": "select-atlas",
      "film_slug": "atlas-intro",
      "film_title": "Introducing ChatGPT Atlas",
      "source_url": "https://www.youtube.com/watch?v=Ej6hnsQgV_c",
      "source_sha256": "74bd47a01176497da7c28cfb61233a9a6ae5a9d40b199654bd8310f72ddf125f",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 44,
      "end_s": 50,
      "dataset": "motion-studies.json",
      "record_id": "atlas-inline-reveal",
      "study_route": "/videos/motion/#atlas-inline-reveal",
      "claim": "Text selection precedes a local control while the page stays in place.",
      "claim_status": "editorial-interpretation",
      "precision": "The sampled frames establish order and location, not the exact easing or the application's live response time.",
      "contrast": "local selection over an email"
    },
    {
      "id": "task-agent",
      "film_slug": "agent-look",
      "film_title": "A Look at ChatGPT agent",
      "source_url": "https://www.youtube.com/watch?v=2wzGS_WUZYQ",
      "source_sha256": "f39beb96507b79d3779d339fb923ac1d0c5ad74f145295ec0c86d8b333e68391",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 4,
      "end_s": 7,
      "dataset": "motion-studies.json",
      "record_id": "agent-task-card-entry",
      "study_route": "/videos/motion/#agent-task-card-entry",
      "claim": "The container grows, the request types, and website content arrives later.",
      "claim_status": "editorial-interpretation",
      "precision": "The placeholder is a film device. Do not infer real loading duration from its hold or reproduce the callout as a product feature.",
      "contrast": "contrast: cursor-attached editorial typing rather than a native caret"
    },
    {
      "id": "select-writing",
      "film_slug": "canvas-writing",
      "film_title": "Writing with canvas in ChatGPT",
      "source_url": "https://www.youtube.com/watch?v=Ks1C-5p04PY",
      "source_sha256": "533e3c3d3a33d2355f235a7e57679c6b0fe8b492847aa869a96821c9679fe3ac",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 82,
      "end_s": 90,
      "dataset": "motion-studies.json",
      "record_id": "selected-text-local-request",
      "study_route": "/videos/motion/#selected-text-local-request",
      "claim": "Selected text and a local toolbar precede the contextual request.",
      "claim_status": "editorial-interpretation",
      "precision": "Bounded study interval; see linked source record for inspection precision.",
      "contrast": "native selected-document interaction",
      "additional_inspection": {
        "dataset": "playbook-inspection.json",
        "record_id": "selection"
      }
    },
    {
      "id": "scroll-calendar",
      "film_slug": "information-visual",
      "film_title": "Make information visual with ChatGPT",
      "source_url": "https://www.youtube.com/watch?v=jzmNh8lbSp8",
      "source_sha256": "631dd67fc14e4f5861fd7efeeb1ab502a66a1793f8f8b7003c3055b149f81745",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 44,
      "end_s": 49,
      "dataset": "motion-studies.json",
      "record_id": "list-to-calendar",
      "study_route": "/videos/motion/#list-to-calendar",
      "claim": "The generated calendar moves upward while the application frame and presenter inset remain fixed.",
      "claim_status": "editorial-interpretation",
      "precision": "Bounded study interval; see linked source record for inspection precision.",
      "contrast": "document scroll, not a camera zoom",
      "additional_inspection": {
        "dataset": "playbook-inspection.json",
        "record_id": "scroll"
      }
    },
    {
      "id": "preview-canvas",
      "film_slug": "canvas-prototyping",
      "film_title": "Prototyping with canvas in ChatGPT",
      "source_url": "https://www.youtube.com/watch?v=JbIvaFh44EY",
      "source_sha256": "7e29756b93e0770829c43393bfaab4a88af540c1d42ff26d7767a21856f93295",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 90,
      "end_s": 98,
      "dataset": "motion-studies.json",
      "record_id": "canvas-code-to-preview",
      "study_route": "/videos/motion/#canvas-code-to-preview",
      "claim": "Pending gives way to a dashboard; chart content continues drawing after the dashboard appears.",
      "claim_status": "editorial-interpretation",
      "precision": "Bounded study interval; see linked source record for inspection precision.",
      "contrast": "content arrival is not readability onset",
      "additional_inspection": {
        "dataset": "playbook-inspection.json",
        "record_id": "preview"
      }
    },
    {
      "id": "patch-ide",
      "film_slug": "shipping-ide",
      "film_title": "Shipping code to your IDE with ChatGPT",
      "source_url": "https://www.youtube.com/watch?v=_WvtdRtG1aY",
      "source_sha256": "839b06de8de639012d6ab36d4bd910340db5e443d7a960a0d4caefac5bd67760",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 92,
      "end_s": 100,
      "dataset": "motion-studies.json",
      "record_id": "ide-patch-review",
      "study_route": "/videos/motion/#ide-patch-review",
      "claim": "A working state gives way to a visible diff and review controls; a later explanation shifts the panel.",
      "claim_status": "editorial-interpretation",
      "precision": "Bounded study interval; see linked source record for inspection precision.",
      "contrast": "contrast: inspectable changes rather than a generated chart; no test-pass claim"
    },
    {
      "id": "deck-agent",
      "film_slug": "agent-slideshows",
      "film_title": "ChatGPT agent Makes Slideshows",
      "source_url": "https://www.youtube.com/watch?v=szJI9YJNEZk",
      "source_sha256": "3441036cb9bce4a6a725dba954fea67eee705b2a0ed052ad2611731dfc1b850f",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 66,
      "end_s": 74,
      "dataset": "motion-studies.json",
      "record_id": "deck-card-to-viewer",
      "study_route": "/videos/motion/#deck-card-to-viewer",
      "claim": "An attachment preview is followed by a larger viewer with a thumbnail rail.",
      "claim_status": "editorial-interpretation",
      "precision": "Bounded study interval; see linked source record for inspection precision.",
      "contrast": "contrast: artifact expands into viewing context"
    },
    {
      "id": "ending-codex",
      "film_slug": "codex-first-look",
      "film_title": "A first look at the Codex app",
      "source_url": "https://www.youtube.com/watch?v=0e-Brv-gS9Q",
      "source_sha256": "d5f8b05e7d123aa336f22d01210b315bfd914aa3d380e70ca21783f023174895",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 127.85,
      "end_s": 132.61,
      "dataset": "logo-studies.json",
      "record_id": "codex-blossom",
      "study_route": "/videos/logos/#codex-blossom",
      "claim": "The wordmark departs before a changing mark reaches a quieter pose around 131.131 s.",
      "claim_status": "editorial-interpretation",
      "precision": "These are different delivered films, not proof of a shared animation file or a universal timing preset. Compression and subtle later edge changes prevent treating the selected quiet frame as a bit-identical freeze boundary.",
      "contrast": "quiet landmark is visual, not an exact authoring keyframe"
    },
    {
      "id": "ending-atlas",
      "film_slug": "atlas-intro",
      "film_title": "Introducing ChatGPT Atlas",
      "source_url": "https://www.youtube.com/watch?v=Ej6hnsQgV_c",
      "source_sha256": "74bd47a01176497da7c28cfb61233a9a6ae5a9d40b199654bd8310f72ddf125f",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 89.65,
      "end_s": 93.5,
      "dataset": "logo-studies.json",
      "record_id": "atlas-icon",
      "study_route": "/videos/logos/#atlas-icon",
      "claim": "The outer tile precedes the blue interior and directional symbol; a later URL card is outside this excerpt.",
      "claim_status": "editorial-interpretation",
      "precision": "This is a product icon, not the black Blossom outro. Frames suggest layered depth and changing shading, but do not prove a 3D renderer, material, lighting rig, or spring model.",
      "contrast": "contrast: nested icon build, not wordmark-to-knot deletion"
    },
    {
      "id": "caption-paired",
      "film_slug": "agent-plugins",
      "film_title": "Introducing Agent Plugins",
      "source_url": "https://www.youtube.com/watch?v=UaeWJK_vv-Y",
      "source_sha256": "8ea2f09c2ce3e0defc1aff86fbe3fe74409a1e8e9ba0cc7523d15076a62a855e",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 3.3,
      "end_s": 7.8,
      "dataset": "lower-thirds.json",
      "record_id": "paired-id",
      "study_route": "/videos/lower-thirds/#paired-id",
      "claim": "Both text fields enter together and leave with a cut.",
      "claim_status": "measured-observation",
      "precision": "A hard-on describes the adjacent delivered frames, not a claim about hidden sub-frame keyframes. The encoded film does not identify the font file, compositing tool, or easing curve.",
      "contrast": "measured hard-on; no recovered font"
    },
    {
      "id": "caption-persistent",
      "film_slug": "computer-use",
      "film_title": "ChatGPT can now complete tasks on your computer",
      "source_url": "https://www.youtube.com/watch?v=dB6pOolO7io",
      "source_sha256": "d0363a9494a429830df74b4e8c4a9579dc545732889f3fd8a8d4ecf2a3afa6a2",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 6.15,
      "end_s": 12.8,
      "dataset": "lower-thirds.json",
      "record_id": "id-across-cut",
      "study_route": "/videos/lower-thirds/#id-across-cut",
      "claim": "The paired text remains at the same screen position across a camera cut.",
      "claim_status": "measured-observation",
      "precision": "The source shows continuity across one camera cut, not a universal rule that every ID must span cuts. The native player is for context; the still-frame inspector is the frame-accurate evidence.",
      "contrast": "contrast: persistent label across a cut"
    },
    {
      "id": "result-codex",
      "film_slug": "codex-first-look",
      "film_title": "A first look at the Codex app",
      "source_url": "https://www.youtube.com/watch?v=0e-Brv-gS9Q",
      "source_sha256": "d5f8b05e7d123aa336f22d01210b315bfd914aa3d380e70ca21783f023174895",
      "channel_id": "UCXZCJLdBC09xxGZ6gcdrc6A",
      "start_s": 121,
      "end_s": 130,
      "dataset": "playbook-inspection.json",
      "record_id": "result-outro",
      "study_route": "/videos/films/codex-first-look/",
      "claim": "The app output remains visible through the 127.503 s sample; a white closing wordmark is present by 128.003 s. The output changes at late samples, so this is not a nine-second frozen result hold.",
      "claim_status": "measured-observation",
      "precision": "Nearest source frame at 0.5 s targets. The actual cut lies between the last UI sample and first title sample; no exact cut time is claimed.",
      "contrast": "single-example finding for the sampled final output-to-title boundary"
    }
  ],
  "recipes": [
    {
      "id": "title-interface",
      "version": 1,
      "title": "A statement, then a real surface",
      "intent": "Open a narrated subject and give a recognizable manual playback cue.",
      "avoid_when": "The recording already starts with an action that cannot tolerate a lead-in; review the timing instead.",
      "evidence_ids": [
        "opening-codex",
        "opening-atlas"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 6,
      "hold_start_s": 3,
      "minimum_hold_s": 1,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "title-build",
          "start_s": 0,
          "end_s": 0.7,
          "layer": "title",
          "action": "Reveal the two lines through a local mask; line two begins at 0.2 s."
        },
        {
          "id": "title-read",
          "start_s": 0.7,
          "end_s": 3,
          "layer": "title",
          "action": "Complete phrase remains still."
        },
        {
          "id": "cue-cut",
          "start_s": 3,
          "end_s": 3,
          "layer": "workspace",
          "action": "Hard cut to the complete interface. This is the recognizable cue, not a claimed automatic sync event."
        },
        {
          "id": "context-read",
          "start_s": 3,
          "end_s": 6,
          "layer": "workspace",
          "action": "Let the surface establish before another movement."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "title",
          "z": 20,
          "rect_norm": [
            0.14,
            0.32,
            0.72,
            0.28
          ],
          "coordinate_space": "frame",
          "construction": "Original short phrase, left aligned. Baseline grid fixed; masked entry never reflows the text."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        }
      ],
      "parameters": {
        "title_font_h": 0.082,
        "line_gap_h": 0.105,
        "line_stagger_s": 0.2,
        "mask_rise_h": 0.035,
        "cue_s": 3
      },
      "capture_requirements": [
        "Original two-line title; approved presentation font and identity.",
        "Clean, recognizable first interface state at the delivery aspect ratio."
      ],
      "construction": [
        "Keep title lines at fixed x=.14; do not center every partial word.",
        "Use a hard cut; the title is not claimed to morph into a window.",
        "The two-line mask is an original construction, not measured source typography."
      ],
      "failure_modes": [
        "Typing a long paragraph before the cue.",
        "Animating the interface before the presenter has time to trigger OBS.",
        "Treating cue time as actual talking-head start."
      ],
      "verification": [
        "The last title frame and first interface frame are adjacent.",
        "Interface geometry is stationary for the final hold.",
        "Record cue_s and independently rehearsed start offset."
      ],
      "entry_state": "title",
      "exit_state": "workspace-empty",
      "run": "python render.py --recipe title-interface --out renders",
      "renderer": "title-interface"
    },
    {
      "id": "chapter-reset",
      "version": 1,
      "title": "Reset the argument without losing the task",
      "intent": "Speech changes from setup to test, or from one claim to the next.",
      "avoid_when": "The speaker is midway through a dependent action or reading a result.",
      "evidence_ids": [
        "chapter-workspace",
        "sidebar-codex"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 5,
      "hold_start_s": 3,
      "minimum_hold_s": 1,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "context",
          "start_s": 0,
          "end_s": 0.6,
          "layer": "workspace",
          "action": "Hold the previous task."
        },
        {
          "id": "chapter",
          "start_s": 0.6,
          "end_s": 3,
          "layer": "title",
          "action": "Hard cut to a short complete phrase; read it."
        },
        {
          "id": "return",
          "start_s": 3,
          "end_s": 5,
          "layer": "workspace",
          "action": "Return to the same task, same crop, same selection."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "title",
          "z": 20,
          "rect_norm": [
            0.14,
            0.32,
            0.72,
            0.28
          ],
          "coordinate_space": "frame",
          "construction": "Original short phrase, left aligned. Baseline grid fixed; masked entry never reflows the text."
        }
      ],
      "parameters": {
        "title_font_h": 0.082,
        "cut_in_s": 0.6,
        "cut_out_s": 3
      },
      "capture_requirements": [
        "Before and after captures from the same task.",
        "Transcript pause or clause boundary; one short chapter phrase."
      ],
      "construction": [
        "Save the workspace state before inserting the title.",
        "Use the same window bounds on return; avoid an accidental new-task impression."
      ],
      "failure_modes": [
        "Chapter text appears during a critical spoken noun.",
        "Returning to a reset or unrelated document."
      ],
      "verification": [
        "Before and return workspace pixels match for the neutral example.",
        "Title reading time is not counted as result reading time."
      ],
      "entry_state": "workspace-empty",
      "exit_state": "workspace-empty",
      "run": "python render.py --recipe chapter-reset --out renders",
      "renderer": "chapter-reset"
    },
    {
      "id": "context-detail",
      "version": 1,
      "title": "Establish, push, settle",
      "intent": "A small control or output needs larger scale without losing orientation.",
      "avoid_when": "The capture lacks resolution, or a simple cut would explain the change more clearly.",
      "evidence_ids": [
        "review-codex",
        "cut-atlas"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 4,
      "hold_start_s": 1.5,
      "minimum_hold_s": 1.5,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "establish",
          "start_s": 0,
          "end_s": 1,
          "layer": "workspace",
          "action": "Hold wide context."
        },
        {
          "id": "push",
          "start_s": 1,
          "end_s": 1.5,
          "layer": "workspace",
          "action": "Scale 1 to 1.18 about the focus point with a chosen cubic ease-out."
        },
        {
          "id": "detail-read",
          "start_s": 1.5,
          "end_s": 4,
          "layer": "workspace",
          "action": "Settle completely; keep the pointer and text still."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        }
      ],
      "parameters": {
        "camera_scale": 1.18,
        "camera_pivot_norm": [
          0.62,
          0.5
        ],
        "ease": "1-(1-u)^3",
        "max_upscale_ratio": 1
      },
      "capture_requirements": [
        "Capture width >= output_width * camera_scale; preserve an unscaled master.",
        "A target rectangle plus at least one nearby orientation landmark."
      ],
      "construction": [
        "Transform the complete workspace and its pointer together, not the background.",
        "For point p and pivot a, output q=a+scale*(p-a). Mask the window before applying this transform.",
        "An alternative is a hard cut like the Atlas comparison. Do not interpolate a reference that was a cut."
      ],
      "failure_modes": [
        "Zooming while the viewer reads newly appearing text.",
        "A pointer that drifts away because it uses another coordinate space.",
        "Upscaling a compressed crop until labels become soft."
      ],
      "verification": [
        "Focus stays within safe bounds at maximum scale.",
        "No motion remains during the final hold.",
        "Inspect exported text at 640 x 360, not only at full size."
      ],
      "entry_state": "workspace-empty",
      "exit_state": "workspace-detail",
      "run": "python render.py --recipe context-detail --out renders",
      "renderer": "context-detail"
    },
    {
      "id": "pointer-intent",
      "version": 1,
      "title": "Make the next action unambiguous",
      "intent": "The viewer needs to connect an action with its consequence.",
      "avoid_when": "A recorded native pointer already communicates the action; do not add a duplicate.",
      "evidence_ids": [
        "sidebar-codex",
        "select-atlas"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 3,
      "hold_start_s": 1.3,
      "minimum_hold_s": 0.7,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "orient",
          "start_s": 0,
          "end_s": 0.5,
          "layer": "workspace",
          "action": "Hold the interface before pointer travel."
        },
        {
          "id": "travel",
          "start_s": 0.5,
          "end_s": 1.3,
          "layer": "pointer",
          "action": "Move tip from (.72,.72) to (.36,.40), decelerating."
        },
        {
          "id": "target-dwell",
          "start_s": 1.3,
          "end_s": 3,
          "layer": "pointer",
          "action": "Stop at the input; no click ripple, no continued orbit."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "pointer",
          "z": 30,
          "rect_norm": [
            0.36,
            0.4,
            0.016,
            0.033
          ],
          "coordinate_space": "workspace",
          "construction": "One arrow; its tip, not its bounding-box center, follows the path. No second cursor in a production capture."
        }
      ],
      "parameters": {
        "cursor_start_norm": [
          0.72,
          0.72
        ],
        "cursor_target_norm": [
          0.36,
          0.4
        ],
        "cursor_width_w": 0.016,
        "ease": "1-(1-u)^3"
      },
      "capture_requirements": [
        "Native cursor capture OR a cursor-free capture and an explicit pointer path, never both.",
        "Control bounds recorded in the capture coordinate system."
      ],
      "construction": [
        "Use one short path with no decorative loops.",
        "Travel ends before typing begins. Pointer dwell carries intent without an annotation."
      ],
      "failure_modes": [
        "Pointer covers the exact word being discussed.",
        "Click effect implies a click that never occurred in the product.",
        "Mouse acceleration from the desktop is mistaken for an authored ease."
      ],
      "verification": [
        "Tip arrives inside the input rectangle.",
        "Final 0.7 s or more is stationary.",
        "The next recipe inherits the input-target position."
      ],
      "entry_state": "workspace-empty",
      "exit_state": "input-focused",
      "run": "python render.py --recipe pointer-intent --out renders",
      "renderer": "pointer-intent"
    },
    {
      "id": "type-submit",
      "version": 1,
      "title": "Separate composing from committing",
      "intent": "The wording of a request is part of the explanation.",
      "avoid_when": "The wording is long or incidental; show a complete genuine prompt instead.",
      "evidence_ids": [
        "task-agent",
        "select-writing"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 5.5,
      "hold_start_s": 4.7,
      "minimum_hold_s": 0.5,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "focus",
          "start_s": 0,
          "end_s": 0.4,
          "layer": "pointer",
          "action": "Pointer remains on the input."
        },
        {
          "id": "type",
          "start_s": 0.4,
          "end_s": 2.8,
          "layer": "workspace",
          "action": "Reveal the original prompt at a deterministic editorial cadence."
        },
        {
          "id": "read",
          "start_s": 2.8,
          "end_s": 3.5,
          "layer": "workspace",
          "action": "Complete request holds before submission."
        },
        {
          "id": "to-submit",
          "start_s": 3.5,
          "end_s": 4.1,
          "layer": "pointer",
          "action": "Move to the submit control."
        },
        {
          "id": "submit",
          "start_s": 4.1,
          "end_s": 4.1,
          "layer": "workspace",
          "action": "Button changes state; retain the complete request."
        },
        {
          "id": "pointer-clear",
          "start_s": 4.1,
          "end_s": 4.7,
          "layer": "pointer",
          "action": "Move off the result region to (.94,.88)."
        },
        {
          "id": "submitted",
          "start_s": 4.7,
          "end_s": 5.5,
          "layer": "workspace",
          "action": "Hold the pending state."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "pointer",
          "z": 30,
          "rect_norm": [
            0.36,
            0.4,
            0.016,
            0.033
          ],
          "coordinate_space": "workspace",
          "construction": "One arrow; its tip, not its bounding-box center, follows the path. No second cursor in a production capture."
        }
      ],
      "parameters": {
        "typing_duration_s": 2.4,
        "submit_target_norm": [
          0.83,
          0.465
        ],
        "park_norm": [
          0.94,
          0.88
        ],
        "caret_period_s": 0.5
      },
      "capture_requirements": [
        "Original short request; ensure it fits the composer without truncation.",
        "Capture the actual submitted state when adapting this to a real product."
      ],
      "construction": [
        "Keep the composer width and baseline constant during typing.",
        "Caret blink belongs to the input, not an unexplained second cursor.",
        "The neutral example uses uniform character cadence; neither typing cadence nor 0.8 s pending hold is a product-latency measurement."
      ],
      "failure_modes": [
        "Submitted text differs from the visible request.",
        "Typing, camera movement, and result animation compete.",
        "The caret continues blinking over a final result."
      ],
      "verification": [
        "Full prompt is visible before submission.",
        "Submit precedes progress and output.",
        "No audio stream is exported."
      ],
      "entry_state": "input-focused",
      "exit_state": "submitted",
      "run": "python render.py --recipe type-submit --out renders",
      "renderer": "type-submit"
    },
    {
      "id": "selection-action",
      "version": 1,
      "title": "Selection explains the scope",
      "intent": "A change applies to a specific passage or row rather than the whole document.",
      "avoid_when": "The real product does not offer the selected contextual action.",
      "evidence_ids": [
        "select-writing",
        "select-atlas"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 5,
      "hold_start_s": 2.5,
      "minimum_hold_s": 1.5,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "orient",
          "start_s": 0,
          "end_s": 0.7,
          "layer": "workspace",
          "action": "Show readable document rows."
        },
        {
          "id": "select",
          "start_s": 0.7,
          "end_s": 1.4,
          "layer": "selection",
          "action": "Extend one translucent highlight across the target row."
        },
        {
          "id": "selection-read",
          "start_s": 1.4,
          "end_s": 1.8,
          "layer": "selection",
          "action": "Hold the selected scope."
        },
        {
          "id": "toolbar",
          "start_s": 1.8,
          "end_s": 2.1,
          "layer": "toolbar",
          "action": "Reveal a local action below the selected row, without moving the document."
        },
        {
          "id": "scope-read",
          "start_s": 2.1,
          "end_s": 5,
          "layer": "workspace",
          "action": "Hold scope and available action; do not claim the edit has completed."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "result-surface",
          "z": 18,
          "rect_norm": [
            0.3,
            0.56,
            0.58,
            0.23
          ],
          "coordinate_space": "workspace",
          "construction": "Opaque result-card background only; draw before the highlight."
        },
        {
          "id": "selection",
          "z": 19,
          "rect_norm": [
            0.319,
            0.642,
            0.44,
            0.04
          ],
          "coordinate_space": "workspace",
          "construction": "Tint above the card background and below its glyphs; text itself stays opaque."
        },
        {
          "id": "result",
          "z": 20,
          "rect_norm": [
            0.3,
            0.56,
            0.58,
            0.23
          ],
          "coordinate_space": "workspace",
          "construction": "Result heading and row glyphs only. The separate result-surface layer owns the opaque card background."
        },
        {
          "id": "toolbar",
          "z": 25,
          "rect_norm": [
            0.32,
            0.804,
            0.3,
            0.055
          ],
          "coordinate_space": "workspace",
          "construction": "Local action bar below content, outside the highlighted line."
        }
      ],
      "parameters": {
        "selection_opacity": 0.32,
        "selection_row": 0,
        "toolbar_gap_h": 0.014
      },
      "capture_requirements": [
        "A genuine selectable passage and verified available action.",
        "Enough context to see that this is a local selection."
      ],
      "construction": [
        "Selection is beneath glyphs, not a translucent text layer.",
        "A selection and a contextual menu are scope evidence, not completion proof."
      ],
      "failure_modes": [
        "Highlight obscures text.",
        "Moving the camera while the selection expands.",
        "Rendering a fabricated successful edit after a menu opens."
      ],
      "verification": [
        "Only the intended row is tinted.",
        "Toolbar appears after selection is complete.",
        "The result is explicitly still unmodified."
      ],
      "entry_state": "document",
      "exit_state": "document-selected",
      "run": "python render.py --recipe selection-action --out renders",
      "renderer": "selection-action"
    },
    {
      "id": "scroll-landmark",
      "version": 1,
      "title": "Scroll toward a named destination",
      "intent": "A result extends below the viewport and one region matters to the spoken point.",
      "avoid_when": "The destination could fit through a better initial crop; avoid scrolling for decoration.",
      "evidence_ids": [
        "scroll-calendar",
        "preview-canvas"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 5,
      "hold_start_s": 2.2,
      "minimum_hold_s": 1.5,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "orient",
          "start_s": 0,
          "end_s": 0.8,
          "layer": "workspace",
          "action": "Establish header and visible rows."
        },
        {
          "id": "scroll",
          "start_s": 0.8,
          "end_s": 2.2,
          "layer": "document",
          "action": "Translate only the document upward by .18 frame height."
        },
        {
          "id": "land",
          "start_s": 2.2,
          "end_s": 5,
          "layer": "document",
          "action": "Stop on the named result. Keep header and frame stationary."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "document",
          "z": 20,
          "rect_norm": [
            0.3,
            0.34,
            0.58,
            0.47
          ],
          "coordinate_space": "workspace",
          "construction": "Tall content inside a hard viewport mask. The mask stays fixed; the content moves behind it."
        }
      ],
      "parameters": {
        "scroll_distance_h": 0.18,
        "ease": "1-(1-u)^3",
        "landmark": "Ready to review"
      },
      "capture_requirements": [
        "A tall genuine result with one known destination.",
        "Record initial and final scroll offsets; avoid responsive reflow between captures."
      ],
      "construction": [
        "Use document-space translation, never a whole-frame camera move.",
        "Fixed header, viewport edges, and pointer separate scroll from zoom.",
        "No requirement to match the source scroll acceleration."
      ],
      "failure_modes": [
        "Reading during the scroll.",
        "Destination hidden under a sticky header.",
        "Clipped labels leak outside the viewport mask."
      ],
      "verification": [
        "Header pixels do not move.",
        "The destination is fully inside the viewport.",
        "No content motion remains during the final hold."
      ],
      "entry_state": "document-top",
      "exit_state": "document-landmark",
      "run": "python render.py --recipe scroll-landmark --out renders",
      "renderer": "scroll-landmark"
    },
    {
      "id": "progress-result",
      "version": 1,
      "title": "Wait, reveal, then become readable",
      "intent": "The action has a visible working state before a result.",
      "avoid_when": "A real result failed or is not yet available; capture the failure honestly.",
      "evidence_ids": [
        "preview-canvas",
        "patch-ide"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 5.5,
      "hold_start_s": 2.5,
      "minimum_hold_s": 2,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "work",
          "start_s": 0,
          "end_s": 1.4,
          "layer": "workspace",
          "action": "Show an explicitly illustrative pending state."
        },
        {
          "id": "reveal",
          "start_s": 1.4,
          "end_s": 1.9,
          "layer": "result",
          "action": "Replace pending with the result container; content fades in."
        },
        {
          "id": "settle",
          "start_s": 1.9,
          "end_s": 2.5,
          "layer": "result",
          "action": "The complete result is now visible; leave a settling allowance."
        },
        {
          "id": "result-read",
          "start_s": 2.5,
          "end_s": 5.5,
          "layer": "result",
          "action": "Hold with no spinner, caret, scroll, or camera movement."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "result",
          "z": 20,
          "rect_norm": [
            0.3,
            0.56,
            0.58,
            0.23
          ],
          "coordinate_space": "workspace",
          "construction": "One output card with three original rows. Data and heading remain stable during the reading interval."
        }
      ],
      "parameters": {
        "reveal_duration_s": 0.5,
        "settle_allowance_s": 0.6,
        "loading_dot_period_s": 0.6,
        "latency_status": "illustrative-not-product-latency"
      },
      "capture_requirements": [
        "Uncut real run retained privately, including failure and retry states.",
        "Captured completed output with identifiable content, not merely a success toast.",
        "If wait is shortened, place a visible time-compression label and record the omitted interval."
      ],
      "construction": [
        "Pending and result share a stable slot.",
        "The neutral crossfade is chosen; production should preserve native result behavior.",
        "First visible container is not the readability onset. Late chart or row builds delay the start of the hold."
      ],
      "failure_modes": [
        "Counting a skeleton as a readable result.",
        "Cutting out all waiting without disclosure.",
        "Stopping the footage while a chart is still building."
      ],
      "verification": [
        "No result appears before submission.",
        "Final hold hashes stay identical.",
        "Latency is not inferred from this edited study."
      ],
      "entry_state": "submitted",
      "exit_state": "result-ready",
      "run": "python render.py --recipe progress-result --out renders",
      "renderer": "progress-result"
    },
    {
      "id": "result-hold",
      "version": 1,
      "title": "Let the proof carry the sentence",
      "intent": "Speech names an outcome the viewer must inspect.",
      "avoid_when": "Only a toast or unverified claim is visible; obtain real proof first.",
      "evidence_ids": [
        "preview-canvas",
        "result-codex"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 4,
      "hold_start_s": 0,
      "minimum_hold_s": 3,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "read",
          "start_s": 0,
          "end_s": 4,
          "layer": "result",
          "action": "Show the completed result and stop all motion."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "result",
          "z": 20,
          "rect_norm": [
            0.3,
            0.56,
            0.58,
            0.23
          ],
          "coordinate_space": "workspace",
          "construction": "One output card with three original rows. Data and heading remain stable during the reading interval."
        }
      ],
      "parameters": {
        "minimum_body_font_h": 0.035,
        "read_words_per_s": 3,
        "orientation_allowance_s": 0.6,
        "reference_viewport_px": [
          640,
          360
        ]
      },
      "capture_requirements": [
        "A completed output and the exact sentence that needs it.",
        "List the essential words or values the viewer must read."
      ],
      "construction": [
        "Proposed reading budget: max(3 s, essential_word_count / 3 + .6 s). Validate with a reader; this is not a measured source rule.",
        "Crop or simplify before shrinking text. Keep the task title and outcome together."
      ],
      "failure_modes": [
        "New movement steals attention during the claim.",
        "Whole-page proof is technically present but too small.",
        "Small disclaimer is needed to make a large claim true."
      ],
      "verification": [
        "Read all essential result words at 640 x 360.",
        "Frames at beginning, middle, and end of the hold are pixel-identical.",
        "Dense results require a longer requested duration."
      ],
      "entry_state": "result-ready",
      "exit_state": "result-ready",
      "run": "python render.py --recipe result-hold --out renders",
      "renderer": "result-hold"
    },
    {
      "id": "object-handoff",
      "version": 1,
      "title": "Carry one object across the cut",
      "intent": "The same artifact changes presentation context.",
      "avoid_when": "Two unrelated outputs would be made to look like one object.",
      "evidence_ids": [
        "opening-study",
        "deck-agent"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 4.5,
      "hold_start_s": 2,
      "minimum_hold_s": 1.5,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "object-read",
          "start_s": 0,
          "end_s": 2,
          "layer": "artifact",
          "action": "Hold the original artifact on paper."
        },
        {
          "id": "context-cut",
          "start_s": 2,
          "end_s": 2,
          "layer": "workspace",
          "action": "Hard cut to a workspace with the exact same artifact, size, and position."
        },
        {
          "id": "context-read",
          "start_s": 2,
          "end_s": 4.5,
          "layer": "workspace",
          "action": "Surrounding context explains where the object went."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "artifact",
          "z": 20,
          "rect_norm": [
            0.48,
            0.38,
            0.26,
            0.3
          ],
          "coordinate_space": "workspace",
          "construction": "Retained original card with a distinctive stepped path; same asset and bounds in both scenes."
        }
      ],
      "parameters": {
        "artifact_rect_norm": [
          0.48,
          0.38,
          0.26,
          0.3
        ],
        "transition": "cut",
        "identity_tolerance_px": 0
      },
      "capture_requirements": [
        "One original asset reused unchanged, or two genuine captures with a verified identity match.",
        "A saved object ID and normalized anchor in both scenes."
      ],
      "construction": [
        "Object continuity comes from identity and location, not an invented morph.",
        "For a moving variant interpolate an explicit common anchor; retain the same asset throughout."
      ],
      "failure_modes": [
        "Content swaps while the frame implies continuity.",
        "Tiny changes to crop, corner radius, or scale cause a jump.",
        "Calling a cut a morph."
      ],
      "verification": [
        "Artifact-region pixels are identical on adjacent cut frames.",
        "New context does not cover the retained object."
      ],
      "entry_state": "artifact-isolated",
      "exit_state": "artifact-in-workspace",
      "run": "python render.py --recipe object-handoff --out renders",
      "renderer": "object-handoff"
    },
    {
      "id": "quiet-ending",
      "version": 1,
      "title": "Finish the proof before the sign-off",
      "intent": "The final result has been read and the speaker is concluding.",
      "avoid_when": "Speech still depends on a detail that would disappear, or the supplied recording lacks a safe ending tail.",
      "evidence_ids": [
        "ending-codex",
        "ending-atlas",
        "result-codex"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 5,
      "hold_start_s": 2.6,
      "minimum_hold_s": 2,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "last-proof",
          "start_s": 0,
          "end_s": 1,
          "layer": "result",
          "action": "Retain the completed output for one additional second."
        },
        {
          "id": "ending-cut",
          "start_s": 1,
          "end_s": 1,
          "layer": "title",
          "action": "Cut to an original closing phrase."
        },
        {
          "id": "mark-build",
          "start_s": 1.3,
          "end_s": 2.3,
          "layer": "mark",
          "action": "Three simple bars build at .12 s offsets; no source logo is traced."
        },
        {
          "id": "quiet",
          "start_s": 2.6,
          "end_s": 5,
          "layer": "title",
          "action": "All motion has stopped. Leave a clean ending pose."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "result",
          "z": 20,
          "rect_norm": [
            0.3,
            0.56,
            0.58,
            0.23
          ],
          "coordinate_space": "workspace",
          "construction": "One output card with three original rows. Data and heading remain stable during the reading interval."
        },
        {
          "id": "title",
          "z": 20,
          "rect_norm": [
            0.14,
            0.32,
            0.72,
            0.28
          ],
          "coordinate_space": "frame",
          "construction": "Original short phrase, left aligned. Baseline grid fixed; masked entry never reflows the text."
        },
        {
          "id": "mark",
          "z": 25,
          "rect_norm": [
            0.14,
            0.63,
            0.12,
            0.08
          ],
          "coordinate_space": "frame",
          "construction": "Original three-bar motif. Its shape has no relationship to a source trademark."
        }
      ],
      "parameters": {
        "mark_stagger_s": 0.12,
        "quiet_from_s": 2.6,
        "ending_font_h": 0.082
      },
      "capture_requirements": [
        "Original closing phrase and owned identity assets.",
        "Recording-derived last spoken word, wave, pause onset, and recording end.",
        "Calibrated cue-to-OBS delay from rehearsal."
      ],
      "construction": [
        "Separate the source lesson of staged arrival and a quieter tail from the copyrighted mark.",
        "The proof study is not a synchronized presentation. Final end time must satisfy the paired-timeline contract."
      ],
      "failure_modes": [
        "Starting the outro before the final proof is readable.",
        "Endless spinning mark.",
        "Subtracting file durations instead of comparing shared-timeline endpoints.",
        "Inventing a wave or freezing a speaking face."
      ],
      "verification": [
        "Quiet interval is at least 2 s in this study.",
        "No audio stream.",
        "For production, presentation ends while the recorded wave/pause is still running."
      ],
      "entry_state": "result-ready",
      "exit_state": "ending-quiet",
      "run": "python render.py --recipe quiet-ending --out renders",
      "renderer": "quiet-ending"
    },
    {
      "id": "anchored-caption",
      "version": 1,
      "title": "A label that knows what it belongs to",
      "intent": "Identify an artifact or chapter without displacing the evidence.",
      "avoid_when": "A name label would duplicate the separate talking-head video, or the result occupies the lower edge.",
      "evidence_ids": [
        "caption-paired",
        "caption-persistent"
      ],
      "claim_status": "editorial-interpretation",
      "parameter_status": "proposed-production-default",
      "duration_s": 4.5,
      "hold_start_s": 1,
      "minimum_hold_s": 2,
      "duration_adaptation": "Keep all phase onsets fixed. Change only the final settled hold. Reject a total below hold_start_s + minimum_hold_s; split the narrated beat or reduce content instead. Longer speech extends the hold, not typing speed, cursor speed, or product latency.",
      "phases": [
        {
          "id": "establish",
          "start_s": 0,
          "end_s": 0.5,
          "layer": "workspace",
          "action": "Show the artifact first."
        },
        {
          "id": "caption",
          "start_s": 0.5,
          "end_s": 0.5,
          "layer": "caption",
          "action": "Both caption fields switch on together."
        },
        {
          "id": "read",
          "start_s": 0.5,
          "end_s": 4.5,
          "layer": "caption",
          "action": "Keep the caption anchored to the frame, not the moving workspace."
        }
      ],
      "layers": [
        {
          "id": "field",
          "z": 0,
          "rect_norm": [
            0,
            0,
            1,
            1
          ],
          "coordinate_space": "frame",
          "construction": "Solid warm paper. No moving texture behind readable type."
        },
        {
          "id": "workspace",
          "z": 10,
          "rect_norm": [
            0.07,
            0.12,
            0.86,
            0.78
          ],
          "coordinate_space": "frame",
          "construction": "Original neutral fixture; rounded alpha mask, 1 px border at 1280 width. Clip content before the camera transform."
        },
        {
          "id": "caption",
          "z": 40,
          "rect_norm": [
            0.07,
            0.9,
            0.86,
            0.075
          ],
          "coordinate_space": "frame",
          "construction": "Dark two-field band outside the product window; one baseline, fixed left and right fields."
        }
      ],
      "parameters": {
        "caption_font_h": 0.027,
        "caption_gap_w": 0.26,
        "entrance": "hard-on"
      },
      "capture_requirements": [
        "An original artifact name and short descriptor.",
        "A clear lower safe band; never import speaker identities from a reference."
      ],
      "construction": [
        "The source comparison demonstrates that a label can leave with a cut OR persist across one.",
        "The example uses a contrasting band for legibility, not a claim that the source has a backing plate.",
        "Keep a person-ID recipe out of the default separate-presentation workflow."
      ],
      "failure_modes": [
        "Caption covers the output.",
        "White type becomes unreadable over a changed background.",
        "Copying a sampled source font as an exact identification."
      ],
      "verification": [
        "Fields share a baseline and arrive together.",
        "Label is outside result bounds.",
        "Caption stays in screen space through any later camera move."
      ],
      "entry_state": "workspace-empty",
      "exit_state": "workspace-caption",
      "run": "python render.py --recipe anchored-caption --out renders",
      "renderer": "anchored-caption"
    }
  ],
  "sequences": [
    {
      "id": "title-to-interface",
      "title": "Title to interface",
      "segments": [
        "title-interface",
        "context-detail"
      ],
      "duration_s": 10,
      "checkpoints_s": [
        0.7,
        2.9,
        3,
        6,
        7.25,
        8.5
      ],
      "focus": "A clear title cut at 3 s, context before camera movement, then a settled detail.",
      "evidence_ids": [
        "opening-codex",
        "opening-atlas",
        "review-codex",
        "cut-atlas"
      ]
    },
    {
      "id": "interaction-to-result",
      "title": "Interaction to readable result",
      "segments": [
        "pointer-intent",
        "type-submit",
        "progress-result",
        "result-hold"
      ],
      "duration_s": 18,
      "checkpoints_s": [
        1.3,
        5.8,
        7.1,
        9.3,
        10.4,
        12,
        17
      ],
      "focus": "Pointer \u2192 complete request \u2192 submit \u2192 pending \u2192 content \u2192 quiet proof. The last 7 s are a stable reading interval.",
      "evidence_ids": [
        "sidebar-codex",
        "task-agent",
        "preview-canvas",
        "patch-ide"
      ]
    },
    {
      "id": "result-to-ending",
      "title": "Result to ending",
      "segments": [
        "result-hold",
        "quiet-ending"
      ],
      "duration_s": 9,
      "checkpoints_s": [
        0,
        3.9,
        4,
        5,
        6,
        6.6,
        8.9
      ],
      "focus": "Five seconds of unchanged proof, a clean ending cut, then an original mark and at least 2 s of quiet.",
      "evidence_ids": [
        "result-codex",
        "ending-codex",
        "ending-atlas"
      ]
    }
  ]
}
