{
  "schema_version": 2,
  "meta": {
    "build_id": "CODEX-AI-DOCUMENTARY-ONE-BRIEF",
    "slug": "ai-documentary-one-brief",
    "title": "Make an AI Documentary from One Brief",
    "subtitle": "Turn a production bible into sourced shots, budgets and measurable quality checks.",
    "description": "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise.",
    "one_sentence_description": "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise.",
    "target_user": "A motivated beginner with permission to work in a private practice folder.",
    "skill_level": "beginner",
    "estimated_time": "2–3 hours",
    "category": "Guided Build",
    "tags": [
      "ai-documentary-one-brief",
      "verified practice",
      "chatgpt_codex"
    ],
    "prerequisites": [
      "Permission to use a dedicated workspace",
      "A browser and terminal",
      "Read each platform-specific prerequisite before installation",
      "FFmpeg and ffprobe on PATH; use the official download guide before the video-QC lesson."
    ],
    "required_accounts": [],
    "required_software": [
      "Modern browser",
      "Python 3.10+ for downloadable drills",
      "FFmpeg and ffprobe on PATH; use the official download guide before the video-QC lesson."
    ],
    "required_hardware": [
      "A computer with space for the practice files",
      "Second drive for the disaster-recovery checkpoint"
    ],
    "expected_cost": "Free practice with FFmpeg; paid generation is optional and requires separate approval.",
    "final_outcome": "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise.",
    "platforms": [
      "windows",
      "macos",
      "linux"
    ],
    "version": 13,
    "author": "chatgpt_codex",
    "source_checked": "2026-10-05",
    "verification_status": "Created; automated browser and project checks recorded separately. Live account/OS verification is never inferred from browser completion."
  },
  "user_outcome": {
    "before": "The learner has no reproducible, checked workflow for make an ai documentary from one brief.",
    "after": "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise.",
    "finished_product": "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise."
  },
  "learning_objectives": [
    "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
    "The brief has all ten sections and each stage has a start, event and end state.",
    "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
    "Every number planned for the screen maps to a reviewed claim ID and source URL.",
    "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
    "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices."
  ],
  "lessons": [
    {
      "lesson_id": "L01",
      "title": "Study the source without inventing the harness",
      "purpose": "Alex Patrascu is the source of this case study. The exact 2,769-word brief is not published as text; a best-effort reconstruction is not an exact quotation.",
      "estimated_time": "6 min",
      "learning_objective": "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
      "lessons_before_this": [],
      "lessons_after_this": [
        "L02"
      ]
    },
    {
      "lesson_id": "L02",
      "title": "Write the production bible",
      "purpose": "A dedicated folder makes mistakes easy to diagnose and keeps real project files separate.",
      "estimated_time": "12 min",
      "learning_objective": "The brief has all ten sections and each stage has a start, event and end state.",
      "lessons_before_this": [
        "L01"
      ],
      "lessons_after_this": [
        "L03"
      ]
    },
    {
      "lesson_id": "L03",
      "title": "Lock identity and performance",
      "purpose": "Alex’s reported tool chain used Nano Banana for the 4K face, Seed Audio 1.0 for a designed voice sample and Seedance 2.5 at 1080p. Filenames/text alone are not real reference attachments.",
      "estimated_time": "6 min",
      "learning_objective": "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
      "lessons_before_this": [
        "L02"
      ],
      "lessons_after_this": [
        "L04"
      ]
    },
    {
      "lesson_id": "L04",
      "title": "Build a fact ledger",
      "purpose": "The case study reported 28 sources, 15 official. That describes its research effort; it does not independently verify every documentary claim. A diagram explains, rather than proves, a real underground survey.",
      "estimated_time": "6 min",
      "learning_objective": "Every number planned for the screen maps to a reviewed claim ID and source URL.",
      "lessons_before_this": [
        "L03"
      ],
      "lessons_after_this": [
        "L05"
      ]
    },
    {
      "lesson_id": "L05",
      "title": "Budget including retakes",
      "purpose": "The source reported roughly $350–650 of Higgsfield credits and about $123 of Claude usage at API rates, roughly $60–100 per finished minute. These are historical reported estimates, not a current offer or required spend.",
      "estimated_time": "6 min",
      "learning_objective": "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
      "lessons_before_this": [
        "L04"
      ],
      "lessons_after_this": [
        "L06"
      ]
    },
    {
      "lesson_id": "L06",
      "title": "Apply the edit playbook",
      "purpose": "The source reported 61 pauses cut, 34.2 seconds total, with 28 punch-ins, 19 graphics, 10 punch-outs and 4 cutaways. These are its edit decisions; preserve meaning and real action in your own film.",
      "estimated_time": "6 min",
      "learning_objective": "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
      "lessons_before_this": [
        "L05"
      ],
      "lessons_after_this": [
        "L07"
      ]
    },
    {
      "lesson_id": "L07",
      "title": "Build editable graphics and sound targets",
      "purpose": "Alex reported six editable diagrams through Tesseract by Mirage plus JavaScript, and six ElevenLabs Music cues via Arcads totaling 152 credits. This practice uses free editable artwork and generated test audio.",
      "estimated_time": "6 min",
      "learning_objective": "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
      "lessons_before_this": [
        "L06"
      ],
      "lessons_after_this": [
        "L08"
      ]
    },
    {
      "lesson_id": "L08",
      "title": "Machine-check a real clip for free",
      "purpose": "QC can flag silence/freezes but cannot determine whether a hold is intentional. Human continuity and word checks remain necessary.",
      "estimated_time": "6 min",
      "learning_objective": "before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
      "lessons_before_this": [
        "L07"
      ],
      "lessons_after_this": [
        "L09"
      ]
    },
    {
      "lesson_id": "L09",
      "title": "Correct loudness and inspect flagged moments",
      "purpose": "The locally archived social copy measured -15.2 LUFS but -1.3 dBTP, above the source ceiling; re-encoding is a plausible explanation. Extra master headroom is prudent, and measuring the final encode is the check.",
      "estimated_time": "6 min",
      "learning_objective": "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
      "lessons_before_this": [
        "L08"
      ],
      "lessons_after_this": [
        "L10"
      ]
    },
    {
      "lesson_id": "L10",
      "title": "Delegate a plan, then deliver the evidence",
      "purpose": "Whisper was the case study’s word check, but a script/audio comparison still needs review of tool errors. A sourced plan and measured free exercise are the course deliverables; a paid eight-minute film is an optional later project.",
      "estimated_time": "6 min",
      "learning_objective": "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
      "lessons_before_this": [
        "L09"
      ],
      "lessons_after_this": [
        "L11"
      ]
    },
    {
      "lesson_id": "L11",
      "title": "Build Bot Better — protect and recover",
      "purpose": "The September 23 BuildBotsBetter profile wipe removed Desktop, Documents and hidden agent memory together. Repeatable onboarding protects the knowledge needed to recover.",
      "estimated_time": "30 min",
      "learning_objective": "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
      "lessons_before_this": [
        "L10"
      ],
      "lessons_after_this": []
    }
  ],
  "steps": [
    {
      "title": "Separate reported facts from unknowns",
      "purpose": "This step helps you separate reported facts from unknowns. The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
      "user_action": "Read the linked Alex Patrascu thread archive and source review. Record his reported workflow: Claude Opus 5.5, 8 h 21 min, 47 min human voice work, 7 h 34 min autonomous; 10,485 Higgsfield credits for 106 generations, 96 Seedance takes and 77 used. His about-50,000-credit ceiling is not an instruction to spend. Before video QC, open https://ffmpeg.org/download.html. Windows: follow its Windows-build link, extract into your own tools folder, add the bin directory containing ffmpeg.exe and ffprobe.exe to your user PATH, then open a new terminal. macOS: use its macOS binary link and follow that distributor’s installation instructions. Linux: use your distribution’s package link. Verify ffmpeg -version and ffprobe -version in the same terminal before continuing. A missing command means PATH or installation still needs repair; do not claim QC success.",
      "explanation": "This step helps you separate reported facts from unknowns. The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
      "resources": [],
      "checkpoint": {
        "what_is_being_checked": "Separate reported facts from unknowns",
        "success_condition": "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
        "how_to_verify": "Record the observed result for Separate reported facts from unknowns. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: reported, unknown.",
        "criteria": [
          "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "reported",
          "unknown"
        ],
        "user_visible_success_message": "Evidence saved. The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Separate reported facts from unknowns?",
          "fix": "For Separate reported facts from unknowns: Read the linked Alex Patrascu thread archive and source review. Record his reported workflow: Claude Opus 5.5, 8 h 21 min, 47 min human voice work, 7 h 34 min autonomous; 10,485 Higgsfield credits for 106 generations, 96 Seedance takes and 77 used. His about-50,000-credit ceiling is not an instruction to spend. Before video QC, open https://ffmpeg.org/download.html. Windows: follow its Windows-build link, extract into your own tools folder, add the bin directory containing ffmpeg.exe and ffprobe.exe to your user PATH, then open a new terminal. macOS: use its macOS binary link and follow that distributor’s installation instructions. Linux: use your distribution’s package link. Verify ffmpeg -version and ffprobe -version in the same terminal before continuing. A missing command means PATH or installation still needs repair; do not claim QC success. Compare the actual output to The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details."
        },
        {
          "question": "Which files support this action?",
          "answer": "No file is required; record your specific observation."
        }
      ],
      "quiz": {
        "question": "Do we know which harness drove Higgsfield?",
        "answer_type": "single_choice",
        "choices": [
          "No; the thread does not establish it.",
          "Yes; any imagined MCP integration is the original."
        ],
        "correct_answer": 0,
        "explanation": "Do not fill gaps in source evidence with a plausible implementation."
      },
      "coach": {
        "intro": "We are going to separate reported facts from unknowns. The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.",
        "demo": "Read the linked Alex Patrascu thread archive and source review. Record his reported workflow: Claude Opus 5.5, 8 h 21 min, 47 min human voice work, 7 h 34 min autonomous; 10,485 Higgsfield credits for 106 generations, 96 Seedance takes and 77 used. His about-50,000-credit ceiling is not an instruction to spend. Before video QC, open https://ffmpeg.org/download.html. Windows: follow its Windows-build link, extract into your own tools folder, add the bin directory containing ffmpeg.exe and ffprobe.exe to your user PATH, then open a new terminal. macOS: use its macOS binary link and follow that distributor’s installation instructions. Linux: use your distribution’s package link. Verify ffmpeg -version and ffprobe -version in the same terminal before continuing. A missing command means PATH or installation still needs repair; do not claim QC success.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Separate reported facts from unknowns, compare your own result with: The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details.. Read the linked Alex Patrascu thread archive and source review. Record his reported workflow: Claude Opus 5.5, 8 h 21 min, 47 min human voice work, 7 h 34 min autonomous; 10,485 Higgsfield credits for 106 generations, 96 Seedance takes and 77 used. His about-50,000-credit ceiling is not an instruction to spend. Before video QC, open https://ffmpeg.org/download.html. Windows: follow its Windows-build link, extract into your own tools folder, add the bin directory containing ffmpeg.exe and ffprobe.exe to your user PATH, then open a new terminal. macOS: use its macOS binary link and follow that distributor’s installation instructions. Linux: use your distribution’s package link. Verify ffmpeg -version and ffprobe -version in the same terminal before continuing. A missing command means PATH or installation still needs repair; do not claim QC success."
      },
      "video": {
        "purpose": "Demonstrate separate reported facts from unknowns",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Alex Patrascu is the source of this case study. The exact 2,769-word brief is not published as text; a best-effort reconstruction is not an exact quotation. Read the linked Alex Patrascu thread archive and source review. Record his reported workflow: Claude Opus 5.5, 8 h 21 min, 47 min human voice work, 7 h 34 min autonomous; 10,485 Higgsfield credits for 106 generations, 96 Seedance takes and 77 used. His about-50,000-credit ceiling is not an instruction to spend. Before video QC, open https://ffmpeg.org/download.html. Windows: follow its Windows-build link, extract into your own tools folder, add the bin directory containing ffmpeg.exe and ffprobe.exe to your user PATH, then open a new terminal. macOS: use its macOS binary link and follow that distributor’s installation instructions. Linux: use your distribution’s package link. Verify ffmpeg -version and ffprobe -version in the same terminal before continuing. A missing command means PATH or installation still needs repair; do not claim QC success.",
        "on_screen_text": [
          "Separate reported facts from unknowns",
          "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details."
        ],
        "screen_recording_instructions": [
          "Read the linked Alex Patrascu thread archive and source review. Record his reported workflow: Claude Opus 5.5, 8 h 21 min, 47 min human voice work, 7 h 34 min autonomous; 10,485 Higgsfield credits for 106 generations, 96 Seedance takes and 77 used. His about-50,000-credit ceiling is not an instruction to spend. Before video QC, open https://ffmpeg.org/download.html. Windows: follow its Windows-build link, extract into your own tools folder, add the bin directory containing ffmpeg.exe and ffprobe.exe to your user PATH, then open a new terminal. macOS: use its macOS binary link and follow that distributor’s installation instructions. Linux: use your distribution’s package link. Verify ffmpeg -version and ffprobe -version in the same terminal before continuing. A missing command means PATH or installation still needs repair; do not claim QC success.",
          "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Alex Patrascu is the source of this case study. The exact 2,769-word brief is not published as text; a best-effort reconstruction is not an exact quotation.",
          "Read the linked Alex Patrascu thread archive and source review. Record his reported workflow: Claude Opus 5.5, 8 h 21 min, 47 min human voice work, 7 h 34 min autonomous; 10,485 Higgsfield credits for 106 generations, 96 Seedance takes and 77 used. His about-50,000-credit ceiling is not an instruction to spend. Before video QC, open https://ffmpeg.org/download.html. Windows: follow its Windows-build link, extract into your own tools folder, add the bin directory containing ffmpeg.exe and ffprobe.exe to your user PATH, then open a new terminal. macOS: use its macOS binary link and follow that distributor’s installation instructions. Linux: use your distribution’s package link. Verify ffmpeg -version and ffprobe -version in the same terminal before continuing. A missing command means PATH or installation still needs repair; do not claim QC success.",
          "The source note distinguishes reported numbers, the locally measured film and unknown harness/provider-control details."
        ]
      },
      "step_id": "L01-S01",
      "lesson_id": "L01"
    },
    {
      "title": "Set up the practice folder",
      "purpose": "This step helps you set up the practice folder. Python reports version 3.10 or newer and the terminal is in the extracted resource folder.",
      "user_action": "Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder.",
      "explanation": "This step helps you set up the practice folder. Python reports version 3.10 or newer and the terminal is in the extracted resource folder. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "command",
      "commands": {
        "windows": "python --version\nGet-Location\nGet-ChildItem",
        "macos": "python3 --version\npwd\nls",
        "linux": "python3 --version\npwd\nls"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Python reports version 3.10 or newer and the terminal is in the extracted resource folder.",
      "resources": [],
      "checkpoint": {
        "what_is_being_checked": "Set up the practice folder",
        "success_condition": "Python reports version 3.10 or newer and the terminal is in the extracted resource folder.",
        "how_to_verify": "Record the observed result for Set up the practice folder. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: Python.",
        "criteria": [
          "Python is 3.10 or newer.",
          "The listed files match the downloaded resources."
        ],
        "tokens": [
          "Python"
        ],
        "user_visible_success_message": "Evidence saved. Python reports version 3.10 or newer and the terminal is in the extracted resource folder.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true,
        "python_min": [
          3,
          10
        ]
      },
      "troubleshooting": [
        {
          "problem": "Python or a file is not found",
          "likely_cause": "The terminal may be outside the extracted ZIP or Python may not be on PATH.",
          "diagnostic_question": "What exact result did you observe during Set up the practice folder?",
          "fix": "For Set up the practice folder: Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder. Compare the actual output to Python reports version 3.10 or newer and the terminal is in the extracted resource folder.",
          "alternative_fix": "Use py -3 on Windows if the Python launcher is installed. macOS/Linux commands use python3.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Install Python from python.org with the PATH option; reopen the terminal and change into the extracted folder."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "Python reports version 3.10 or newer and the terminal is in the extracted resource folder."
        },
        {
          "question": "Which files support this action?",
          "answer": "No file is required; record your specific observation."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to set up the practice folder. Python reports version 3.10 or newer and the terminal is in the extracted resource folder.",
        "demo": "Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Install Python from python.org with the PATH option; reopen the terminal and change into the extracted folder.",
        "help": "For Set up the practice folder, compare your own result with: Python reports version 3.10 or newer and the terminal is in the extracted resource folder.. Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder."
      },
      "video": {
        "purpose": "Demonstrate set up the practice folder",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A dedicated folder makes mistakes easy to diagnose and keeps real project files separate. Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder.",
        "on_screen_text": [
          "Set up the practice folder",
          "Python reports version 3.10 or newer and the terminal is in the extracted resource folder."
        ],
        "screen_recording_instructions": [
          "Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder.",
          "Python reports version 3.10 or newer and the terminal is in the extracted resource folder."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "Python reports version 3.10 or newer and the terminal is in the extracted resource folder."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A dedicated folder makes mistakes easy to diagnose and keeps real project files separate.",
          "Download the resource ZIP at the top of this Build. Extract it into a new folder you own (for example C:\\BBBPractice on Windows, or ~/bbb-practice on macOS/Linux). Open a terminal in the extracted folder. Run the version command for your platform. All subsequent commands assume this folder.",
          "Python reports version 3.10 or newer and the terminal is in the extracted resource folder."
        ]
      },
      "step_id": "L02-S01",
      "lesson_id": "L02"
    },
    {
      "title": "Lock the message and six timed stages",
      "purpose": "This step helps you lock the message and six timed stages. The brief has all ten sections and each stage has a start, event and end state.",
      "user_action": "Edit production-bible.md for an original 60-second explainer. Include locked title/message, fictional host, wardrobe, voice in words, film look, six timed stages, research rules, sound/edit rules, budget ceiling, plan-first instruction and deliverables.",
      "explanation": "This step helps you lock the message and six timed stages. The brief has all ten sections and each stage has a start, event and end state. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "production-bible.md"
      ],
      "expected_result": "The brief has all ten sections and each stage has a start, event and end state.",
      "resources": [
        "production-bible.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Lock the message and six timed stages",
        "success_condition": "The brief has all ten sections and each stage has a start, event and end state.",
        "how_to_verify": "Record the observed result for Lock the message and six timed stages. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: production-bible.md.",
        "criteria": [
          "The brief has all ten sections and each stage has a start, event and end state.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "production-bible.md"
        ],
        "user_visible_success_message": "Evidence saved. The brief has all ten sections and each stage has a start, event and end state.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Lock the message and six timed stages?",
          "fix": "For Lock the message and six timed stages: Edit production-bible.md for an original 60-second explainer. Include locked title/message, fictional host, wardrobe, voice in words, film look, six timed stages, research rules, sound/edit rules, budget ceiling, plan-first instruction and deliverables. Compare the actual output to The brief has all ten sections and each stage has a start, event and end state.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "The brief has all ten sections and each stage has a start, event and end state."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use production-bible.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to lock the message and six timed stages. The brief has all ten sections and each stage has a start, event and end state.",
        "demo": "Edit production-bible.md for an original 60-second explainer. Include locked title/message, fictional host, wardrobe, voice in words, film look, six timed stages, research rules, sound/edit rules, budget ceiling, plan-first instruction and deliverables.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Lock the message and six timed stages, compare your own result with: The brief has all ten sections and each stage has a start, event and end state.. Edit production-bible.md for an original 60-second explainer. Include locked title/message, fictional host, wardrobe, voice in words, film look, six timed stages, research rules, sound/edit rules, budget ceiling, plan-first instruction and deliverables."
      },
      "video": {
        "purpose": "Demonstrate lock the message and six timed stages",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The brief becomes a testable contract for production, not a vague request to make something impressive. Paid generation is optional and is not a pass requirement. Edit production-bible.md for an original 60-second explainer. Include locked title/message, fictional host, wardrobe, voice in words, film look, six timed stages, research rules, sound/edit rules, budget ceiling, plan-first instruction and deliverables.",
        "on_screen_text": [
          "Lock the message and six timed stages",
          "The brief has all ten sections and each stage has a start, event and end state."
        ],
        "screen_recording_instructions": [
          "Edit production-bible.md for an original 60-second explainer. Include locked title/message, fictional host, wardrobe, voice in words, film look, six timed stages, research rules, sound/edit rules, budget ceiling, plan-first instruction and deliverables.",
          "The brief has all ten sections and each stage has a start, event and end state."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "The brief has all ten sections and each stage has a start, event and end state."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The brief becomes a testable contract for production, not a vague request to make something impressive. Paid generation is optional and is not a pass requirement.",
          "Edit production-bible.md for an original 60-second explainer. Include locked title/message, fictional host, wardrobe, voice in words, film look, six timed stages, research rules, sound/edit rules, budget ceiling, plan-first instruction and deliverables.",
          "The brief has all ten sections and each stage has a start, event and end state."
        ]
      },
      "step_id": "L02-S02",
      "lesson_id": "L02"
    },
    {
      "title": "Write voice and shot prompts",
      "purpose": "This step helps you write voice and shot prompts. The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
      "user_action": "Write a voice description in words: register, accent, pace, articulation and behavior. Fill shot-template.md for one shot, restating face/voice attachment roles, wardrobe/look, eyes to lens and no visible crew/camera. Use a fictional presenter; do not imitate a real person without consent.",
      "explanation": "This step helps you write voice and shot prompts. The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "shot-template.md",
        "production-bible.md"
      ],
      "expected_result": "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
      "resources": [
        "shot-template.md",
        "production-bible.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Write voice and shot prompts",
        "success_condition": "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
        "how_to_verify": "Record the observed result for Write voice and shot prompts. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: shot-template.md.",
        "criteria": [
          "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "shot-template.md"
        ],
        "user_visible_success_message": "Evidence saved. The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Write voice and shot prompts?",
          "fix": "For Write voice and shot prompts: Write a voice description in words: register, accent, pace, articulation and behavior. Fill shot-template.md for one shot, restating face/voice attachment roles, wardrobe/look, eyes to lens and no visible crew/camera. Use a fictional presenter; do not imitate a real person without consent. Compare the actual output to The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use shot-template.md, production-bible.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to write voice and shot prompts. The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.",
        "demo": "Write a voice description in words: register, accent, pace, articulation and behavior. Fill shot-template.md for one shot, restating face/voice attachment roles, wardrobe/look, eyes to lens and no visible crew/camera. Use a fictional presenter; do not imitate a real person without consent.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Write voice and shot prompts, compare your own result with: The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words.. Write a voice description in words: register, accent, pace, articulation and behavior. Fill shot-template.md for one shot, restating face/voice attachment roles, wardrobe/look, eyes to lens and no visible crew/camera. Use a fictional presenter; do not imitate a real person without consent."
      },
      "video": {
        "purpose": "Demonstrate write voice and shot prompts",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Alex’s reported tool chain used Nano Banana for the 4K face, Seed Audio 1.0 for a designed voice sample and Seedance 2.5 at 1080p. Filenames/text alone are not real reference attachments. Write a voice description in words: register, accent, pace, articulation and behavior. Fill shot-template.md for one shot, restating face/voice attachment roles, wardrobe/look, eyes to lens and no visible crew/camera. Use a fictional presenter; do not imitate a real person without consent.",
        "on_screen_text": [
          "Write voice and shot prompts",
          "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words."
        ],
        "screen_recording_instructions": [
          "Write a voice description in words: register, accent, pace, articulation and behavior. Fill shot-template.md for one shot, restating face/voice attachment roles, wardrobe/look, eyes to lens and no visible crew/camera. Use a fictional presenter; do not imitate a real person without consent.",
          "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Alex’s reported tool chain used Nano Banana for the 4K face, Seed Audio 1.0 for a designed voice sample and Seedance 2.5 at 1080p. Filenames/text alone are not real reference attachments.",
          "Write a voice description in words: register, accent, pace, articulation and behavior. Fill shot-template.md for one shot, restating face/voice attachment roles, wardrobe/look, eyes to lens and no visible crew/camera. Use a fictional presenter; do not imitate a real person without consent.",
          "The prompt names actual reference attachment roles and consistent presenter rules; the voice is described in words."
        ]
      },
      "step_id": "L03-S01",
      "lesson_id": "L03"
    },
    {
      "title": "Source every on-screen number",
      "purpose": "This step helps you source every on-screen number. Every number planned for the screen maps to a reviewed claim ID and source URL.",
      "user_action": "Replace the sample claims.csv with your own claim rows. Add publisher, URL, checked date, exact supporting evidence, uncertainty and approved status. Reject unsupported expert quotes or generated imagery presented as archival evidence.",
      "explanation": "This step helps you source every on-screen number. Every number planned for the screen maps to a reviewed claim ID and source URL. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "claims.csv",
        "shot-template.md"
      ],
      "expected_result": "Every number planned for the screen maps to a reviewed claim ID and source URL.",
      "resources": [
        "claims.csv",
        "shot-template.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Source every on-screen number",
        "success_condition": "Every number planned for the screen maps to a reviewed claim ID and source URL.",
        "how_to_verify": "Record the observed result for Source every on-screen number. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: claims.csv.",
        "criteria": [
          "Every number planned for the screen maps to a reviewed claim ID and source URL.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "claims.csv"
        ],
        "user_visible_success_message": "Evidence saved. Every number planned for the screen maps to a reviewed claim ID and source URL.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Source every on-screen number?",
          "fix": "For Source every on-screen number: Replace the sample claims.csv with your own claim rows. Add publisher, URL, checked date, exact supporting evidence, uncertainty and approved status. Reject unsupported expert quotes or generated imagery presented as archival evidence. Compare the actual output to Every number planned for the screen maps to a reviewed claim ID and source URL.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "Every number planned for the screen maps to a reviewed claim ID and source URL."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use claims.csv, shot-template.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to source every on-screen number. Every number planned for the screen maps to a reviewed claim ID and source URL.",
        "demo": "Replace the sample claims.csv with your own claim rows. Add publisher, URL, checked date, exact supporting evidence, uncertainty and approved status. Reject unsupported expert quotes or generated imagery presented as archival evidence.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Source every on-screen number, compare your own result with: Every number planned for the screen maps to a reviewed claim ID and source URL.. Replace the sample claims.csv with your own claim rows. Add publisher, URL, checked date, exact supporting evidence, uncertainty and approved status. Reject unsupported expert quotes or generated imagery presented as archival evidence."
      },
      "video": {
        "purpose": "Demonstrate source every on-screen number",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The case study reported 28 sources, 15 official. That describes its research effort; it does not independently verify every documentary claim. A diagram explains, rather than proves, a real underground survey. Replace the sample claims.csv with your own claim rows. Add publisher, URL, checked date, exact supporting evidence, uncertainty and approved status. Reject unsupported expert quotes or generated imagery presented as archival evidence.",
        "on_screen_text": [
          "Source every on-screen number",
          "Every number planned for the screen maps to a reviewed claim ID and source URL."
        ],
        "screen_recording_instructions": [
          "Replace the sample claims.csv with your own claim rows. Add publisher, URL, checked date, exact supporting evidence, uncertainty and approved status. Reject unsupported expert quotes or generated imagery presented as archival evidence.",
          "Every number planned for the screen maps to a reviewed claim ID and source URL."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "Every number planned for the screen maps to a reviewed claim ID and source URL."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The case study reported 28 sources, 15 official. That describes its research effort; it does not independently verify every documentary claim. A diagram explains, rather than proves, a real underground survey.",
          "Replace the sample claims.csv with your own claim rows. Add publisher, URL, checked date, exact supporting evidence, uncertainty and approved status. Reject unsupported expert quotes or generated imagery presented as archival evidence.",
          "Every number planned for the screen maps to a reviewed claim ID and source URL."
        ]
      },
      "step_id": "L04-S01",
      "lesson_id": "L04"
    },
    {
      "title": "Calculate a retake reserve",
      "purpose": "This step helps you calculate a retake reserve. BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
      "user_action": "Run budget.py with a base 1000 credits, 22% share of total for retakes and a 1500 ceiling. Compare base/(1-share) with base*1.22; the share-of-total wording changes the calculation. Record actual provider prices only if you later choose paid generation. Optional currency estimate: add --rate 0.10 --currency USD only as a fictional arithmetic example (128.21 USD total, 28.21 USD reserve). For a real estimate replace 0.10 with your dated observed currency-per-credit price. No provider tier is assumed.",
      "explanation": "This step helps you calculate a retake reserve. BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "command",
      "commands": {
        "windows": "python budget.py --base 1000 --retake-share 0.22 --ceiling 1500",
        "macos": "python3 budget.py --base 1000 --retake-share 0.22 --ceiling 1500",
        "linux": "python3 budget.py --base 1000 --retake-share 0.22 --ceiling 1500"
      },
      "command_type": "shell",
      "required_inputs": [
        "budget.py"
      ],
      "expected_result": "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
      "resources": [
        "budget.py"
      ],
      "checkpoint": {
        "what_is_being_checked": "Calculate a retake reserve",
        "success_condition": "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
        "how_to_verify": "Record the observed result for Calculate a retake reserve. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "BUDGET PASS",
          "1282.05"
        ],
        "user_visible_success_message": "Evidence saved. BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Calculate a retake reserve?",
          "fix": "For Calculate a retake reserve: Run budget.py with a base 1000 credits, 22% share of total for retakes and a 1500 ceiling. Compare base/(1-share) with base*1.22; the share-of-total wording changes the calculation. Record actual provider prices only if you later choose paid generation. Optional currency estimate: add --rate 0.10 --currency USD only as a fictional arithmetic example (128.21 USD total, 28.21 USD reserve). For a real estimate replace 0.10 with your dated observed currency-per-credit price. No provider tier is assumed. Compare the actual output to BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use budget.py."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to calculate a retake reserve. BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.",
        "demo": "Run budget.py with a base 1000 credits, 22% share of total for retakes and a 1500 ceiling. Compare base/(1-share) with base*1.22; the share-of-total wording changes the calculation. Record actual provider prices only if you later choose paid generation. Optional currency estimate: add --rate 0.10 --currency USD only as a fictional arithmetic example (128.21 USD total, 28.21 USD reserve). For a real estimate replace 0.10 with your dated observed currency-per-credit price. No provider tier is assumed.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Calculate a retake reserve, compare your own result with: BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example.. Run budget.py with a base 1000 credits, 22% share of total for retakes and a 1500 ceiling. Compare base/(1-share) with base*1.22; the share-of-total wording changes the calculation. Record actual provider prices only if you later choose paid generation. Optional currency estimate: add --rate 0.10 --currency USD only as a fictional arithmetic example (128.21 USD total, 28.21 USD reserve). For a real estimate replace 0.10 with your dated observed currency-per-credit price. No provider tier is assumed."
      },
      "video": {
        "purpose": "Demonstrate calculate a retake reserve",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The source reported roughly $350–650 of Higgsfield credits and about $123 of Claude usage at API rates, roughly $60–100 per finished minute. These are historical reported estimates, not a current offer or required spend. Run budget.py with a base 1000 credits, 22% share of total for retakes and a 1500 ceiling. Compare base/(1-share) with base*1.22; the share-of-total wording changes the calculation. Record actual provider prices only if you later choose paid generation. Optional currency estimate: add --rate 0.10 --currency USD only as a fictional arithmetic example (128.21 USD total, 28.21 USD reserve). For a real estimate replace 0.10 with your dated observed currency-per-credit price. No provider tier is assumed.",
        "on_screen_text": [
          "Calculate a retake reserve",
          "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example."
        ],
        "screen_recording_instructions": [
          "Run budget.py with a base 1000 credits, 22% share of total for retakes and a 1500 ceiling. Compare base/(1-share) with base*1.22; the share-of-total wording changes the calculation. Record actual provider prices only if you later choose paid generation. Optional currency estimate: add --rate 0.10 --currency USD only as a fictional arithmetic example (128.21 USD total, 28.21 USD reserve). For a real estimate replace 0.10 with your dated observed currency-per-credit price. No provider tier is assumed.",
          "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The source reported roughly $350–650 of Higgsfield credits and about $123 of Claude usage at API rates, roughly $60–100 per finished minute. These are historical reported estimates, not a current offer or required spend.",
          "Run budget.py with a base 1000 credits, 22% share of total for retakes and a 1500 ceiling. Compare base/(1-share) with base*1.22; the share-of-total wording changes the calculation. Record actual provider prices only if you later choose paid generation. Optional currency estimate: add --rate 0.10 --currency USD only as a fictional arithmetic example (128.21 USD total, 28.21 USD reserve). For a real estimate replace 0.10 with your dated observed currency-per-credit price. No provider tier is assumed.",
          "BUDGET PASS reports total 1282.05 and retake reserve 282.05 for this planning example."
        ]
      },
      "step_id": "L05-S01",
      "lesson_id": "L05"
    },
    {
      "title": "Test pause trimming and plan J-cuts",
      "purpose": "This step helps you test pause trimming and plan J-cuts. PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
      "user_action": "Run pause_rules.py. In your shot plan mark pauses after ellipses (>0.95 → 0.72s), sentence ends (>0.78 → 0.48s) and elsewhere (>0.64 → 0.34s). Place dialogue audio 0.34s before picture changes and cutaway sound 0.3s before its picture. Hide jump cuts with meaningful graphics/cutaways/punch-ins.",
      "explanation": "This step helps you test pause trimming and plan J-cuts. PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "command",
      "commands": {
        "windows": "python pause_rules.py",
        "macos": "python3 pause_rules.py",
        "linux": "python3 pause_rules.py"
      },
      "command_type": "shell",
      "required_inputs": [
        "pause_rules.py",
        "shot-template.md"
      ],
      "expected_result": "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
      "resources": [
        "pause_rules.py",
        "shot-template.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Test pause trimming and plan J-cuts",
        "success_condition": "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
        "how_to_verify": "Record the observed result for Test pause trimming and plan J-cuts. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "PAUSE PASS"
        ],
        "user_visible_success_message": "Evidence saved. PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Test pause trimming and plan J-cuts?",
          "fix": "For Test pause trimming and plan J-cuts: Run pause_rules.py. In your shot plan mark pauses after ellipses (>0.95 → 0.72s), sentence ends (>0.78 → 0.48s) and elsewhere (>0.64 → 0.34s). Place dialogue audio 0.34s before picture changes and cutaway sound 0.3s before its picture. Hide jump cuts with meaningful graphics/cutaways/punch-ins. Compare the actual output to PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use pause_rules.py, shot-template.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to test pause trimming and plan J-cuts. PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.",
        "demo": "Run pause_rules.py. In your shot plan mark pauses after ellipses (>0.95 → 0.72s), sentence ends (>0.78 → 0.48s) and elsewhere (>0.64 → 0.34s). Place dialogue audio 0.34s before picture changes and cutaway sound 0.3s before its picture. Hide jump cuts with meaningful graphics/cutaways/punch-ins.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Test pause trimming and plan J-cuts, compare your own result with: PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices.. Run pause_rules.py. In your shot plan mark pauses after ellipses (>0.95 → 0.72s), sentence ends (>0.78 → 0.48s) and elsewhere (>0.64 → 0.34s). Place dialogue audio 0.34s before picture changes and cutaway sound 0.3s before its picture. Hide jump cuts with meaningful graphics/cutaways/punch-ins."
      },
      "video": {
        "purpose": "Demonstrate test pause trimming and plan j-cuts",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The source reported 61 pauses cut, 34.2 seconds total, with 28 punch-ins, 19 graphics, 10 punch-outs and 4 cutaways. These are its edit decisions; preserve meaning and real action in your own film. Run pause_rules.py. In your shot plan mark pauses after ellipses (>0.95 → 0.72s), sentence ends (>0.78 → 0.48s) and elsewhere (>0.64 → 0.34s). Place dialogue audio 0.34s before picture changes and cutaway sound 0.3s before its picture. Hide jump cuts with meaningful graphics/cutaways/punch-ins.",
        "on_screen_text": [
          "Test pause trimming and plan J-cuts",
          "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices."
        ],
        "screen_recording_instructions": [
          "Run pause_rules.py. In your shot plan mark pauses after ellipses (>0.95 → 0.72s), sentence ends (>0.78 → 0.48s) and elsewhere (>0.64 → 0.34s). Place dialogue audio 0.34s before picture changes and cutaway sound 0.3s before its picture. Hide jump cuts with meaningful graphics/cutaways/punch-ins.",
          "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The source reported 61 pauses cut, 34.2 seconds total, with 28 punch-ins, 19 graphics, 10 punch-outs and 4 cutaways. These are its edit decisions; preserve meaning and real action in your own film.",
          "Run pause_rules.py. In your shot plan mark pauses after ellipses (>0.95 → 0.72s), sentence ends (>0.78 → 0.48s) and elsewhere (>0.64 → 0.34s). Place dialogue audio 0.34s before picture changes and cutaway sound 0.3s before its picture. Hide jump cuts with meaningful graphics/cutaways/punch-ins.",
          "PAUSE PASS confirms all three rules and preserves a short pause; the shot plan includes J-cut and cover choices."
        ]
      },
      "step_id": "L06-S01",
      "lesson_id": "L06"
    },
    {
      "title": "Create a diagram and mix sheet",
      "purpose": "This step helps you create a diagram and mix sheet. One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
      "user_action": "Sketch one explanatory diagram as editable SVG or slide shapes, referencing a claim ID. Write the source mix targets: dialogue -20 LUFS; music -35 under speech, -25 between lines, -23 under takeaway; featured SFX -26; ambience -32; master -15 LUFS, ceiling -1.5 dBTP. Do not confuse LUFS with a fixed fader gain.",
      "explanation": "This step helps you create a diagram and mix sheet. One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "production-bible.md"
      ],
      "expected_result": "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
      "resources": [
        "production-bible.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Create a diagram and mix sheet",
        "success_condition": "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
        "how_to_verify": "Record the observed result for Create a diagram and mix sheet. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: diagram, LUFS.",
        "criteria": [
          "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "diagram",
          "LUFS"
        ],
        "user_visible_success_message": "Evidence saved. One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Create a diagram and mix sheet?",
          "fix": "For Create a diagram and mix sheet: Sketch one explanatory diagram as editable SVG or slide shapes, referencing a claim ID. Write the source mix targets: dialogue -20 LUFS; music -35 under speech, -25 between lines, -23 under takeaway; featured SFX -26; ambience -32; master -15 LUFS, ceiling -1.5 dBTP. Do not confuse LUFS with a fixed fader gain. Compare the actual output to One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use production-bible.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to create a diagram and mix sheet. One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.",
        "demo": "Sketch one explanatory diagram as editable SVG or slide shapes, referencing a claim ID. Write the source mix targets: dialogue -20 LUFS; music -35 under speech, -25 between lines, -23 under takeaway; featured SFX -26; ambience -32; master -15 LUFS, ceiling -1.5 dBTP. Do not confuse LUFS with a fixed fader gain.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Create a diagram and mix sheet, compare your own result with: One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target.. Sketch one explanatory diagram as editable SVG or slide shapes, referencing a claim ID. Write the source mix targets: dialogue -20 LUFS; music -35 under speech, -25 between lines, -23 under takeaway; featured SFX -26; ambience -32; master -15 LUFS, ceiling -1.5 dBTP. Do not confuse LUFS with a fixed fader gain."
      },
      "video": {
        "purpose": "Demonstrate create a diagram and mix sheet",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Alex reported six editable diagrams through Tesseract by Mirage plus JavaScript, and six ElevenLabs Music cues via Arcads totaling 152 credits. This practice uses free editable artwork and generated test audio. Sketch one explanatory diagram as editable SVG or slide shapes, referencing a claim ID. Write the source mix targets: dialogue -20 LUFS; music -35 under speech, -25 between lines, -23 under takeaway; featured SFX -26; ambience -32; master -15 LUFS, ceiling -1.5 dBTP. Do not confuse LUFS with a fixed fader gain.",
        "on_screen_text": [
          "Create a diagram and mix sheet",
          "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target."
        ],
        "screen_recording_instructions": [
          "Sketch one explanatory diagram as editable SVG or slide shapes, referencing a claim ID. Write the source mix targets: dialogue -20 LUFS; music -35 under speech, -25 between lines, -23 under takeaway; featured SFX -26; ambience -32; master -15 LUFS, ceiling -1.5 dBTP. Do not confuse LUFS with a fixed fader gain.",
          "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Alex reported six editable diagrams through Tesseract by Mirage plus JavaScript, and six ElevenLabs Music cues via Arcads totaling 152 credits. This practice uses free editable artwork and generated test audio.",
          "Sketch one explanatory diagram as editable SVG or slide shapes, referencing a claim ID. Write the source mix targets: dialogue -20 LUFS; music -35 under speech, -25 between lines, -23 under takeaway; featured SFX -26; ambience -32; master -15 LUFS, ceiling -1.5 dBTP. Do not confuse LUFS with a fixed fader gain.",
          "One editable diagram is sourced/labeled and the mix sheet distinguishes track loudness from the master target."
        ]
      },
      "step_id": "L07-S01",
      "lesson_id": "L07"
    },
    {
      "title": "Create and measure the practice clip",
      "purpose": "This step helps you create and measure the practice clip. before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
      "user_action": "Install FFmpeg from its official distribution/package manager if needed and confirm ffmpeg -version. Run the card to make a real moving test-pattern clip with a sine-wave audio track. Then run doc_qc.py. This is a measurement exercise, not generated documentary footage.",
      "explanation": "This step helps you create and measure the practice clip. before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "command",
      "commands": {
        "windows": "ffmpeg -hide_banner -f lavfi -i testsrc2=size=640x360:rate=25 -f lavfi -i sine=frequency=440:sample_rate=48000 -t 5 -c:v libx264 -c:a aac practice-take.mp4\npython doc_qc.py practice-take.mp4 --out before-qc.json",
        "macos": "ffmpeg -hide_banner -f lavfi -i testsrc2=size=640x360:rate=25 -f lavfi -i sine=frequency=440:sample_rate=48000 -t 5 -c:v libx264 -c:a aac practice-take.mp4\npython3 doc_qc.py practice-take.mp4 --out before-qc.json",
        "linux": "ffmpeg -hide_banner -f lavfi -i testsrc2=size=640x360:rate=25 -f lavfi -i sine=frequency=440:sample_rate=48000 -t 5 -c:v libx264 -c:a aac practice-take.mp4\npython3 doc_qc.py practice-take.mp4 --out before-qc.json"
      },
      "command_type": "shell",
      "required_inputs": [
        "doc_qc.py"
      ],
      "expected_result": "before-before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
      "resources": [
        "doc_qc.py"
      ],
      "checkpoint": {
        "what_is_being_checked": "Create and measure the practice clip",
        "success_condition": "before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
        "how_to_verify": "Record the observed result for Create and measure the practice clip. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: QC REVIEW, before-qc.json.",
        "criteria": [
          "before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "QC REVIEW",
          "before-qc.json"
        ],
        "user_visible_success_message": "Evidence saved. before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "FFmpeg is missing or QC cannot find audio",
          "likely_cause": "The executable may not be on PATH, or the clip has no audio stream.",
          "diagnostic_question": "What exact result did you observe during Create and measure the practice clip?",
          "fix": "For Create and measure the practice clip: Install FFmpeg from its official distribution/package manager if needed and confirm ffmpeg -version. Run the card to make a real moving test-pattern clip with a sine-wave audio track. Then run doc_qc.py. This is a measurement exercise, not generated documentary footage. Compare the actual output to before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
          "alternative_fix": "Use your own non-secret video with an audio track; preserve the measured failure as before-QC evidence.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Install FFmpeg, reopen the terminal and run the supplied two-input test clip command. Use a fresh output filename if one already exists."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "before-before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use doc_qc.py."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to create and measure the practice clip. before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.",
        "demo": "Install FFmpeg from its official distribution/package manager if needed and confirm ffmpeg -version. Run the card to make a real moving test-pattern clip with a sine-wave audio track. Then run doc_qc.py. This is a measurement exercise, not generated documentary footage.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Install FFmpeg, reopen the terminal and run the supplied two-input test clip command. Use a fresh output filename if one already exists.",
        "help": "For Create and measure the practice clip, compare your own result with: before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip.. Install FFmpeg from its official distribution/package manager if needed and confirm ffmpeg -version. Run the card to make a real moving test-pattern clip with a sine-wave audio track. Then run doc_qc.py. This is a measurement exercise, not generated documentary footage."
      },
      "video": {
        "purpose": "Demonstrate create and measure the practice clip",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "QC can flag silence/freezes but cannot determine whether a hold is intentional. Human continuity and word checks remain necessary. Install FFmpeg from its official distribution/package manager if needed and confirm ffmpeg -version. Run the card to make a real moving test-pattern clip with a sine-wave audio track. Then run doc_qc.py. This is a measurement exercise, not generated documentary footage.",
        "on_screen_text": [
          "Create and measure the practice clip",
          "before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip."
        ],
        "screen_recording_instructions": [
          "Install FFmpeg from its official distribution/package manager if needed and confirm ffmpeg -version. Run the card to make a real moving test-pattern clip with a sine-wave audio track. Then run doc_qc.py. This is a measurement exercise, not generated documentary footage.",
          "before-before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "QC can flag silence/freezes but cannot determine whether a hold is intentional. Human continuity and word checks remain necessary.",
          "Install FFmpeg from its official distribution/package manager if needed and confirm ffmpeg -version. Run the card to make a real moving test-pattern clip with a sine-wave audio track. Then run doc_qc.py. This is a measurement exercise, not generated documentary footage.",
          "before-qc.json contains measured input_lufs, true_peak_dbtp and silence/freeze events from the real clip."
        ]
      },
      "step_id": "L08-S01",
      "lesson_id": "L08"
    },
    {
      "title": "Normalize, remeasure and review",
      "purpose": "This step helps you normalize, remeasure and review. QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
      "user_action": "Normalize the practice clip toward -15 LUFS with a -2 dBTP headroom target. Run QC on the output and open both clips. Also test a intentionally still/quiet clip if available and inspect flagged intervals; silence is not automatically wrong.",
      "explanation": "This step helps you normalize, remeasure and review. QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags. Treat this as local practice until you have actual source and execution evidence. The loudnorm TP=-2 option is headroom for the filter, not a promise that every output peaks at exactly -2. QC uses the mix sheet ceiling of -1.5 dBTP; a quieter peak is valid.",
      "estimated_time": "5–10 min",
      "action_type": "command",
      "commands": {
        "windows": "ffmpeg -hide_banner -i practice-take.mp4 -af loudnorm=I=-15:TP=-2:LRA=11 -c:v copy -c:a aac practice-fixed.mp4\npython doc_qc.py practice-fixed.mp4 --out after-qc.json",
        "macos": "ffmpeg -hide_banner -i practice-take.mp4 -af loudnorm=I=-15:TP=-2:LRA=11 -c:v copy -c:a aac practice-fixed.mp4\npython3 doc_qc.py practice-fixed.mp4 --out after-qc.json",
        "linux": "ffmpeg -hide_banner -i practice-take.mp4 -af loudnorm=I=-15:TP=-2:LRA=11 -c:v copy -c:a aac practice-fixed.mp4\npython3 doc_qc.py practice-fixed.mp4 --out after-qc.json"
      },
      "command_type": "shell",
      "required_inputs": [
        "doc_qc.py"
      ],
      "expected_result": "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
      "resources": [
        "doc_qc.py"
      ],
      "checkpoint": {
        "what_is_being_checked": "Normalize, remeasure and review",
        "success_condition": "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
        "how_to_verify": "Record the observed result for Normalize, remeasure and review. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "QC PASS"
        ],
        "user_visible_success_message": "Evidence saved. QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Normalize, remeasure and review?",
          "fix": "For Normalize, remeasure and review: Normalize the practice clip toward -15 LUFS with a -2 dBTP headroom target. Run QC on the output and open both clips. Also test a intentionally still/quiet clip if available and inspect flagged intervals; silence is not automatically wrong. Compare the actual output to QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use doc_qc.py."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to normalize, remeasure and review. QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.",
        "demo": "Normalize the practice clip toward -15 LUFS with a -2 dBTP headroom target. Run QC on the output and open both clips. Also test a intentionally still/quiet clip if available and inspect flagged intervals; silence is not automatically wrong.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Normalize, remeasure and review, compare your own result with: QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags.. Normalize the practice clip toward -15 LUFS with a -2 dBTP headroom target. Run QC on the output and open both clips. Also test a intentionally still/quiet clip if available and inspect flagged intervals; silence is not automatically wrong."
      },
      "video": {
        "purpose": "Demonstrate normalize, remeasure and review",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The locally archived social copy measured -15.2 LUFS but -1.3 dBTP, above the source ceiling; re-encoding is a plausible explanation. Extra master headroom is prudent, and measuring the final encode is the check. Normalize the practice clip toward -15 LUFS with a -2 dBTP headroom target. Run QC on the output and open both clips. Also test a intentionally still/quiet clip if available and inspect flagged intervals; silence is not automatically wrong.",
        "on_screen_text": [
          "Normalize, remeasure and review",
          "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags."
        ],
        "screen_recording_instructions": [
          "Normalize the practice clip toward -15 LUFS with a -2 dBTP headroom target. Run QC on the output and open both clips. Also test a intentionally still/quiet clip if available and inspect flagged intervals; silence is not automatically wrong.",
          "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The locally archived social copy measured -15.2 LUFS but -1.3 dBTP, above the source ceiling; re-encoding is a plausible explanation. Extra master headroom is prudent, and measuring the final encode is the check.",
          "Normalize the practice clip toward -15 LUFS with a -2 dBTP headroom target. Run QC on the output and open both clips. Also test a intentionally still/quiet clip if available and inspect flagged intervals; silence is not automatically wrong.",
          "QC PASS reports a measured master within -16 to -14 LUFS and true peak <= -1.5 dBTP; human review explains any flags."
        ]
      },
      "step_id": "L09-S01",
      "lesson_id": "L09"
    },
    {
      "title": "Request planning without spending",
      "purpose": "This step helps you request planning without spending. The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
      "user_action": "Give your signed-in agent the original brief, fact ledger, shot plan, budget calculation and QC evidence. Ask for a production plan and credit estimate only. Require face/word checks for any later real takes, disclosure of AI host/voice/locations and approval before generation. Do not submit paid jobs.",
      "explanation": "This step helps you request planning without spending. The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "create",
      "commands": {
        "all": "Read my production bible and source ledger. Return a shot plan, continuity/word/QC checklist and credit estimate with retake reserve. Do not call paid generation tools or spend credits. Identify missing evidence and wait for separate production approval."
      },
      "command_type": "prompt",
      "required_inputs": [
        "production-bible.md",
        "claims.csv",
        "shot-template.md"
      ],
      "expected_result": "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
      "resources": [
        "production-bible.md",
        "claims.csv",
        "shot-template.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Request planning without spending",
        "success_condition": "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
        "how_to_verify": "Record the observed result for Request planning without spending. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth. Include these observed evidence labels: plan, no paid.",
        "criteria": [
          "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "plan",
          "no paid"
        ],
        "user_visible_success_message": "Evidence saved. The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Request planning without spending?",
          "fix": "For Request planning without spending: Give your signed-in agent the original brief, fact ledger, shot plan, budget calculation and QC evidence. Ask for a production plan and credit estimate only. Require face/word checks for any later real takes, disclosure of AI host/voice/locations and approval before generation. Do not submit paid jobs. Compare the actual output to The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use production-bible.md, claims.csv, shot-template.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to request planning without spending. The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.",
        "demo": "Give your signed-in agent the original brief, fact ledger, shot plan, budget calculation and QC evidence. Ask for a production plan and credit estimate only. Require face/word checks for any later real takes, disclosure of AI host/voice/locations and approval before generation. Do not submit paid jobs.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Request planning without spending, compare your own result with: The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved.. Give your signed-in agent the original brief, fact ledger, shot plan, budget calculation and QC evidence. Ask for a production plan and credit estimate only. Require face/word checks for any later real takes, disclosure of AI host/voice/locations and approval before generation. Do not submit paid jobs."
      },
      "video": {
        "purpose": "Demonstrate request planning without spending",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Whisper was the case study’s word check, but a script/audio comparison still needs review of tool errors. A sourced plan and measured free exercise are the course deliverables; a paid eight-minute film is an optional later project. Give your signed-in agent the original brief, fact ledger, shot plan, budget calculation and QC evidence. Ask for a production plan and credit estimate only. Require face/word checks for any later real takes, disclosure of AI host/voice/locations and approval before generation. Do not submit paid jobs.",
        "on_screen_text": [
          "Request planning without spending",
          "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved."
        ],
        "screen_recording_instructions": [
          "Give your signed-in agent the original brief, fact ledger, shot plan, budget calculation and QC evidence. Ask for a production plan and credit estimate only. Require face/word checks for any later real takes, disclosure of AI host/voice/locations and approval before generation. Do not submit paid jobs.",
          "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Whisper was the case study’s word check, but a script/audio comparison still needs review of tool errors. A sourced plan and measured free exercise are the course deliverables; a paid eight-minute film is an optional later project.",
          "Give your signed-in agent the original brief, fact ledger, shot plan, budget calculation and QC evidence. Ask for a production plan and credit estimate only. Require face/word checks for any later real takes, disclosure of AI host/voice/locations and approval before generation. Do not submit paid jobs.",
          "The agent returns a bounded plan/estimate, all numbers have sources, and the free QC before/after receipts are saved."
        ]
      },
      "step_id": "L10-S01",
      "lesson_id": "L10"
    },
    {
      "title": "Write a repeatable onboarding checklist",
      "purpose": "This step helps you write a repeatable onboarding checklist. The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
      "user_action": "Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project.",
      "explanation": "This step helps you write a repeatable onboarding checklist. The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "15–25 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "onboarding-checklist.md"
      ],
      "expected_result": "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
      "resources": [
        "onboarding-checklist.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Write a repeatable onboarding checklist",
        "success_condition": "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
        "how_to_verify": "Record the observed result for Write a repeatable onboarding checklist. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Write a repeatable onboarding checklist?",
          "fix": "For Write a repeatable onboarding checklist: Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project. Compare the actual output to The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use onboarding-checklist.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to write a repeatable onboarding checklist. The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
        "demo": "Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Write a repeatable onboarding checklist, compare your own result with: The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.. Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project."
      },
      "video": {
        "purpose": "Demonstrate write a repeatable onboarding checklist",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The September 23 BuildBotsBetter profile wipe removed Desktop, Documents and hidden agent memory together. Repeatable onboarding protects the knowledge needed to recover. Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project.",
        "on_screen_text": [
          "Write a repeatable onboarding checklist",
          "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification."
        ],
        "screen_recording_instructions": [
          "Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project.",
          "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The September 23 BuildBotsBetter profile wipe removed Desktop, Documents and hidden agent memory together. Repeatable onboarding protects the knowledge needed to recover.",
          "Fill in onboarding-checklist.md for your agent. Record AGENTS.md, the tool’s user settings and memory folder, the assigned workspace, permissions, guard location, backup schedule, and a final proof task. Keep the checklist in your project.",
          "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification."
        ]
      },
      "step_id": "L11-S01",
      "lesson_id": "L11"
    },
    {
      "title": "Demonstrate the variable-path limit safely",
      "purpose": "This step helps you demonstrate the variable-path limit safely. GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
      "user_action": "Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text.",
      "explanation": "This step helps you demonstrate the variable-path limit safely. GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "command",
      "commands": {
        "windows": "python workspace_guard.py --self-test",
        "macos": "python3 workspace_guard.py --self-test",
        "linux": "python3 workspace_guard.py --self-test"
      },
      "command_type": "shell",
      "required_inputs": [
        "workspace_guard.py"
      ],
      "expected_result": "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
      "resources": [
        "workspace_guard.py"
      ],
      "checkpoint": {
        "what_is_being_checked": "Demonstrate the variable-path limit safely",
        "success_condition": "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
        "how_to_verify": "Record the observed result for Demonstrate the variable-path limit safely. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "GUARD PASS"
        ],
        "user_visible_success_message": "Evidence saved. GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Demonstrate the variable-path limit safely?",
          "fix": "For Demonstrate the variable-path limit safely: Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text. Compare the actual output to GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use workspace_guard.py."
        }
      ],
      "quiz": {
        "question": "Does a command-text hook guarantee safety for a path computed inside a script?",
        "answer_type": "single_choice",
        "choices": [
          "No; add enforcement at the resolved operation boundary and independent recovery.",
          "Yes, because the command looks harmless."
        ],
        "correct_answer": 0,
        "explanation": "The profile-wipe failure can involve a runtime variable whose value the text hook cannot see."
      },
      "coach": {
        "intro": "We are going to demonstrate the variable-path limit safely. GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
        "demo": "Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Demonstrate the variable-path limit safely, compare your own result with: GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.. Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text."
      },
      "video": {
        "purpose": "Demonstrate demonstrate the variable-path limit safely",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A command-text hook can miss a target computed inside a script or variable. This demonstrator checks resolved paths but is not an operating-system sandbox. For a real operation, enforce the resolved boundary at the operation itself; symlinks and races still require care. Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text.",
        "on_screen_text": [
          "Demonstrate the variable-path limit safely",
          "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed."
        ],
        "screen_recording_instructions": [
          "Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text.",
          "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A command-text hook can miss a target computed inside a script or variable. This demonstrator checks resolved paths but is not an operating-system sandbox. For a real operation, enforce the resolved boundary at the operation itself; symlinks and races still require care.",
          "Run workspace_guard.py --self-test. Read the source: the target is resolved before deciding. The variable_target case points at the home folder but performs no filesystem operation. Compare this with a hook that sees only command text.",
          "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed."
        ]
      },
      "step_id": "L11-S02",
      "lesson_id": "L11"
    },
    {
      "title": "Verify the actual protection in your tool",
      "purpose": "This step helps you verify the actual protection in your tool. A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.",
      "user_action": "For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; inspect workspace_guard.py from the resource pack; it is a demonstration, not an installed CLI hook. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. If you use a hosted agent, do not assume a local shell hook protects its remote computer: use project-only tasks and reviewed actions, with backups. If no agent is used in this course, record the demonstration only. A hook is active only after a real tool-specific refusal test; otherwise record NOT INSTALLED with the reason.",
      "explanation": "This step helps you verify the actual protection in your tool. A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "inspect",
      "commands": {
        "all": "",
        "windows": "python workspace_guard.py --self-test\npython workspace_guard.py --target \"$env:USERPROFILE\"",
        "macos": "python3 workspace_guard.py --self-test\npython3 workspace_guard.py --target \"$HOME\"",
        "linux": "python3 workspace_guard.py --self-test\npython3 workspace_guard.py --target \"$HOME\""
      },
      "command_type": "shell",
      "required_inputs": [
        "workspace_guard.py",
        "onboarding-checklist.md"
      ],
      "expected_result": "A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.",
      "resources": [
        "workspace_guard.py",
        "onboarding-checklist.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Verify the actual protection in your tool",
        "success_condition": "A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.",
        "how_to_verify": "Record the observed result for Verify the actual protection in your tool. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "The harmless command succeeds.",
          "The boundary dry-run denies a profile target.",
          "I recorded the tool’s active hook state, or explicitly recorded that this tool has no working local guard."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true,
        "tokens_any": [
          [
            "DENY"
          ],
          [
            "NOT INSTALLED"
          ]
        ]
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Verify the actual protection in your tool?",
          "fix": "For Verify the actual protection in your tool: For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; the BBB working reference is linked in Sources. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. Grok Bot has no proven local shell guard here: use project-only tasks and reviewed actions, with backups. Compare the actual output to A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use workspace_guard.py, onboarding-checklist.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to verify the actual protection in your tool. A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.",
        "demo": "For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; the BBB working reference is linked in Sources. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. Grok Bot has no proven local shell guard here: use project-only tasks and reviewed actions, with backups.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Verify the actual protection in your tool, compare your own result with: A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation.. For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; the BBB working reference is linked in Sources. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. Grok Bot has no proven local shell guard here: use project-only tasks and reviewed actions, with backups."
      },
      "video": {
        "purpose": "Demonstrate verify the actual protection in your tool",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A broken hook that blocks everything can look like protection. Some tools fail open when hooks fail. Codex hook changes need review/trust; Grok Build needs its own deny protocol; Antigravity uses a different JSON protocol. Never treat a prompt rule or an inactive hook as enforcement. For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; the BBB working reference is linked in Sources. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. Grok Bot has no proven local shell guard here: use project-only tasks and reviewed actions, with backups.",
        "on_screen_text": [
          "Verify the actual protection in your tool",
          "A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation."
        ],
        "screen_recording_instructions": [
          "For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; inspect workspace_guard.py from the resource pack; it is a demonstration, not an installed CLI hook. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. If you use a hosted agent, do not assume a local shell hook protects its remote computer: use project-only tasks and reviewed actions, with backups. If no agent is used in this course, record the demonstration only. A hook is active only after a real tool-specific refusal test; otherwise record NOT INSTALLED with the reason.",
          "A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A broken hook that blocks everything can look like protection. Some tools fail open when hooks fail. Codex hook changes need review/trust; Grok Build needs its own deny protocol; Antigravity uses a different JSON protocol. Never treat a prompt rule or an inactive hook as enforcement.",
          "For CLI tools, open the hook/permissions screen and confirm the configured guard is active. Use your tool’s documented pre-command hook protocol; the BBB working reference is linked in Sources. Run a harmless directory listing, then a guard dry-run targeting the profile. Do not execute a destructive profile probe. Grok Bot has no proven local shell guard here: use project-only tasks and reviewed actions, with backups.",
          "A harmless command runs, the guard dry-run returns DENY, and the checklist records the actual hook protocol and active state or the Grok Bot limitation."
        ]
      },
      "step_id": "L11-S03",
      "lesson_id": "L11"
    },
    {
      "title": "Enable a real backup of memory and project files",
      "purpose": "This step helps you enable a real backup of memory and project files. A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.",
      "user_action": "Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials. On Windows, review the script, unblock only that downloaded file, then run it with the shown process-only RemoteSigned policy. Group Policy can still refuse it; report that limitation without changing machine policy.",
      "explanation": "This step helps you enable a real backup of memory and project files. A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "15–25 min",
      "action_type": "command",
      "commands": {
        "windows": "# Read the extracted script before unblocking this single file.\nGet-Content .\\profile-backup.ps1\nUnblock-File -LiteralPath .\\profile-backup.ps1\npowershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File .\\profile-backup.ps1 -Destination D:\\Backups\\llm-profiles",
        "macos": "bash profile-backup.sh /Volumes/YourBackup/llm-profiles",
        "linux": "bash profile-backup.sh /media/YourBackup/llm-profiles"
      },
      "command_type": "shell",
      "required_inputs": [
        "profile-backup.ps1",
        "profile-backup.sh",
        "onboarding-checklist.md"
      ],
      "expected_result": "A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.",
      "resources": [
        "profile-backup.ps1",
        "profile-backup.sh",
        "onboarding-checklist.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Enable a real backup of memory and project files",
        "success_condition": "A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.",
        "how_to_verify": "Record the observed result for Enable a real backup of memory and project files. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "The destination is a mounted second drive.",
          "The hidden memory/settings folders and project files are included.",
          "An automated backup is enabled and its latest successful run is recorded."
        ],
        "tokens": [
          "PROFILE BACKUP PASS"
        ],
        "user_visible_success_message": "Evidence saved. A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The backup drive is missing or the script reports a failure",
          "likely_cause": "The destination may be on the same volume, unmounted, or unwritable.",
          "diagnostic_question": "What exact result did you observe during Enable a real backup of memory and project files?",
          "fix": "For Enable a real backup of memory and project files: Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials. Compare the actual output to A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.",
          "alternative_fix": "Use the operating system backup application and verify the same folder coverage and successful run.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Mount the drive and choose an accessible backup directory. Inspect every error; robocopy codes 8 and higher are failures."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use profile-backup.ps1, profile-backup.sh, onboarding-checklist.md."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to enable a real backup of memory and project files. A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.",
        "demo": "Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Mount the drive and choose an accessible backup directory. Inspect every error; robocopy codes 8 and higher are failures.",
        "help": "For Enable a real backup of memory and project files, compare your own result with: A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded.. Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials."
      },
      "video": {
        "purpose": "Demonstrate enable a real backup of memory and project files",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "System Restore alone is not a personal-file backup. Previous Versions can disappear as shadow storage fills; OneDrive’s common-folder backup omits hidden agent folders. Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials.",
        "on_screen_text": [
          "Enable a real backup of memory and project files",
          "A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded."
        ],
        "screen_recording_instructions": [
          "Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials. On Windows, review the script, unblock only that downloaded file, then run it with the shown process-only RemoteSigned policy. Group Policy can still refuse it; report that limitation without changing machine policy.",
          "A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "System Restore alone is not a personal-file backup. Previous Versions can disappear as shadow storage fills; OneDrive’s common-folder backup omits hidden agent folders.",
          "Connect a second backup drive. Windows: configure System Protection as additional recovery and use a scheduled copy/File History that explicitly includes hidden agent folders. macOS: configure Time Machine and verify dot folders are included. Linux: use a home backup such as restic/Deja Dup; Timeshift omits /home by default. Download the copy-only profile backup script for your platform, inspect it, and adapt the folder list to your tool. Record the last successful scheduled run; protect backup access because it may contain credentials.",
          "A backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded."
        ]
      },
      "step_id": "L11-S04",
      "lesson_id": "L11"
    },
    {
      "title": "Practice a hash-verified restore",
      "purpose": "This step helps you practice a hash-verified restore. RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
      "user_action": "Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile.",
      "explanation": "This step helps you practice a hash-verified restore. RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch. Treat this as local practice until you have actual source and execution evidence.",
      "estimated_time": "5–10 min",
      "action_type": "command",
      "commands": {
        "windows": "python restore_drill.py --backup-root D:\\Backups\\bbb-practice --work-root practice",
        "macos": "python3 restore_drill.py --backup-root /Volumes/YourBackup/bbb-practice --work-root practice",
        "linux": "python3 restore_drill.py --backup-root /media/YourBackup/bbb-practice --work-root practice"
      },
      "command_type": "shell",
      "required_inputs": [
        "restore_drill.py"
      ],
      "expected_result": "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
      "resources": [
        "restore_drill.py"
      ],
      "checkpoint": {
        "what_is_being_checked": "Practice a hash-verified restore",
        "success_condition": "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
        "how_to_verify": "Record the observed result for Practice a hash-verified restore. Use three lines: Result: (what happened); Evidence: (actual output or file and specific observation); Limit: (what you did not verify). Include required output tokens. The page checks structure only, not truth.",
        "criteria": [
          "The proof file SHA256 hashes match.",
          "I restored and opened a non-secret memory/settings file from my real backup.",
          "The restored file is in scratch; the live profile was not overwritten."
        ],
        "tokens": [
          "RESTORE PASS"
        ],
        "user_visible_success_message": "Evidence saved. RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "structured": true
      },
      "troubleshooting": [
        {
          "problem": "The result differs from the checkpoint",
          "likely_cause": "You may be in a different folder or using a different input/version.",
          "diagnostic_question": "What exact result did you observe during Practice a hash-verified restore?",
          "fix": "For Practice a hash-verified restore: Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile. Compare the actual output to RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
          "alternative_fix": "Open the supplied resource and inspect the input manually; use the expected-result example to narrow the difference.",
          "when_to_escalate": "Stop after two explained attempts if the problem needs account access, permissions or changes outside this workspace. Share redacted evidence.",
          "bot_coach_response": "Compare the input filename and working directory with this step. Rerun only after correcting that difference."
        }
      ],
      "faqs": [
        {
          "question": "What result should I verify for this step?",
          "answer": "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch."
        },
        {
          "question": "Which files support this action?",
          "answer": "Use restore_drill.py."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to practice a hash-verified restore. RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
        "demo": "Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Keep that result with your evidence.",
        "failure": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
        "help": "For Practice a hash-verified restore, compare your own result with: RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.. Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile."
      },
      "video": {
        "purpose": "Demonstrate practice a hash-verified restore",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A backup becomes useful only when restoration has been practiced. A same-volume practice copy proves the procedure but not protection against disk failure. Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile.",
        "on_screen_text": [
          "Practice a hash-verified restore",
          "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch."
        ],
        "screen_recording_instructions": [
          "Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile.",
          "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch."
        ],
        "animation_instructions": "Highlight the action, then the corresponding result; avoid motion during command copying.",
        "cursor_instructions": "Point to the exact input and checkpoint; do not hide errors.",
        "important_visuals": [
          "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A backup becomes useful only when restoration has been practiced. A same-volume practice copy proves the procedure but not protection against disk failure.",
          "Run restore_drill.py with a separate backup directory. The script creates a new proof file, copies it, restores a second copy, and compares SHA256 hashes. Then restore one non-secret file from your actual agent memory backup into a separate scratch directory and open it; do not overwrite the live profile.",
          "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch."
        ]
      },
      "step_id": "L11-S05",
      "lesson_id": "L11"
    }
  ],
  "resources": [
    {
      "resource_id": "R001",
      "name": "workspace_guard.py",
      "type": "py",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# VERSION HISTORY\n# 2026-10-05 EDT | chatgpt_codex | overnight-catalog | v1: learner resource.\n\"\"\"Dry-run resolved-path boundary demonstration. This script never deletes anything.\"\"\"\nimport argparse\nfrom pathlib import Path\n\ndef permitted(target, workspace):\n    root = Path(workspace).resolve()\n    candidate = Path(target).resolve()\n    home = Path.home().resolve()\n    if root == home or root == root.anchor or root in home.parents:\n        return False\n    return candidate != root and root in candidate.parents and candidate != home and candidate not in home.parents\n\ndef main():\n    p=argparse.ArgumentParser(description=__doc__)\n    p.add_argument('--workspace',default='practice')\n    p.add_argument('--target')\n    p.add_argument('--self-test',action='store_true')\n    a=p.parse_args()\n    root=Path(a.workspace).resolve()\n    if a.self_test:\n        assert permitted(root/'proof.txt',root)\n        assert not permitted(Path.home(),root)\n        assert not permitted(root.parent/'outside.txt',root)\n        assert not permitted(root,root)\n        variable_target=Path.home()\n        assert not permitted(variable_target,root)\n        print('GUARD PASS: inside allowed; profile, variable-derived profile, outside, workspace root denied; no deletion executed')\n    else:\n        if not a.target:p.error('--target required')\n        allowed=permitted(a.target,a.workspace)\n        print(('ALLOW' if allowed else 'DENY')+': resolved boundary; dry-run only')\n        raise SystemExit(0 if allowed else 2)\nif __name__=='__main__':main()\n",
      "filename": "workspace_guard.py",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R002",
      "name": "restore_drill.py",
      "type": "py",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# VERSION HISTORY\n# 2026-10-05 EDT | chatgpt_codex | overnight-catalog | v1: learner resource.\n\"\"\"Backup and restore a new proof file only; never edits an existing file or profile.\"\"\"\nimport argparse,hashlib,json,logging\nfrom datetime import datetime,timezone\nfrom pathlib import Path\nimport shutil\ndef digest(p):return hashlib.sha256(p.read_bytes()).hexdigest()\ndef main():\n    a=argparse.ArgumentParser(description=__doc__)\n    a.add_argument('--backup-root',required=True)\n    a.add_argument('--work-root',default='practice')\n    x=a.parse_args()\n    run=datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%S%fZ')\n    work=Path(x.work_root).resolve()/('restore-'+run)\n    backup=Path(x.backup_root).resolve()/('restore-'+run)\n    if work==backup or work in backup.parents or backup in work.parents:raise SystemExit('Use separate, non-overlapping work and backup roots')\n    work.mkdir(parents=True,exist_ok=False);backup.mkdir(parents=True,exist_ok=False)\n    logging.basicConfig(filename=work/'drill.log',encoding='utf-8',level=logging.INFO)\n    source=work/'proof.txt';source.write_text('BuildBotsBetter restore proof '+run,encoding='utf-8')\n    shutil.copy2(source,backup/'proof.txt')\n    restored=work/'restored.txt';shutil.copy2(backup/'proof.txt',restored)\n    assert digest(source)==digest(restored)\n    receipt={'result':'RESTORE PASS','source_sha256':digest(source),'restored_sha256':digest(restored),'backup_root':str(backup),'off_volume':work.anchor.lower()!=backup.anchor.lower(),'scope':'new proof file only; does not establish a scheduled profile backup'}\n    (work/'receipt.json').write_text(json.dumps(receipt,indent=2),encoding='utf-8')\n    logging.info('Proof backup and hash-verified restore completed')\n    print(json.dumps(receipt,indent=2))\n    if not receipt['off_volume']:print('SAME VOLUME: practice passed; configure a second drive for disaster recovery')\nif __name__=='__main__':main()\n",
      "filename": "restore_drill.py",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R003",
      "name": "onboarding-checklist.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# Repeatable agent onboarding\nagent:\ntool version:\nrules file:\nmemory/settings location:\nassigned workspace:\npermissions / actions needing approval:\nhook location and protocol:\nguard active (harmless command + denied dry-run):\nvariable-derived path limit understood:\nbackup destination (second drive):\nbackup schedule / last successful run:\nrestored memory file / matching SHA256:\nfinal task / evidence / reviewer:\n\nProtect memory/settings and project files. A prompt rule is not an operating-system boundary.\nA command-text hook can miss a path computed in a script or variable. Resolve paths at the\noperation boundary and fail closed; keep independent backups and monitoring.\nWindows System Restore reverts system components, not a reliable personal-file backup.\nOneDrive folder backup does not automatically include hidden agent folders.\nmacOS: check Time Machine includes hidden agent folders. Linux: Timeshift excludes /home by\ndefault; use a separate home backup or explicitly include it.\n",
      "filename": "onboarding-checklist.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R004",
      "name": "profile-backup.ps1",
      "type": "ps1",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# VERSION HISTORY\n# 2026-10-05 EDT | chatgpt_codex | overnight-catalog | v1: copy-only explicit profile backup.\nparam([Parameter(Mandatory=$true)][string]$Destination,[string]$ProjectPath=(Get-Location).Path)\n$ErrorActionPreference='Stop'\n$destRoot=[IO.Path]::GetFullPath($Destination)\n$profileRoot=[IO.Path]::GetFullPath($env:USERPROFILE)\nif ([IO.Path]::GetPathRoot($destRoot) -eq [IO.Path]::GetPathRoot($profileRoot)) { throw 'Choose a backup destination on a second drive.' }\nif (-not (Test-Path -LiteralPath ([IO.Path]::GetPathRoot($destRoot)))) { throw 'Backup drive is unavailable.' }\n$runDir=Join-Path $destRoot (Get-Date -Format 'yyyyMMdd-HHmmss-fff')\nNew-Item -ItemType Directory -Path $runDir -ErrorAction Stop | Out-Null\nforeach ($folderName in @('.codex','.claude','.grok','.qwen','.gemini')) {\n  $sourceDir=Join-Path $profileRoot $folderName\n  if (Test-Path -LiteralPath $sourceDir) {\n    $copyDir=Join-Path $runDir $folderName\n    & robocopy $sourceDir $copyDir /E /XJ /R:1 /W:1 /COPY:DAT /DCOPY:DAT /NP\n    if ($LASTEXITCODE -ge 8) { throw \"Backup failed for $folderName (robocopy $LASTEXITCODE).\" }\n  }\n}\n$projectSource=[IO.Path]::GetFullPath($ProjectPath)\nif (-not (Test-Path -LiteralPath $projectSource -PathType Container)) { throw 'Project directory is unavailable.' }\n& robocopy $projectSource (Join-Path $runDir 'project') /E /XJ /R:1 /W:1 /COPY:DAT /DCOPY:DAT /NP\nif ($LASTEXITCODE -ge 8) { throw \"Project backup failed (robocopy $LASTEXITCODE).\" }\n\"PROFILE BACKUP PASS: $runDir\"\n# Copy-only: no /MIR, /PURGE or deletion. Backup may contain credentials; protect the drive.\n# Add the Grok Bot profile and project path explicitly after finding them in your own installation.\n",
      "filename": "profile-backup.ps1",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R005",
      "name": "profile-backup.sh",
      "type": "sh",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "#!/usr/bin/env bash\n# VERSION HISTORY\n# 2026-10-16 EDT | chatgpt_codex / Codex | peer finding repairs\n# 2026-10-05 EDT | chatgpt_codex | overnight-catalog | v1: copy-only explicit profile backup.\nset -euo pipefail\ndest=${1:?Pass a mounted external-drive backup directory}\nproject=${2:-$PWD}\nif [ ! -d \"$dest\" ]; then echo \"Destination must already exist on a mounted external filesystem.\" >&2; exit 2; fi\nif [ \"$(df -P \"$HOME\" | tail -1 | awk '{print $1}')\" = \"$(df -P \"$dest\" | tail -1 | awk '{print $1}')\" ]; then\n  echo 'Choose a destination on another mounted filesystem.' >&2; exit 2\nfi\nrun=\"$dest/$(date -u +%Y%m%dT%H%M%SZ)-$$\"\nmkdir \"$run\"\nfor name in .codex .claude .grok .qwen .gemini; do\n  if [ -d \"$HOME/$name\" ]; then cp -pR \"$HOME/$name\" \"$run/$name\"; fi\ndone\nif [ ! -d \"$project\" ]; then echo 'Project directory is unavailable.' >&2; exit 2; fi\ncp -pR \"$project\" \"$run/project\"\necho \"PROFILE BACKUP PASS: $run\"\n# This backup can contain credentials; protect access to the backup drive.\n",
      "filename": "profile-backup.sh",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R006",
      "name": "production-bible.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# Documentary production bible — original practice example\n<!-- VERSION HISTORY: 2026-10-14 EDT | chatgpt_codex | r11 explicit mm:ss stage cue headers; original prose retained. -->\n## 0:00-0:10 — Question\nAsk where one glass of drinking water comes from; do not imply a surveyed local route.\n## 0:10-0:20 — Source\nIntroduce the sourced starting point with a claim ID.\n## 0:20-0:30 — Treatment\nShow an explanatory treatment diagram; label variation and uncertainty.\n## 0:30-0:40 — Storage\nExplain the role of storage without inventing a facility.\n## 0:40-0:50 — Distribution\nShow the sourced distribution concept and its limitations.\n## 0:50-1:00 — Return to the glass\nRestate the takeaway and display the AI-generation disclosure.\n## Production locks and evidence\nTitle: The Water in One Glass\nMessage: A drinking-water journey needs sources, treatment and distribution; do not invent local infrastructure claims.\nHost: fictional Mira, adult presenter, navy jacket, no impersonation.\nVoice: warm lower register, conversational pace, clear consonants, restrained curiosity; describe in words.\nLook: consistent neutral daylight, locked wardrobe; source-inspired alternative: ARRICAM LT + Cooke S4/i + Kodak VISION3 500T, daylight-corrected color.\nStages: 0-10s question; 10-20s source; 20-30s treatment; 30-40s storage; 40-50s distribution; 50-60s return to glass.\nResearch: every number needs claim, URL, publisher, checked date, supporting excerpt and status.\nShot rules: same actual face/voice attachments; eyes to lens for dialogue; crew/camera excluded; no fabricated experts or archival evidence.\nSound: dialogue -20 LUFS; music under speech -35; between lines -25; takeaway -23; featured SFX -26; ambience -32; master -15 LUFS, true peak at most -1.5 dBTP (use -2 for social headroom).\nEdit: ellipsis pauses >0.95s ->0.72s; sentence-end >0.78s ->0.48s; others >0.64s ->0.34s. J-cut audio 0.34s before picture; cutaway sound lead 0.3s. Preserve meaning and natural action.\nBudget: practice $0. Plan and estimate first. Paid generation needs a separately approved ceiling; reserve about a fifth for retakes.\nDeliverables: script, fact ledger, shot plan, editable diagrams, media, QC JSON, caption file and disclosure end card.\nDisclosure: Host, voice and example locations are AI-generated; diagrams are explanatory, not surveyed evidence.\n",
      "filename": "production-bible.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R007",
      "name": "claims.csv",
      "type": "csv",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "claim_id,claim,publisher,url,checked_date,status\nC01,Water treatment varies by source,US EPA,https://www.epa.gov/ground-water-and-drinking-water,2026-10-05,needs-review\n",
      "filename": "claims.csv",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R008",
      "name": "shot-template.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# Shot card\nShot ID / time range:\nSpoken line and claim IDs:\nFace reference actual attachment:\nVoice reference actual attachment:\nLook and wardrobe locks:\nEyes to lens; no visible crew or camera:\nLocation (real sourced / generated illustration):\nPause / J-cut edit points:\nQC: words, continuity, face count, freezes, dead air:\nCost estimate / retake reserve / approval:\n",
      "filename": "shot-template.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R009",
      "name": "doc_qc.py",
      "type": "py",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# 2026-10-16 EDT | chatgpt_codex / Codex | peer finding repairs\n# VERSION HISTORY\n# 2026-10-05 EDT | chatgpt_codex | overnight-catalog | v1: learner resource.\n# 2026-10-17 EDT | chatgpt_codex / Codex | owner-r13 | align gate with documented -1.5 dBTP ceiling\n\"\"\"Measure your real clip with free FFmpeg; no model or paid generation required.\"\"\"\nimport argparse,json,re,subprocess,logging\nfrom pathlib import Path\ndef call(args):\n    r=subprocess.run(args,capture_output=True,text=True,encoding='utf-8',errors='replace')\n    if r.returncode:raise RuntimeError(r.stderr[-2000:])\n    return r.stderr\ndef main():\n    p=argparse.ArgumentParser(description=__doc__);p.add_argument('clip');p.add_argument('--out',default='qc.json');a=p.parse_args()\n    Path('logs').mkdir(exist_ok=True);logging.basicConfig(filename='logs/doc-qc.log',encoding='utf-8',level=logging.INFO)\n    clip=str(Path(a.clip).resolve())\n    mix=call(['ffmpeg','-hide_banner','-nostdin','-i',clip,'-af','loudnorm=I=-15:TP=-2:LRA=11:print_format=json','-f','null','-'])\n    matches=re.findall(r'\\{\\s*\"input_i\".*?\\}',mix,re.S)\n    if not matches:raise RuntimeError('No loudnorm measurement; check that the clip has audio')\n    values=json.loads(matches[-1]);integrated=float(values['input_i']);peak=float(values['input_tp'])\n    silence=call(['ffmpeg','-hide_banner','-nostdin','-i',clip,'-af','silencedetect=noise=-40dB:d=0.64','-f','null','-'])\n    freeze=call(['ffmpeg','-hide_banner','-nostdin','-i',clip,'-vf','freezedetect=n=-60dB:d=1','-an','-f','null','-'])\n    report={'result':'QC PASS' if -16<=integrated<=-14 and peak<=-1.5 else 'QC REVIEW','input_lufs':integrated,'true_peak_dbtp':peak,'silence_events':[x.strip() for x in silence.splitlines() if 'silence_' in x],'freeze_events':[x.strip() for x in freeze.splitlines() if 'freeze_' in x],'limitations':'Silence/freeze detectors flag intentional holds too. Human review and word/face continuity checks remain required.'}\n    Path(a.out).write_text(json.dumps(report,indent=2),encoding='utf-8');logging.info('lufs=%s true_peak=%s result=%s',integrated,peak,report['result']);print(json.dumps(report,indent=2))\nif __name__=='__main__':main()\n",
      "filename": "doc_qc.py",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R010",
      "name": "pause_rules.py",
      "type": "py",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# VERSION HISTORY\n# 2026-10-05 EDT | chatgpt_codex | overnight-catalog | v1: learner resource.\ndef trim(kind,seconds):\n    threshold,target={'ellipsis':(.95,.72),'sentence':(.78,.48),'other':(.64,.34)}[kind]\n    return target if seconds>threshold else seconds\nif __name__=='__main__':\n    assert trim('ellipsis',1.1)==.72\n    assert trim('sentence',.9)==.48\n    assert trim('other',.8)==.34\n    assert trim('other',.6)==.6\n    print('PAUSE PASS: ellipsis=0.72 sentence=0.48 other=0.34 short=unchanged')\n",
      "filename": "pause_rules.py",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R011",
      "name": "budget.py",
      "type": "py",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# VERSION HISTORY\n# 2026-10-05 EDT | chatgpt_codex | overnight-catalog | v1: learner resource.\n# 2026-10-14 EDT | chatgpt_codex | r11 optional observed currency/credit rate; finite inputs and no invented provider tier.\nimport argparse,math\np=argparse.ArgumentParser();p.add_argument('--base',type=float,default=1000);p.add_argument('--retake-share',type=float,default=.22);p.add_argument('--ceiling',type=float,default=1500)\np.add_argument('--rate',type=float,help='Estimated currency units per credit from your dated provider price; not a built-in tariff.')\np.add_argument('--currency',default='USD');a=p.parse_args()\nif not all(math.isfinite(n) for n in [a.base,a.retake_share,a.ceiling]) or a.base<0 or a.ceiling<0 or not 0<=a.retake_share<1:p.error('Use finite nonnegative base/ceiling and a retake share from zero to less than one.')\nif a.rate is not None and (not math.isfinite(a.rate) or a.rate<0):p.error('Rate must be finite and nonnegative.')\ntotal=a.base/(1-a.retake_share)\nprint('BUDGET '+('PASS' if total<=a.ceiling else 'REVIEW')+': total='+str(round(total,2))+' retake_reserve='+str(round(total-a.base,2)))\nif a.rate is not None:print(f'ESTIMATE ONLY {a.currency}: base={a.base*a.rate:.2f} total={total*a.rate:.2f} retake_reserve={(total-a.base)*a.rate:.2f}; excludes unpriced fees/taxes, no provider tier inferred')\nelse:print('CURRENCY COST UNKNOWN: supply --rate from a dated approved provider price; credit ceiling is not a currency ceiling.')\n",
      "filename": "budget.py",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    }
  ],
  "bot_coach": {
    "bot_name": "Buzz",
    "bot_role": "Offline reviewed step coach",
    "personality": "patient and concrete",
    "tone": "plain",
    "teaching_style": "hint, diagnostic, action, checkpoint",
    "introduction": "Ask about the current step. I use reviewed local answers and queue unknown questions for review.",
    "encouragement_style": "Focus on observed results.",
    "troubleshooting_style": "Ask for the smallest reproducible evidence.",
    "limits": "This offline coach does not call an LLM or inspect your computer. Unknown questions enter a local exportable review queue, not a shared SQL FAQ."
  },
  "coach_interaction_model": {
    "stuck": "current diagnostic and first repair",
    "meaning": "current explanation",
    "error": "current troubleshooting",
    "why": "purpose",
    "skip": "require equivalent evidence",
    "alternative": "documented alternative",
    "finished": "record actual output",
    "start_over": "export then reset only this Build",
    "progressive_assistance": [
      "hint",
      "diagnostic",
      "walkthrough",
      "resource solution"
    ]
  },
  "website_specification": {
    "layout": "Lesson outline, actionable step, current-context coach",
    "features": [
      "platform selectors",
      "command copy with selection fallback",
      "evidence checklist",
      "practical quiz",
      "downloadable resource ZIP",
      "local progress",
      "evidence export",
      "unknown-question review queue"
    ],
    "checkpoint_model": "Learner supplies observations/output; tokens check expected shape only, not host truth.",
    "navigation": "Browse freely; checked next-button progression retains evidence.",
    "video": "spec-driven walkthrough and optional speech; full rendered media is a downstream production task."
  },
  "final_test": {
    "test_name": "Repeat the core workflow and restore its evidence",
    "instructions": "Repeat the last product-specific checkpoint from a fresh practice input, preserve actual output, then complete the Build Bot Better guard and restore checks. Export the evidence.",
    "required_inputs": [
      "workspace_guard.py",
      "restore_drill.py",
      "onboarding-checklist.md",
      "production-bible.md",
      "claims.csv",
      "shot-template.md",
      "doc_qc.py",
      "pause_rules.py",
      "budget.py"
    ],
    "success_conditions": [
      "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise.",
      "Core output can be reproduced",
      "Guard limit explained",
      "Backup and restoration evidence retained"
    ],
    "automated_tests": "catalog_check.py records browser behavior and executable resources, with explicit scope.",
    "manual_tests": [
      "Review actual account sign-in where needed",
      "Check source/data assumptions",
      "Restore one real non-secret memory file"
    ],
    "expected_output": "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise.",
    "failure_paths": "Use the specific step diagnostic, retain failure evidence and stop when access is required."
  },
  "extensions": [
    {
      "title": "Use your own input",
      "action": "Replace the sample with one permitted real input and rerun the same checks."
    },
    {
      "title": "Add one failure case",
      "action": "Create a malformed or missing input; prove the workflow fails visibly and recovers."
    },
    {
      "title": "Automate after review",
      "action": "Write a bounded schedule with logging and a stop condition; obtain approval for external actions separately."
    }
  ],
  "metadata": {
    "SEO_title": "Make an AI Documentary from One Brief | BuildBotsBetter",
    "SEO_description": "A production-bible brief, fictional host/voice description, sourced shot ledger, retake budget, edit plan and a free real-video loudness/freeze/dead-air QC exercise.",
    "SEO_keywords": [
      "ai-documentary-one-brief",
      "guided build",
      "verified outcome"
    ],
    "difficulty": "beginner",
    "related_builds": [
      "dogfooding",
      "buildbotsbetter-onboarding"
    ],
    "next_recommended_build": "dogfooding"
  },
  "automation_map": [
    {
      "output": "website",
      "generated_from": "BUILD_SPEC.json",
      "human_review_required": true
    },
    {
      "output": "walkthrough",
      "generated_from": "BUILD_SPEC.json",
      "human_review_required": true
    },
    {
      "output": "bot dialogue",
      "generated_from": "BUILD_SPEC.json",
      "human_review_required": true
    },
    {
      "output": "resources",
      "generated_from": "BUILD_SPEC.json",
      "human_review_required": true
    },
    {
      "output": "quiz",
      "generated_from": "BUILD_SPEC.json",
      "human_review_required": true
    },
    {
      "output": "captions",
      "generated_from": "BUILD_SPEC.json",
      "human_review_required": true
    },
    {
      "output": "metadata",
      "generated_from": "BUILD_SPEC.json",
      "human_review_required": true
    }
  ],
  "quality_assurance_report": {
    "scope": "Original instructional content, reviewed against shared brief; execution and browser receipts are stored under logs/catalog-acceptance.",
    "known_limits": [
      "The source does not disclose the exact agent harness or Higgsfield control integration.",
      "The reconstructed brief is not an exact transcription.",
      "Reported costs are historical case-study estimates, not current provider prices."
    ]
  },
  "sources": [
    {
      "title": "Alex Patrascu original thread",
      "url": "https://x.com/maxescu/status/2105619319220511010"
    },
    {
      "title": "Archived source, replies, film and measured review",
      "url": "../../../../media/videos/prompts/Alex%20Patrascu/claude_cli/README.md"
    },
    {
      "title": "FFmpeg filter reference",
      "url": "https://ffmpeg.org/ffmpeg-filters.html"
    },
    {
      "title": "Official FFmpeg platform download guide",
      "url": "https://ffmpeg.org/download.html"
    }
  ],
  "known_uncertainties": [
    "The source does not disclose the exact agent harness or Higgsfield control integration.",
    "The reconstructed brief is not an exact transcription.",
    "Reported costs are historical case-study estimates, not current provider prices."
  ],
  "version_history": [
    "2026-10-14 EDT | chatgpt_codex | codex-20261014-owner-r11 | owner finding repairs",
    "2026-10-16 EDT | chatgpt_codex / Codex | peer finding repairs"
  ],
  "checkpoint_revision": "r13-20261017"
}
