{
  "schema_version": 2,
  "meta": {
    "build_id": "CODEX-FACEBOOK-CONTENT-AI-SI-AGENTIC-ERA",
    "slug": "facebook-content-ai-si-agentic-era",
    "title": "Creating Facebook Content for the AI, SI, and Agentic Era",
    "subtitle": "Make a native local Group discussion and a checked companion knowledge pack.",
    "description": "A reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources.",
    "one_sentence_description": "A reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources.",
    "target_user": "A beginner content creator or content agent reviewer: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.",
    "skill_level": "beginner",
    "estimated_time": "4–6 hours including native production; live publication optional",
    "category": "Guided Build",
    "tags": [
      "facebook-content-ai-si-agentic-era",
      "verified practice",
      "chatgpt_codex"
    ],
    "prerequisites": [
      "Permission to use a dedicated workspace",
      "A browser and terminal",
      "Read each platform-specific prerequisite before installation"
    ],
    "required_accounts": [],
    "required_software": [
      "Modern browser",
      "Python 3.10+ for downloadable drills"
    ],
    "required_hardware": [
      "A computer with space for the practice files",
      "Second drive for the disaster-recovery checkpoint"
    ],
    "expected_cost": "Free offline practice. Optional platform production uses your own eligible account; no paid service is needed.",
    "final_outcome": "A reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources.",
    "platforms": [
      "windows",
      "macos",
      "linux"
    ],
    "version": "3.0",
    "author": "chatgpt_codex",
    "source_checked": "2026-10-06",
    "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 creating facebook content for the ai, si, and agentic era.",
    "after": "A reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources.",
    "finished_product": "A reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources."
  },
  "learning_objectives": [
    "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
    "A surface map and a Group-first audience decision exist.",
    "Two dated observations and a rule-fit checklist support the invitation.",
    "Seven ideas connect format, audience, intent and action.",
    "The ranking sketch distinguishes documented architecture from untested tactics.",
    "The title, description and three queries match the same local need."
  ],
  "lessons": [
    {
      "lesson_id": "L01",
      "title": "Start with the native creation experience",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.",
      "estimated_time": "10 min",
      "learning_objective": "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
      "lessons_before_this": [],
      "lessons_after_this": [
        "L02"
      ]
    },
    {
      "lesson_id": "L02",
      "title": "Choose a surface and an audience",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "A surface map and a Group-first audience decision exist.",
      "lessons_before_this": [
        "L01"
      ],
      "lessons_after_this": [
        "L03"
      ]
    },
    {
      "lesson_id": "L03",
      "title": "Check the community before composing",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Two dated observations and a rule-fit checklist support the invitation.",
      "lessons_before_this": [
        "L02"
      ],
      "lessons_after_this": [
        "L04"
      ]
    },
    {
      "lesson_id": "L04",
      "title": "Choose the content engine",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Seven ideas connect format, audience, intent and action.",
      "lessons_before_this": [
        "L03"
      ],
      "lessons_after_this": [
        "L05"
      ]
    },
    {
      "lesson_id": "L05",
      "title": "Separate ranking signals from folklore",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "The ranking sketch distinguishes documented architecture from untested tactics.",
      "lessons_before_this": [
        "L04"
      ],
      "lessons_after_this": [
        "L06"
      ]
    },
    {
      "lesson_id": "L06",
      "title": "Build a local search brief",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "The title, description and three queries match the same local need.",
      "lessons_before_this": [
        "L05"
      ],
      "lessons_after_this": [
        "L07"
      ]
    },
    {
      "lesson_id": "L07",
      "title": "Compose the controlled post pair",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Both versions ask about the same meetup and B adds useful context.",
      "lessons_before_this": [
        "L06"
      ],
      "lessons_after_this": [
        "L08"
      ]
    },
    {
      "lesson_id": "L08",
      "title": "Say, write and show the same thing",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Speech, image, caption and metadata describe the same meetup.",
      "lessons_before_this": [
        "L07"
      ],
      "lessons_after_this": [
        "L09"
      ]
    },
    {
      "lesson_id": "L09",
      "title": "Design a Reel that stands alone",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Six micro-knowledge archetypes have a clear payoff.",
      "lessons_before_this": [
        "L08"
      ],
      "lessons_after_this": [
        "L10"
      ]
    },
    {
      "lesson_id": "L10",
      "title": "Plan the depth ladder",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "A five-level map connects micro, medium, discussion, community and deep reference.",
      "lessons_before_this": [
        "L09"
      ],
      "lessons_after_this": [
        "L11"
      ]
    },
    {
      "lesson_id": "L11",
      "title": "Turn comments into useful answers",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
      "lessons_before_this": [
        "L10"
      ],
      "lessons_after_this": [
        "L12"
      ]
    },
    {
      "lesson_id": "L12",
      "title": "Close the community knowledge loop",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "An eight-stage loop updates the invitation from a concrete question.",
      "lessons_before_this": [
        "L11"
      ],
      "lessons_after_this": [
        "L13"
      ]
    },
    {
      "lesson_id": "L13",
      "title": "Make a Group guide and moderation rule",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "A guide outline, verification rule and moderator escalation exist.",
      "lessons_before_this": [
        "L12"
      ],
      "lessons_after_this": [
        "L14"
      ]
    },
    {
      "lesson_id": "L14",
      "title": "Build a discussion graph",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Six named node types preserve relationships and uncertainty.",
      "lessons_before_this": [
        "L13"
      ],
      "lessons_after_this": [
        "L15"
      ]
    },
    {
      "lesson_id": "L15",
      "title": "Localize without changing the invitation",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "A translation draft or review plan preserves logistical facts.",
      "lessons_before_this": [
        "L14"
      ],
      "lessons_after_this": [
        "L16"
      ]
    },
    {
      "lesson_id": "L16",
      "title": "Use entities and question-first writing",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Entity definitions and a direct answer replace vague references.",
      "lessons_before_this": [
        "L15"
      ],
      "lessons_after_this": [
        "L17"
      ]
    },
    {
      "lesson_id": "L17",
      "title": "Plan authentic community feedback",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "The feedback plan protects identity and labels synthetic examples.",
      "lessons_before_this": [
        "L16"
      ],
      "lessons_after_this": [
        "L18"
      ]
    },
    {
      "lesson_id": "L18",
      "title": "Design the thirteen-layer package",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Thirteen linked layer descriptions have no missing purpose.",
      "lessons_before_this": [
        "L17"
      ],
      "lessons_after_this": [
        "L19"
      ]
    },
    {
      "lesson_id": "L19",
      "title": "Recompose one live-show idea",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Four native adaptations and a broadcast-to-knowledge plan exist.",
      "lessons_before_this": [
        "L18"
      ],
      "lessons_after_this": [
        "L20"
      ]
    },
    {
      "lesson_id": "L20",
      "title": "Design six experiments and three versions",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "Three same-topic versions and six test proposals include controls and metrics.",
      "lessons_before_this": [
        "L19"
      ],
      "lessons_after_this": [
        "L21"
      ]
    },
    {
      "lesson_id": "L21",
      "title": "Audit the full invitation",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "learning_objective": "A human review decision lists remaining blockers before publication.",
      "lessons_before_this": [
        "L20"
      ],
      "lessons_after_this": [
        "L22"
      ]
    },
    {
      "lesson_id": "L22",
      "title": "Companion knowledge and truthful claims",
      "purpose": "A dedicated folder makes mistakes easy to diagnose and keeps real project files separate.",
      "estimated_time": "10 min",
      "learning_objective": "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
      "lessons_before_this": [
        "L21"
      ],
      "lessons_after_this": [
        "L23"
      ]
    },
    {
      "lesson_id": "L23",
      "title": "Score and verify a reviewed production pack",
      "purpose": "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
      "estimated_time": "12 min",
      "learning_objective": "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
      "lessons_before_this": [
        "L22"
      ],
      "lessons_after_this": [
        "L24"
      ]
    },
    {
      "lesson_id": "L24",
      "title": "Retrieve, attribute and hand off",
      "purpose": "The relevant query returns source-linked chunks; the unrelated query abstains.",
      "estimated_time": "8 min",
      "learning_objective": "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
      "lessons_before_this": [
        "L23"
      ],
      "lessons_after_this": [
        "L25"
      ]
    },
    {
      "lesson_id": "L25",
      "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": [
        "L24"
      ],
      "lessons_after_this": []
    }
  ],
  "steps": [
    {
      "title": "Open the native draft studio",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.",
      "user_action": "Download the resource ZIP and extract it into a new private folder. Open studio.html directly in your browser. Compare the two local Group discussion drafts for Repair meetup for squeaky bicycle brakes. Read AGENT_OPERATING_MANUAL.md and all twenty points in agent-training.json: native CTA/AI, concrete inputs, draft outputs and stop rules. Inspect strategy.json and assign an artifact to each maturity stage. No account or terminal is needed for the studio; do not publish a synthetic fixture.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.",
      "estimated_time": "10 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "studio.html",
        "strategy.json",
        "AGENT_OPERATING_MANUAL.md",
        "agent-training.json"
      ],
      "expected_result": "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
      "resources": [
        "studio.html",
        "strategy.json",
        "AGENT_OPERATING_MANUAL.md",
        "agent-training.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Open the native draft studio",
        "success_condition": "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
        "how_to_verify": "Record the studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify open the native draft studio?",
          "answer": "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use studio.html, strategy.json, AGENT_OPERATING_MANUAL.md, agent-training.json. Work in the same practice folder."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to open the native draft studio. The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
        "demo": "Download the resource ZIP and extract it into a new private folder. Open studio.html directly in your browser. Compare the two local Group discussion drafts for Repair meetup for squeaky bicycle brakes. Read AGENT_OPERATING_MANUAL.md and all twenty points in agent-training.json: native CTA/AI, concrete inputs, draft outputs and stop rules. Inspect strategy.json and assign an artifact to each maturity stage. No account or terminal is needed for the studio; do not publish a synthetic fixture.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate open the native draft studio",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Download the resource ZIP and extract it into a new private folder. Open studio.html directly in your browser. Compare the two local Group discussion drafts for Repair meetup for squeaky bicycle brakes. Read AGENT_OPERATING_MANUAL.md and all twenty points in agent-training.json: native CTA/AI, concrete inputs, draft outputs and stop rules. Inspect strategy.json and assign an artifact to each maturity stage. No account or terminal is needed for the studio; do not publish a synthetic fixture. The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
        "on_screen_text": [
          "Open the native draft studio",
          "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries."
        ],
        "screen_recording_instructions": [
          "Download the resource ZIP and extract it into a new private folder. Open studio.html directly in your browser. Compare the two local Group discussion drafts for Repair meetup for squeaky bicycle brakes. Read AGENT_OPERATING_MANUAL.md and all twenty points in agent-training.json: native CTA/AI, concrete inputs, draft outputs and stop rules. Inspect strategy.json and assign an artifact to each maturity stage. No account or terminal is needed for the studio; do not publish a synthetic fixture.",
          "Inspect the result: The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries.",
          "Record the evidence and check each criterion."
        ],
        "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 studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Download the resource ZIP and extract it into a new private folder. Open studio.html directly in your browser. Compare the two local Group discussion drafts for Repair meetup for squeaky bicycle brakes. Read AGENT_OPERATING_MANUAL.md and all twenty points in agent-training.json: native CTA/AI, concrete inputs, draft outputs and stop rules. Inspect strategy.json and assign an artifact to each maturity stage. No account or terminal is needed for the studio; do not publish a synthetic fixture.",
          "The studio shows A/B drafts and a zero-initialized rubric; the content-agent plan has twenty operating points and native CTA/AI boundaries."
        ]
      },
      "step_id": "L01-S01",
      "lesson_id": "L01"
    },
    {
      "title": "Choose a surface and an audience",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Map Feed, Pages, Groups, Reels, Stories, Live, Events, comments, notifications and Marketplace in audience.md. Pick a local Group for the repair invitation; explain why a Marketplace listing or a Page broadcast would satisfy a different intent.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "A surface map and a Group-first audience decision exist.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Choose a surface and an audience",
        "success_condition": "A surface map and a Group-first audience decision exist.",
        "how_to_verify": "Record a surface map and a Group-first audience decision exist. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "A surface map and a Group-first audience decision exist.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. A surface map and a Group-first audience decision exist.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for choose a surface and an audience?",
          "answer": "A surface map and a Group-first audience decision exist. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to choose a surface and an audience. A surface map and a Group-first audience decision exist.",
        "demo": "Map Feed, Pages, Groups, Reels, Stories, Live, Events, comments, notifications and Marketplace in audience.md. Pick a local Group for the repair invitation; explain why a Marketplace listing or a Page broadcast would satisfy a different intent.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate choose a surface and an audience",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Map Feed, Pages, Groups, Reels, Stories, Live, Events, comments, notifications and Marketplace in audience.md. Pick a local Group for the repair invitation; explain why a Marketplace listing or a Page broadcast would satisfy a different intent. A surface map and a Group-first audience decision exist.",
        "on_screen_text": [
          "Choose a surface and an audience",
          "A surface map and a Group-first audience decision exist."
        ],
        "screen_recording_instructions": [
          "Map Feed, Pages, Groups, Reels, Stories, Live, Events, comments, notifications and Marketplace in audience.md. Pick a local Group for the repair invitation; explain why a Marketplace listing or a Page broadcast would satisfy a different intent.",
          "Inspect the result: A surface map and a Group-first audience decision exist.",
          "Record the evidence and check each criterion."
        ],
        "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 surface map and a Group-first audience decision exist."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Map Feed, Pages, Groups, Reels, Stories, Live, Events, comments, notifications and Marketplace in audience.md. Pick a local Group for the repair invitation; explain why a Marketplace listing or a Page broadcast would satisfy a different intent.",
          "A surface map and a Group-first audience decision exist."
        ]
      },
      "step_id": "L02-S01",
      "lesson_id": "L02"
    },
    {
      "title": "Check the community before composing",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Review a Group you may access: rules, description, pinned guides, past event posts and two public examples. Record date, allowed formats and moderation requirements. Keep private content out of the downloaded pack.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Two dated observations and a rule-fit checklist support the invitation.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Check the community before composing",
        "success_condition": "Two dated observations and a rule-fit checklist support the invitation.",
        "how_to_verify": "Record two dated observations and a rule-fit checklist support the invitation. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Two dated observations and a rule-fit checklist support the invitation.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Two dated observations and a rule-fit checklist support the invitation.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for check the community before composing?",
          "answer": "Two dated observations and a rule-fit checklist support the invitation. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to check the community before composing. Two dated observations and a rule-fit checklist support the invitation.",
        "demo": "Review a Group you may access: rules, description, pinned guides, past event posts and two public examples. Record date, allowed formats and moderation requirements. Keep private content out of the downloaded pack.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate check the community before composing",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Review a Group you may access: rules, description, pinned guides, past event posts and two public examples. Record date, allowed formats and moderation requirements. Keep private content out of the downloaded pack. Two dated observations and a rule-fit checklist support the invitation.",
        "on_screen_text": [
          "Check the community before composing",
          "Two dated observations and a rule-fit checklist support the invitation."
        ],
        "screen_recording_instructions": [
          "Review a Group you may access: rules, description, pinned guides, past event posts and two public examples. Record date, allowed formats and moderation requirements. Keep private content out of the downloaded pack.",
          "Inspect the result: Two dated observations and a rule-fit checklist support the invitation.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Two dated observations and a rule-fit checklist support the invitation."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Review a Group you may access: rules, description, pinned guides, past event posts and two public examples. Record date, allowed formats and moderation requirements. Keep private content out of the downloaded pack.",
          "Two dated observations and a rule-fit checklist support the invitation."
        ]
      },
      "step_id": "L03-S01",
      "lesson_id": "L03"
    },
    {
      "title": "Choose the content engine",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Draft seven format ideas: educational post, discussion, video/Live, Reel, Group question, Event and source link. Choose one action per format and keep the repair invitation coherent.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Seven ideas connect format, audience, intent and action.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Choose the content engine",
        "success_condition": "Seven ideas connect format, audience, intent and action.",
        "how_to_verify": "Record seven ideas connect format, audience, intent and action. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Seven ideas connect format, audience, intent and action.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Seven ideas connect format, audience, intent and action.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for choose the content engine?",
          "answer": "Seven ideas connect format, audience, intent and action. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to choose the content engine. Seven ideas connect format, audience, intent and action.",
        "demo": "Draft seven format ideas: educational post, discussion, video/Live, Reel, Group question, Event and source link. Choose one action per format and keep the repair invitation coherent.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate choose the content engine",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Draft seven format ideas: educational post, discussion, video/Live, Reel, Group question, Event and source link. Choose one action per format and keep the repair invitation coherent. Seven ideas connect format, audience, intent and action.",
        "on_screen_text": [
          "Choose the content engine",
          "Seven ideas connect format, audience, intent and action."
        ],
        "screen_recording_instructions": [
          "Draft seven format ideas: educational post, discussion, video/Live, Reel, Group question, Event and source link. Choose one action per format and keep the repair invitation coherent.",
          "Inspect the result: Seven ideas connect format, audience, intent and action.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Seven ideas connect format, audience, intent and action."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Draft seven format ideas: educational post, discussion, video/Live, Reel, Group question, Event and source link. Choose one action per format and keep the repair invitation coherent.",
          "Seven ideas connect format, audience, intent and action."
        ]
      },
      "step_id": "L04-S01",
      "lesson_id": "L04"
    },
    {
      "title": "Separate ranking signals from folklore",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Draw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "The ranking sketch distinguishes documented architecture from untested tactics.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Separate ranking signals from folklore",
        "success_condition": "The ranking sketch distinguishes documented architecture from untested tactics.",
        "how_to_verify": "Record the ranking sketch distinguishes documented architecture from untested tactics. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The ranking sketch distinguishes documented architecture from untested tactics.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The ranking sketch distinguishes documented architecture from untested tactics.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for separate ranking signals from folklore?",
          "answer": "The ranking sketch distinguishes documented architecture from untested tactics. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to separate ranking signals from folklore. The ranking sketch distinguishes documented architecture from untested tactics.",
        "demo": "Draw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate separate ranking signals from folklore",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Draw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties. The ranking sketch distinguishes documented architecture from untested tactics.",
        "on_screen_text": [
          "Separate ranking signals from folklore",
          "The ranking sketch distinguishes documented architecture from untested tactics."
        ],
        "screen_recording_instructions": [
          "Draw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties.",
          "Inspect the result: The ranking sketch distinguishes documented architecture from untested tactics.",
          "Record the evidence and check each criterion."
        ],
        "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 ranking sketch distinguishes documented architecture from untested tactics."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Draw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties.",
          "The ranking sketch distinguishes documented architecture from untested tactics."
        ]
      },
      "step_id": "L05-S01",
      "lesson_id": "L05"
    },
    {
      "title": "Build a local search brief",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Write three queries a neighbor might use, such as bicycle brake repair meetup. Draft a descriptive Group/Event title and an About summary. Treat public search visibility as conditional on access and indexing.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "The title, description and three queries match the same local need.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Build a local search brief",
        "success_condition": "The title, description and three queries match the same local need.",
        "how_to_verify": "Record the title, description and three queries match the same local need. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The title, description and three queries match the same local need.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The title, description and three queries match the same local need.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for build a local search brief?",
          "answer": "The title, description and three queries match the same local need. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to build a local search brief. The title, description and three queries match the same local need.",
        "demo": "Write three queries a neighbor might use, such as bicycle brake repair meetup. Draft a descriptive Group/Event title and an About summary. Treat public search visibility as conditional on access and indexing.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate build a local search brief",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Write three queries a neighbor might use, such as bicycle brake repair meetup. Draft a descriptive Group/Event title and an About summary. Treat public search visibility as conditional on access and indexing. The title, description and three queries match the same local need.",
        "on_screen_text": [
          "Build a local search brief",
          "The title, description and three queries match the same local need."
        ],
        "screen_recording_instructions": [
          "Write three queries a neighbor might use, such as bicycle brake repair meetup. Draft a descriptive Group/Event title and an About summary. Treat public search visibility as conditional on access and indexing.",
          "Inspect the result: The title, description and three queries match the same local need.",
          "Record the evidence and check each criterion."
        ],
        "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 title, description and three queries match the same local need."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Write three queries a neighbor might use, such as bicycle brake repair meetup. Draft a descriptive Group/Event title and an About summary. Treat public search visibility as conditional on access and indexing.",
          "The title, description and three queries match the same local need."
        ]
      },
      "step_id": "L06-S01",
      "lesson_id": "L06"
    },
    {
      "title": "Compose the controlled post pair",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Open studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Both versions ask about the same meetup and B adds useful context.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Compose the controlled post pair",
        "success_condition": "Both versions ask about the same meetup and B adds useful context.",
        "how_to_verify": "Record both versions ask about the same meetup and B adds useful context. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Both versions ask about the same meetup and B adds useful context.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Both versions ask about the same meetup and B adds useful context.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for compose the controlled post pair?",
          "answer": "Both versions ask about the same meetup and B adds useful context. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to compose the controlled post pair. Both versions ask about the same meetup and B adds useful context.",
        "demo": "Open studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate compose the controlled post pair",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Open studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement. Both versions ask about the same meetup and B adds useful context.",
        "on_screen_text": [
          "Compose the controlled post pair",
          "Both versions ask about the same meetup and B adds useful context."
        ],
        "screen_recording_instructions": [
          "Open studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement.",
          "Inspect the result: Both versions ask about the same meetup and B adds useful context.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Both versions ask about the same meetup and B adds useful context."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Open studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement.",
          "Both versions ask about the same meetup and B adds useful context."
        ]
      },
      "step_id": "L07-S01",
      "lesson_id": "L07"
    },
    {
      "title": "Say, write and show the same thing",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Plan a three-frame preview: bicycle brake close-up, volunteer inspection, meetup details. Write exact speech, overlay and caption for each frame in native-production.md. Label fictional timing and venue as draft.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Speech, image, caption and metadata describe the same meetup.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Say, write and show the same thing",
        "success_condition": "Speech, image, caption and metadata describe the same meetup.",
        "how_to_verify": "Record speech, image, caption and metadata describe the same meetup. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Speech, image, caption and metadata describe the same meetup.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Speech, image, caption and metadata describe the same meetup.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for say, write and show the same thing?",
          "answer": "Speech, image, caption and metadata describe the same meetup. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to say, write and show the same thing. Speech, image, caption and metadata describe the same meetup.",
        "demo": "Plan a three-frame preview: bicycle brake close-up, volunteer inspection, meetup details. Write exact speech, overlay and caption for each frame in native-production.md. Label fictional timing and venue as draft.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate say, write and show the same thing",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Plan a three-frame preview: bicycle brake close-up, volunteer inspection, meetup details. Write exact speech, overlay and caption for each frame in native-production.md. Label fictional timing and venue as draft. Speech, image, caption and metadata describe the same meetup.",
        "on_screen_text": [
          "Say, write and show the same thing",
          "Speech, image, caption and metadata describe the same meetup."
        ],
        "screen_recording_instructions": [
          "Plan a three-frame preview: bicycle brake close-up, volunteer inspection, meetup details. Write exact speech, overlay and caption for each frame in native-production.md. Label fictional timing and venue as draft.",
          "Inspect the result: Speech, image, caption and metadata describe the same meetup.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Speech, image, caption and metadata describe the same meetup."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Plan a three-frame preview: bicycle brake close-up, volunteer inspection, meetup details. Write exact speech, overlay and caption for each frame in native-production.md. Label fictional timing and venue as draft.",
          "Speech, image, caption and metadata describe the same meetup."
        ]
      },
      "step_id": "L08-S01",
      "lesson_id": "L08"
    },
    {
      "title": "Design a Reel that stands alone",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Write a 30-second story for one question: what information should a neighbor bring? Try definition, question, demonstration, lesson, mistake and solution variants. Deliver the answer before the next-action cue.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Six micro-knowledge archetypes have a clear payoff.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Design a Reel that stands alone",
        "success_condition": "Six micro-knowledge archetypes have a clear payoff.",
        "how_to_verify": "Record six micro-knowledge archetypes have a clear payoff. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Six micro-knowledge archetypes have a clear payoff.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Six micro-knowledge archetypes have a clear payoff.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for design a reel that stands alone?",
          "answer": "Six micro-knowledge archetypes have a clear payoff. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to design a Reel that stands alone. Six micro-knowledge archetypes have a clear payoff.",
        "demo": "Write a 30-second story for one question: what information should a neighbor bring? Try definition, question, demonstration, lesson, mistake and solution variants. Deliver the answer before the next-action cue.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate design a reel that stands alone",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Write a 30-second story for one question: what information should a neighbor bring? Try definition, question, demonstration, lesson, mistake and solution variants. Deliver the answer before the next-action cue. Six micro-knowledge archetypes have a clear payoff.",
        "on_screen_text": [
          "Design a Reel that stands alone",
          "Six micro-knowledge archetypes have a clear payoff."
        ],
        "screen_recording_instructions": [
          "Write a 30-second story for one question: what information should a neighbor bring? Try definition, question, demonstration, lesson, mistake and solution variants. Deliver the answer before the next-action cue.",
          "Inspect the result: Six micro-knowledge archetypes have a clear payoff.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Six micro-knowledge archetypes have a clear payoff."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Write a 30-second story for one question: what information should a neighbor bring? Try definition, question, demonstration, lesson, mistake and solution variants. Deliver the answer before the next-action cue.",
          "Six micro-knowledge archetypes have a clear payoff."
        ]
      },
      "step_id": "L09-S01",
      "lesson_id": "L09"
    },
    {
      "title": "Plan the depth ladder",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Connect a Reel to the invitation, comments, Group guide and an organizer FAQ. Explain how a person can start at any depth without needing the previous post.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "A five-level map connects micro, medium, discussion, community and deep reference.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Plan the depth ladder",
        "success_condition": "A five-level map connects micro, medium, discussion, community and deep reference.",
        "how_to_verify": "Record a five-level map connects micro, medium, discussion, community and deep reference. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "A five-level map connects micro, medium, discussion, community and deep reference.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. A five-level map connects micro, medium, discussion, community and deep reference.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for plan the depth ladder?",
          "answer": "A five-level map connects micro, medium, discussion, community and deep reference. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to plan the depth ladder. A five-level map connects micro, medium, discussion, community and deep reference.",
        "demo": "Connect a Reel to the invitation, comments, Group guide and an organizer FAQ. Explain how a person can start at any depth without needing the previous post.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate plan the depth ladder",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Connect a Reel to the invitation, comments, Group guide and an organizer FAQ. Explain how a person can start at any depth without needing the previous post. A five-level map connects micro, medium, discussion, community and deep reference.",
        "on_screen_text": [
          "Plan the depth ladder",
          "A five-level map connects micro, medium, discussion, community and deep reference."
        ],
        "screen_recording_instructions": [
          "Connect a Reel to the invitation, comments, Group guide and an organizer FAQ. Explain how a person can start at any depth without needing the previous post.",
          "Inspect the result: A five-level map connects micro, medium, discussion, community and deep reference.",
          "Record the evidence and check each criterion."
        ],
        "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 five-level map connects micro, medium, discussion, community and deep reference."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Connect a Reel to the invitation, comments, Group guide and an organizer FAQ. Explain how a person can start at any depth without needing the previous post.",
          "A five-level map connects micro, medium, discussion, community and deep reference."
        ]
      },
      "step_id": "L10-S01",
      "lesson_id": "L10"
    },
    {
      "title": "Turn comments into useful answers",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Write three synthetic replies: a beginner question, an accessibility concern and an unresolved mechanical symptom. Respond without inventing a diagnosis; separate observation, expert inspection and confirmed information.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Turn comments into useful answers",
        "success_condition": "The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
        "how_to_verify": "Record the response plan contains a resolved logistical answer and an explicit unresolved symptom. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for turn comments into useful answers?",
          "answer": "The response plan contains a resolved logistical answer and an explicit unresolved symptom. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to turn comments into useful answers. The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
        "demo": "Write three synthetic replies: a beginner question, an accessibility concern and an unresolved mechanical symptom. Respond without inventing a diagnosis; separate observation, expert inspection and confirmed information.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate turn comments into useful answers",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Write three synthetic replies: a beginner question, an accessibility concern and an unresolved mechanical symptom. Respond without inventing a diagnosis; separate observation, expert inspection and confirmed information. The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
        "on_screen_text": [
          "Turn comments into useful answers",
          "The response plan contains a resolved logistical answer and an explicit unresolved symptom."
        ],
        "screen_recording_instructions": [
          "Write three synthetic replies: a beginner question, an accessibility concern and an unresolved mechanical symptom. Respond without inventing a diagnosis; separate observation, expert inspection and confirmed information.",
          "Inspect the result: The response plan contains a resolved logistical answer and an explicit unresolved symptom.",
          "Record the evidence and check each criterion."
        ],
        "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 response plan contains a resolved logistical answer and an explicit unresolved symptom."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Write three synthetic replies: a beginner question, an accessibility concern and an unresolved mechanical symptom. Respond without inventing a diagnosis; separate observation, expert inspection and confirmed information.",
          "The response plan contains a resolved logistical answer and an explicit unresolved symptom."
        ]
      },
      "step_id": "L11-S01",
      "lesson_id": "L11"
    },
    {
      "title": "Close the community knowledge loop",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Map content → question → comment → answer → follow-up → discussion → FAQ → updated invitation. Draft one new FAQ from the accessibility question, marking its source as synthetic practice.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "An eight-stage loop updates the invitation from a concrete question.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Close the community knowledge loop",
        "success_condition": "An eight-stage loop updates the invitation from a concrete question.",
        "how_to_verify": "Record an eight-stage loop updates the invitation from a concrete question. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "An eight-stage loop updates the invitation from a concrete question.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. An eight-stage loop updates the invitation from a concrete question.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for close the community knowledge loop?",
          "answer": "An eight-stage loop updates the invitation from a concrete question. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to close the community knowledge loop. An eight-stage loop updates the invitation from a concrete question.",
        "demo": "Map content → question → comment → answer → follow-up → discussion → FAQ → updated invitation. Draft one new FAQ from the accessibility question, marking its source as synthetic practice.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate close the community knowledge loop",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Map content → question → comment → answer → follow-up → discussion → FAQ → updated invitation. Draft one new FAQ from the accessibility question, marking its source as synthetic practice. An eight-stage loop updates the invitation from a concrete question.",
        "on_screen_text": [
          "Close the community knowledge loop",
          "An eight-stage loop updates the invitation from a concrete question."
        ],
        "screen_recording_instructions": [
          "Map content → question → comment → answer → follow-up → discussion → FAQ → updated invitation. Draft one new FAQ from the accessibility question, marking its source as synthetic practice.",
          "Inspect the result: An eight-stage loop updates the invitation from a concrete question.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "An eight-stage loop updates the invitation from a concrete question."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Map content → question → comment → answer → follow-up → discussion → FAQ → updated invitation. Draft one new FAQ from the accessibility question, marking its source as synthetic practice.",
          "An eight-stage loop updates the invitation from a concrete question."
        ]
      },
      "step_id": "L12-S01",
      "lesson_id": "L12"
    },
    {
      "title": "Make a Group guide and moderation rule",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Design pinned-guide headings and a moderator escalation for unsafe advice or exposed addresses. Define when a member observation becomes verified knowledge.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "A guide outline, verification rule and moderator escalation exist.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Make a Group guide and moderation rule",
        "success_condition": "A guide outline, verification rule and moderator escalation exist.",
        "how_to_verify": "Record a guide outline, verification rule and moderator escalation exist. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "A guide outline, verification rule and moderator escalation exist.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. A guide outline, verification rule and moderator escalation exist.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for make a group guide and moderation rule?",
          "answer": "A guide outline, verification rule and moderator escalation exist. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to make a Group guide and moderation rule. A guide outline, verification rule and moderator escalation exist.",
        "demo": "Design pinned-guide headings and a moderator escalation for unsafe advice or exposed addresses. Define when a member observation becomes verified knowledge.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate make a group guide and moderation rule",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Design pinned-guide headings and a moderator escalation for unsafe advice or exposed addresses. Define when a member observation becomes verified knowledge. A guide outline, verification rule and moderator escalation exist.",
        "on_screen_text": [
          "Make a Group guide and moderation rule",
          "A guide outline, verification rule and moderator escalation exist."
        ],
        "screen_recording_instructions": [
          "Design pinned-guide headings and a moderator escalation for unsafe advice or exposed addresses. Define when a member observation becomes verified knowledge.",
          "Inspect the result: A guide outline, verification rule and moderator escalation exist.",
          "Record the evidence and check each criterion."
        ],
        "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 guide outline, verification rule and moderator escalation exist."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Design pinned-guide headings and a moderator escalation for unsafe advice or exposed addresses. Define when a member observation becomes verified knowledge.",
          "A guide outline, verification rule and moderator escalation exist."
        ]
      },
      "step_id": "L13-S01",
      "lesson_id": "L13"
    },
    {
      "title": "Build a discussion graph",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Draw question → topic → volunteer expert → verified answer → bicycle component → tutorial. Include unresolved status and correction dates.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Six named node types preserve relationships and uncertainty.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Build a discussion graph",
        "success_condition": "Six named node types preserve relationships and uncertainty.",
        "how_to_verify": "Record six named node types preserve relationships and uncertainty. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Six named node types preserve relationships and uncertainty.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Six named node types preserve relationships and uncertainty.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for build a discussion graph?",
          "answer": "Six named node types preserve relationships and uncertainty. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to build a discussion graph. Six named node types preserve relationships and uncertainty.",
        "demo": "Draw question → topic → volunteer expert → verified answer → bicycle component → tutorial. Include unresolved status and correction dates.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate build a discussion graph",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Draw question → topic → volunteer expert → verified answer → bicycle component → tutorial. Include unresolved status and correction dates. Six named node types preserve relationships and uncertainty.",
        "on_screen_text": [
          "Build a discussion graph",
          "Six named node types preserve relationships and uncertainty."
        ],
        "screen_recording_instructions": [
          "Draw question → topic → volunteer expert → verified answer → bicycle component → tutorial. Include unresolved status and correction dates.",
          "Inspect the result: Six named node types preserve relationships and uncertainty.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Six named node types preserve relationships and uncertainty."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Draw question → topic → volunteer expert → verified answer → bicycle component → tutorial. Include unresolved status and correction dates.",
          "Six named node types preserve relationships and uncertainty."
        ]
      },
      "step_id": "L14-S01",
      "lesson_id": "L14"
    },
    {
      "title": "Localize without changing the invitation",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Translate one short invitation into a language you know, or prepare a reviewer brief. Preserve the confirmed time, venue and component names. Describe cultural context; do not assert identical embedding coordinates.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "A translation draft or review plan preserves logistical facts.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Localize without changing the invitation",
        "success_condition": "A translation draft or review plan preserves logistical facts.",
        "how_to_verify": "Record a translation draft or review plan preserves logistical facts. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "A translation draft or review plan preserves logistical facts.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. A translation draft or review plan preserves logistical facts.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for localize without changing the invitation?",
          "answer": "A translation draft or review plan preserves logistical facts. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to localize without changing the invitation. A translation draft or review plan preserves logistical facts.",
        "demo": "Translate one short invitation into a language you know, or prepare a reviewer brief. Preserve the confirmed time, venue and component names. Describe cultural context; do not assert identical embedding coordinates.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate localize without changing the invitation",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Translate one short invitation into a language you know, or prepare a reviewer brief. Preserve the confirmed time, venue and component names. Describe cultural context; do not assert identical embedding coordinates. A translation draft or review plan preserves logistical facts.",
        "on_screen_text": [
          "Localize without changing the invitation",
          "A translation draft or review plan preserves logistical facts."
        ],
        "screen_recording_instructions": [
          "Translate one short invitation into a language you know, or prepare a reviewer brief. Preserve the confirmed time, venue and component names. Describe cultural context; do not assert identical embedding coordinates.",
          "Inspect the result: A translation draft or review plan preserves logistical facts.",
          "Record the evidence and check each criterion."
        ],
        "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 translation draft or review plan preserves logistical facts."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Translate one short invitation into a language you know, or prepare a reviewer brief. Preserve the confirmed time, venue and component names. Describe cultural context; do not assert identical embedding coordinates.",
          "A translation draft or review plan preserves logistical facts."
        ]
      },
      "step_id": "L15-S01",
      "lesson_id": "L15"
    },
    {
      "title": "Use entities and question-first writing",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Define bicycle brakes as a bicycle component and repair meetup as an event. Rewrite the opening as a direct question with audience, context and limits.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Entity definitions and a direct answer replace vague references.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Use entities and question-first writing",
        "success_condition": "Entity definitions and a direct answer replace vague references.",
        "how_to_verify": "Record entity definitions and a direct answer replace vague references. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Entity definitions and a direct answer replace vague references.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Entity definitions and a direct answer replace vague references.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for use entities and question-first writing?",
          "answer": "Entity definitions and a direct answer replace vague references. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to use entities and question-first writing. Entity definitions and a direct answer replace vague references.",
        "demo": "Define bicycle brakes as a bicycle component and repair meetup as an event. Rewrite the opening as a direct question with audience, context and limits.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate use entities and question-first writing",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Define bicycle brakes as a bicycle component and repair meetup as an event. Rewrite the opening as a direct question with audience, context and limits. Entity definitions and a direct answer replace vague references.",
        "on_screen_text": [
          "Use entities and question-first writing",
          "Entity definitions and a direct answer replace vague references."
        ],
        "screen_recording_instructions": [
          "Define bicycle brakes as a bicycle component and repair meetup as an event. Rewrite the opening as a direct question with audience, context and limits.",
          "Inspect the result: Entity definitions and a direct answer replace vague references.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Entity definitions and a direct answer replace vague references."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Define bicycle brakes as a bicycle component and repair meetup as an event. Rewrite the opening as a direct question with audience, context and limits.",
          "Entity definitions and a direct answer replace vague references."
        ]
      },
      "step_id": "L16-S01",
      "lesson_id": "L16"
    },
    {
      "title": "Plan authentic community feedback",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Describe consent before quoting members, capture original questions and distinguish real comments from synthetic exercises. Explain why manufactured comments or bot swarms damage trust.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "The feedback plan protects identity and labels synthetic examples.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Plan authentic community feedback",
        "success_condition": "The feedback plan protects identity and labels synthetic examples.",
        "how_to_verify": "Record the feedback plan protects identity and labels synthetic examples. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The feedback plan protects identity and labels synthetic examples.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The feedback plan protects identity and labels synthetic examples.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for plan authentic community feedback?",
          "answer": "The feedback plan protects identity and labels synthetic examples. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to plan authentic community feedback. The feedback plan protects identity and labels synthetic examples.",
        "demo": "Describe consent before quoting members, capture original questions and distinguish real comments from synthetic exercises. Explain why manufactured comments or bot swarms damage trust.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate plan authentic community feedback",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Describe consent before quoting members, capture original questions and distinguish real comments from synthetic exercises. Explain why manufactured comments or bot swarms damage trust. The feedback plan protects identity and labels synthetic examples.",
        "on_screen_text": [
          "Plan authentic community feedback",
          "The feedback plan protects identity and labels synthetic examples."
        ],
        "screen_recording_instructions": [
          "Describe consent before quoting members, capture original questions and distinguish real comments from synthetic exercises. Explain why manufactured comments or bot swarms damage trust.",
          "Inspect the result: The feedback plan protects identity and labels synthetic examples.",
          "Record the evidence and check each criterion."
        ],
        "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 feedback plan protects identity and labels synthetic examples."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Describe consent before quoting members, capture original questions and distinguish real comments from synthetic exercises. Explain why manufactured comments or bot swarms damage trust.",
          "The feedback plan protects identity and labels synthetic examples."
        ]
      },
      "step_id": "L17-S01",
      "lesson_id": "L17"
    },
    {
      "title": "Design the thirteen-layer package",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "List post, visual/video, caption, transcript, seed-question draft, discussion, FAQ, article, course, JSON-LD object, translation, retrieval chunk and agent card. Link each layer to the same repair topic.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Thirteen linked layer descriptions have no missing purpose.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Design the thirteen-layer package",
        "success_condition": "Thirteen linked layer descriptions have no missing purpose.",
        "how_to_verify": "Record thirteen linked layer descriptions have no missing purpose. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Thirteen linked layer descriptions have no missing purpose.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Thirteen linked layer descriptions have no missing purpose.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for design the thirteen-layer package?",
          "answer": "Thirteen linked layer descriptions have no missing purpose. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to design the thirteen-layer package. Thirteen linked layer descriptions have no missing purpose.",
        "demo": "List post, visual/video, caption, transcript, seed-question draft, discussion, FAQ, article, course, JSON-LD object, translation, retrieval chunk and agent card. Link each layer to the same repair topic.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate design the thirteen-layer package",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "List post, visual/video, caption, transcript, seed-question draft, discussion, FAQ, article, course, JSON-LD object, translation, retrieval chunk and agent card. Link each layer to the same repair topic. Thirteen linked layer descriptions have no missing purpose.",
        "on_screen_text": [
          "Design the thirteen-layer package",
          "Thirteen linked layer descriptions have no missing purpose."
        ],
        "screen_recording_instructions": [
          "List post, visual/video, caption, transcript, seed-question draft, discussion, FAQ, article, course, JSON-LD object, translation, retrieval chunk and agent card. Link each layer to the same repair topic.",
          "Inspect the result: Thirteen linked layer descriptions have no missing purpose.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Thirteen linked layer descriptions have no missing purpose."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "List post, visual/video, caption, transcript, seed-question draft, discussion, FAQ, article, course, JSON-LD object, translation, retrieval chunk and agent card. Link each layer to the same repair topic.",
          "Thirteen linked layer descriptions have no missing purpose."
        ]
      },
      "step_id": "L18-S01",
      "lesson_id": "L18"
    },
    {
      "title": "Recompose one live-show idea",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Imagine a Late Night with Build Bots Better repair segment. Extract a community challenge, an educational clip, a source ledger and an organizer FAQ. Reframe the Facebook discussion for YouTube, TikTok, X and a website without copying identical captions.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json"
      ],
      "expected_result": "Four native adaptations and a broadcast-to-knowledge plan exist.",
      "resources": [
        "native-production.md",
        "native.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Recompose one live-show idea",
        "success_condition": "Four native adaptations and a broadcast-to-knowledge plan exist.",
        "how_to_verify": "Record four native adaptations and a broadcast-to-knowledge plan exist. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Four native adaptations and a broadcast-to-knowledge plan exist.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Four native adaptations and a broadcast-to-knowledge plan exist.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for recompose one live-show idea?",
          "answer": "Four native adaptations and a broadcast-to-knowledge plan exist. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to recompose one live-show idea. Four native adaptations and a broadcast-to-knowledge plan exist.",
        "demo": "Imagine a Late Night with Build Bots Better repair segment. Extract a community challenge, an educational clip, a source ledger and an organizer FAQ. Reframe the Facebook discussion for YouTube, TikTok, X and a website without copying identical captions.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate recompose one live-show idea",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Imagine a Late Night with Build Bots Better repair segment. Extract a community challenge, an educational clip, a source ledger and an organizer FAQ. Reframe the Facebook discussion for YouTube, TikTok, X and a website without copying identical captions. Four native adaptations and a broadcast-to-knowledge plan exist.",
        "on_screen_text": [
          "Recompose one live-show idea",
          "Four native adaptations and a broadcast-to-knowledge plan exist."
        ],
        "screen_recording_instructions": [
          "Imagine a Late Night with Build Bots Better repair segment. Extract a community challenge, an educational clip, a source ledger and an organizer FAQ. Reframe the Facebook discussion for YouTube, TikTok, X and a website without copying identical captions.",
          "Inspect the result: Four native adaptations and a broadcast-to-knowledge plan exist.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Four native adaptations and a broadcast-to-knowledge plan exist."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Imagine a Late Night with Build Bots Better repair segment. Extract a community challenge, an educational clip, a source ledger and an organizer FAQ. Reframe the Facebook discussion for YouTube, TikTok, X and a website without copying identical captions.",
          "Four native adaptations and a broadcast-to-knowledge plan exist."
        ]
      },
      "step_id": "L19-S01",
      "lesson_id": "L19"
    },
    {
      "title": "Design six experiments and three versions",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Save traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "experiments.md",
        "metrics.json"
      ],
      "expected_result": "Three same-topic versions and six test proposals include controls and metrics.",
      "resources": [
        "experiments.md",
        "metrics.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Design six experiments and three versions",
        "success_condition": "Three same-topic versions and six test proposals include controls and metrics.",
        "how_to_verify": "Record three same-topic versions and six test proposals include controls and metrics. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Three same-topic versions and six test proposals include controls and metrics.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. Three same-topic versions and six test proposals include controls and metrics.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for design six experiments and three versions?",
          "answer": "Three same-topic versions and six test proposals include controls and metrics. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to design six experiments and three versions. Three same-topic versions and six test proposals include controls and metrics.",
        "demo": "Save traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate design six experiments and three versions",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Save traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes. Three same-topic versions and six test proposals include controls and metrics.",
        "on_screen_text": [
          "Design six experiments and three versions",
          "Three same-topic versions and six test proposals include controls and metrics."
        ],
        "screen_recording_instructions": [
          "Save traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes.",
          "Inspect the result: Three same-topic versions and six test proposals include controls and metrics.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "Three same-topic versions and six test proposals include controls and metrics."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Save traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes.",
          "Three same-topic versions and six test proposals include controls and metrics."
        ]
      },
      "step_id": "L20-S01",
      "lesson_id": "L20"
    },
    {
      "title": "Audit the full invitation",
      "purpose": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "user_action": "Review the local intent, rules, factual logistics, privacy, captions, readability and next action. Mark future agent discovery and SI as speculation; replace algorithm tricks with a reusable community asset. Review the primary native AI source in AGENT_OPERATING_MANUAL.md. Record documented inputs/outputs, actual account availability (or NOT VERIFIED), a useful native application and a privacy/failure limit. Use this platform’s CTA chain from agent-training.json, rather than importing another platform’s CTA.",
      "explanation": "Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience. Keep the saved artifact and a specific observation together.",
      "estimated_time": "12 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "native-production.md",
        "native.json",
        "AGENT_OPERATING_MANUAL.md",
        "agent-training.json"
      ],
      "expected_result": "A human review decision lists remaining blockers before publication.",
      "resources": [
        "native-production.md",
        "native.json",
        "AGENT_OPERATING_MANUAL.md",
        "agent-training.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Audit the full invitation",
        "success_condition": "A human review decision lists remaining blockers before publication.",
        "how_to_verify": "Record a human review decision lists remaining blockers before publication. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "A human review decision lists remaining blockers before publication.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. A human review decision lists remaining blockers before publication.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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 is a useful result for audit the full invitation?",
          "answer": "A human review decision lists remaining blockers before publication. Include the actual draft, source date or human observation rather than a claim that the algorithm will reward it."
        },
        {
          "question": "Can I use a different topic?",
          "answer": "Yes. Keep the same audience, topic, format and promise across your comparison versions. Update every entity/source/knowledge artifact consistently."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to audit the full invitation. A human review decision lists remaining blockers before publication.",
        "demo": "Review the local intent, rules, factual logistics, privacy, captions, readability and next action. Mark future agent discovery and SI as speculation; replace algorithm tricks with a reusable community asset. Review the primary native AI source in AGENT_OPERATING_MANUAL.md. Record documented inputs/outputs, actual account availability (or NOT VERIFIED), a useful native application and a privacy/failure limit. Use this platform’s CTA chain from agent-training.json, rather than importing another platform’s CTA.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate audit the full invitation",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Review the local intent, rules, factual logistics, privacy, captions, readability and next action. Mark future agent discovery and SI as speculation; replace algorithm tricks with a reusable community asset. Review the primary native AI source in AGENT_OPERATING_MANUAL.md. Record documented inputs/outputs, actual account availability (or NOT VERIFIED), a useful native application and a privacy/failure limit. Use this platform’s CTA chain from agent-training.json, rather than importing another platform’s CTA. A human review decision lists remaining blockers before publication.",
        "on_screen_text": [
          "Audit the full invitation",
          "A human review decision lists remaining blockers before publication."
        ],
        "screen_recording_instructions": [
          "Review the local intent, rules, factual logistics, privacy, captions, readability and next action. Mark future agent discovery and SI as speculation; replace algorithm tricks with a reusable community asset. Review the primary native AI source in AGENT_OPERATING_MANUAL.md. Record documented inputs/outputs, actual account availability (or NOT VERIFIED), a useful native application and a privacy/failure limit. Use this platform’s CTA chain from agent-training.json, rather than importing another platform’s CTA.",
          "Inspect the result: A human review decision lists remaining blockers before publication.",
          "Record the evidence and check each criterion."
        ],
        "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 human review decision lists remaining blockers before publication."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Review the local intent, rules, factual logistics, privacy, captions, readability and next action. Mark future agent discovery and SI as speculation; replace algorithm tricks with a reusable community asset. Review the primary native AI source in AGENT_OPERATING_MANUAL.md. Record documented inputs/outputs, actual account availability (or NOT VERIFIED), a useful native application and a privacy/failure limit. Use this platform’s CTA chain from agent-training.json, rather than importing another platform’s CTA.",
          "A human review decision lists remaining blockers before publication."
        ]
      },
      "step_id": "L21-S01",
      "lesson_id": "L21"
    },
    {
      "title": "Set up the practice folder",
      "purpose": "A dedicated folder makes mistakes easy to diagnose and keeps real project files separate.",
      "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": "A dedicated folder makes mistakes easy to diagnose and keeps real project files separate.",
      "estimated_time": "6 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 python reports version 3.10 or newer and the terminal is in the extracted resource folder. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "Python is 3.10 or newer.",
          "The listed files match the downloaded resources."
        ],
        "tokens": [],
        "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."
      },
      "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": "Does the file list include the resource named by the next step?",
          "fix": "Install Python from python.org with the PATH option; reopen the terminal and change into the extracted 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": "How do I verify set up the practice folder?",
          "answer": "Python reports version 3.10 or newer and the terminal is in the extracted resource folder. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use your saved work from the previous step. Work in the same practice folder."
        }
      ],
      "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": "Does the file list include the resource named by the next step?"
      },
      "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": "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.",
        "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.",
          "Inspect the result: Python reports version 3.10 or newer and the terminal is in the extracted resource folder.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "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": "L22-S01",
      "lesson_id": "L22"
    },
    {
      "title": "Audit the mechanism and claim ledger",
      "purpose": "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
      "user_action": "Read mechanisms.md and claims.json. Attach a direct source and date to established claims; distinguish hypothesis from evidence and future SI from deployed features. Edit knowledge.json and rag.jsonl so each answer stands alone with named entities and a source.",
      "explanation": "Keep the input and the observed result together so you can reproduce this action later.",
      "estimated_time": "4 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "mechanisms.md",
        "claims.json",
        "knowledge.json",
        "rag.jsonl"
      ],
      "expected_result": "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
      "resources": [
        "mechanisms.md",
        "claims.json",
        "knowledge.json",
        "rag.jsonl"
      ],
      "checkpoint": {
        "what_is_being_checked": "Audit the mechanism and claim ledger",
        "success_condition": "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
        "how_to_verify": "Record the ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify audit the mechanism and claim ledger?",
          "answer": "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use mechanisms.md, claims.json, knowledge.json, rag.jsonl. Work in the same practice folder."
        }
      ],
      "quiz": {
        "question": "Does a readable public post guarantee model training?",
        "answer_type": "single_choice",
        "choices": [
          "No; access, selection and training decisions are separate from post clarity.",
          "Yes; entity names force weight updates."
        ],
        "correct_answer": 0,
        "explanation": "Retrieval supplies inference context; training changes weights."
      },
      "coach": {
        "intro": "We are going to audit the mechanism and claim ledger. The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
        "demo": "Read mechanisms.md and claims.json. Attach a direct source and date to established claims; distinguish hypothesis from evidence and future SI from deployed features. Edit knowledge.json and rag.jsonl so each answer stands alone with named entities and a source.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate audit the mechanism and claim ledger",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Read mechanisms.md and claims.json. Attach a direct source and date to established claims; distinguish hypothesis from evidence and future SI from deployed features. Edit knowledge.json and rag.jsonl so each answer stands alone with named entities and a source. The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
        "on_screen_text": [
          "Audit the mechanism and claim ledger",
          "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone."
        ],
        "screen_recording_instructions": [
          "Read mechanisms.md and claims.json. Attach a direct source and date to established claims; distinguish hypothesis from evidence and future SI from deployed features. Edit knowledge.json and rag.jsonl so each answer stands alone with named entities and a source.",
          "Inspect the result: The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone.",
          "Record the evidence and check each criterion."
        ],
        "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 ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Read mechanisms.md and claims.json. Attach a direct source and date to established claims; distinguish hypothesis from evidence and future SI from deployed features. Edit knowledge.json and rag.jsonl so each answer stands alone with named entities and a source.",
          "The ledger separates training, retrieval, indexing, context, citation and action; two source-linked chunks stand alone."
        ]
      },
      "step_id": "L22-S02",
      "lesson_id": "L22"
    },
    {
      "title": "Use the readiness calculator",
      "purpose": "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
      "user_action": "Open studio.html and score each dimension from 0 to 10 with a written reason. Download versions.json and rubric.json; replace the matching extracted files after reviewing them. Leave metrics.json NOT RUN unless you have actual observations. Facebook uses eleven dimensions normalized by dividing by 110 and multiplying by 100.",
      "explanation": "Keep the input and the observed result together so you can reproduce this action later.",
      "estimated_time": "4 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "studio.html",
        "rubric.json",
        "versions.json",
        "metrics.json"
      ],
      "expected_result": "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
      "resources": [
        "studio.html",
        "rubric.json",
        "versions.json",
        "metrics.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Use the readiness calculator",
        "success_condition": "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
        "how_to_verify": "Record a downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify use the readiness calculator?",
          "answer": "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use studio.html, rubric.json, versions.json, metrics.json. Work in the same practice folder."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to use the readiness calculator. A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
        "demo": "Open studio.html and score each dimension from 0 to 10 with a written reason. Download versions.json and rubric.json; replace the matching extracted files after reviewing them. Leave metrics.json NOT RUN unless you have actual observations. Facebook uses eleven dimensions normalized by dividing by 110 and multiplying by 100.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate use the readiness calculator",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Open studio.html and score each dimension from 0 to 10 with a written reason. Download versions.json and rubric.json; replace the matching extracted files after reviewing them. Leave metrics.json NOT RUN unless you have actual observations. Facebook uses eleven dimensions normalized by dividing by 110 and multiplying by 100. A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
        "on_screen_text": [
          "Use the readiness calculator",
          "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit."
        ],
        "screen_recording_instructions": [
          "Open studio.html and score each dimension from 0 to 10 with a written reason. Download versions.json and rubric.json; replace the matching extracted files after reviewing them. Leave metrics.json NOT RUN unless you have actual observations. Facebook uses eleven dimensions normalized by dividing by 110 and multiplying by 100.",
          "Inspect the result: A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit.",
          "Record the evidence and check each criterion."
        ],
        "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 downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Open studio.html and score each dimension from 0 to 10 with a written reason. Download versions.json and rubric.json; replace the matching extracted files after reviewing them. Leave metrics.json NOT RUN unless you have actual observations. Facebook uses eleven dimensions normalized by dividing by 110 and multiplying by 100.",
          "A downloadable pair and rubric are saved; the score is self-assessment and unrun metrics are explicit."
        ]
      },
      "step_id": "L23-S01",
      "lesson_id": "L23"
    },
    {
      "title": "Hash and lint the reviewed files",
      "purpose": "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
      "user_action": "Review your changes first. Run the hash command, then lint and score. Inspect report.json. Commands use the current extracted resource folder; PowerShell runs python, macOS zsh and Linux bash run python3. A missing field must be corrected before hashing again.",
      "explanation": "Keep the input and the observed result together so you can reproduce this action later.",
      "estimated_time": "4 min",
      "action_type": "command",
      "commands": {
        "windows": "python media_pack.py hash\npython media_pack.py lint\npython media_pack.py score",
        "macos": "python3 media_pack.py hash\npython3 media_pack.py lint\npython3 media_pack.py score",
        "linux": "python3 media_pack.py hash\npython3 media_pack.py lint\npython3 media_pack.py score"
      },
      "command_type": "shell",
      "required_inputs": [
        "media_pack.py",
        "agent-card.json"
      ],
      "expected_result": "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
      "resources": [
        "media_pack.py",
        "agent-card.json"
      ],
      "checkpoint": {
        "what_is_being_checked": "Hash and lint the reviewed files",
        "success_condition": "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
        "how_to_verify": "Record hASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "MEDIA PASS"
        ],
        "user_visible_success_message": "Evidence saved. HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify hash and lint the reviewed files?",
          "answer": "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use media_pack.py, agent-card.json. Work in the same practice folder."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to hash and lint the reviewed files. HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
        "demo": "Review your changes first. Run the hash command, then lint and score. Inspect report.json. Commands use the current extracted resource folder; PowerShell runs python, macOS zsh and Linux bash run python3. A missing field must be corrected before hashing again.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate hash and lint the reviewed files",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Review your changes first. Run the hash command, then lint and score. Inspect report.json. Commands use the current extracted resource folder; PowerShell runs python, macOS zsh and Linux bash run python3. A missing field must be corrected before hashing again. HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
        "on_screen_text": [
          "Hash and lint the reviewed files",
          "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric."
        ],
        "screen_recording_instructions": [
          "Review your changes first. Run the hash command, then lint and score. Inspect report.json. Commands use the current extracted resource folder; PowerShell runs python, macOS zsh and Linux bash run python3. A missing field must be corrected before hashing again.",
          "Inspect the result: HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Review your changes first. Run the hash command, then lint and score. Inspect report.json. Commands use the current extracted resource folder; PowerShell runs python, macOS zsh and Linux bash run python3. A missing field must be corrected before hashing again.",
          "HASH PASS and MEDIA PASS appear with exit 0; the readiness score matches the reviewed rubric."
        ]
      },
      "step_id": "L23-S02",
      "lesson_id": "L23"
    },
    {
      "title": "Prove changed bytes and broken content fail",
      "purpose": "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
      "user_action": "Change versions.json B.topic to a different topic. Run lint and retain MEDIA FAIL. Restore the same topic, review the repair, hash and lint again. Do not weaken the checker or present a structural pass as factual/media verification.",
      "explanation": "Keep the input and the observed result together so you can reproduce this action later.",
      "estimated_time": "4 min",
      "action_type": "command",
      "commands": {
        "windows": "python media_pack.py lint\n# After correcting and reviewing the topic:\npython media_pack.py hash\npython media_pack.py lint",
        "macos": "python3 media_pack.py lint\n# After correcting and reviewing the topic:\npython3 media_pack.py hash\npython3 media_pack.py lint",
        "linux": "python3 media_pack.py lint\n# After correcting and reviewing the topic:\npython3 media_pack.py hash\npython3 media_pack.py lint"
      },
      "command_type": "shell",
      "required_inputs": [
        "versions.json",
        "media_pack.py"
      ],
      "expected_result": "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
      "resources": [
        "versions.json",
        "media_pack.py"
      ],
      "checkpoint": {
        "what_is_being_checked": "Prove changed bytes and broken content fail",
        "success_condition": "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
        "how_to_verify": "Record a mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [
          "MEDIA PASS"
        ],
        "user_visible_success_message": "Evidence saved. A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify prove changed bytes and broken content fail?",
          "answer": "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use versions.json, media_pack.py. Work in the same practice folder."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to prove changed bytes and broken content fail. A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
        "demo": "Change versions.json B.topic to a different topic. Run lint and retain MEDIA FAIL. Restore the same topic, review the repair, hash and lint again. Do not weaken the checker or present a structural pass as factual/media verification.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate prove changed bytes and broken content fail",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Change versions.json B.topic to a different topic. Run lint and retain MEDIA FAIL. Restore the same topic, review the repair, hash and lint again. Do not weaken the checker or present a structural pass as factual/media verification. A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
        "on_screen_text": [
          "Prove changed bytes and broken content fail",
          "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS."
        ],
        "screen_recording_instructions": [
          "Change versions.json B.topic to a different topic. Run lint and retain MEDIA FAIL. Restore the same topic, review the repair, hash and lint again. Do not weaken the checker or present a structural pass as factual/media verification.",
          "Inspect the result: A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS.",
          "Record the evidence and check each criterion."
        ],
        "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 mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Change versions.json B.topic to a different topic. Run lint and retain MEDIA FAIL. Restore the same topic, review the repair, hash and lint again. Do not weaken the checker or present a structural pass as factual/media verification.",
          "A mismatched topic produces MEDIA FAIL; a reviewed correction produces MEDIA PASS."
        ]
      },
      "step_id": "L23-S03",
      "lesson_id": "L23"
    },
    {
      "title": "Run a source-linked retrieval probe",
      "purpose": "The relevant query returns source-linked chunks; the unrelated query abstains.",
      "user_action": "Run the supplied question, then an unrelated query. Inspect the answer and source. This standard-library demo uses lexical word overlap, not embeddings, a vector database or an AI citation measurement. Save actual OS command/exit/output and mark other OS branches unverified.",
      "explanation": "Keep the input and the observed result together so you can reproduce this action later.",
      "estimated_time": "4 min",
      "action_type": "command",
      "commands": {
        "windows": "python media_pack.py retrieve --query \"What information makes a bicycle brakes repair meetup useful to neighbors?\"\npython media_pack.py retrieve --query \"quasar waffle weather\"",
        "macos": "python3 media_pack.py retrieve --query \"What information makes a bicycle brakes repair meetup useful to neighbors?\"\npython3 media_pack.py retrieve --query \"quasar waffle weather\"",
        "linux": "python3 media_pack.py retrieve --query \"What information makes a bicycle brakes repair meetup useful to neighbors?\"\npython3 media_pack.py retrieve --query \"quasar waffle weather\""
      },
      "command_type": "shell",
      "required_inputs": [
        "media_pack.py",
        "rag.jsonl"
      ],
      "expected_result": "The relevant query returns source-linked chunks; the unrelated query abstains.",
      "resources": [
        "media_pack.py",
        "rag.jsonl"
      ],
      "checkpoint": {
        "what_is_being_checked": "Run a source-linked retrieval probe",
        "success_condition": "The relevant query returns source-linked chunks; the unrelated query abstains.",
        "how_to_verify": "Record the relevant query returns source-linked chunks; the unrelated query abstains. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The relevant query returns source-linked chunks; the unrelated query abstains.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The relevant query returns source-linked chunks; the unrelated query abstains.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify run a source-linked retrieval probe?",
          "answer": "The relevant query returns source-linked chunks; the unrelated query abstains. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use media_pack.py, rag.jsonl. Work in the same practice folder."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to run a source-linked retrieval probe. The relevant query returns source-linked chunks; the unrelated query abstains.",
        "demo": "Run the supplied question, then an unrelated query. Inspect the answer and source. This standard-library demo uses lexical word overlap, not embeddings, a vector database or an AI citation measurement. Save actual OS command/exit/output and mark other OS branches unverified.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate run a source-linked retrieval probe",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Run the supplied question, then an unrelated query. Inspect the answer and source. This standard-library demo uses lexical word overlap, not embeddings, a vector database or an AI citation measurement. Save actual OS command/exit/output and mark other OS branches unverified. The relevant query returns source-linked chunks; the unrelated query abstains.",
        "on_screen_text": [
          "Run a source-linked retrieval probe",
          "The relevant query returns source-linked chunks; the unrelated query abstains."
        ],
        "screen_recording_instructions": [
          "Run the supplied question, then an unrelated query. Inspect the answer and source. This standard-library demo uses lexical word overlap, not embeddings, a vector database or an AI citation measurement. Save actual OS command/exit/output and mark other OS branches unverified.",
          "Inspect the result: The relevant query returns source-linked chunks; the unrelated query abstains.",
          "Record the evidence and check each criterion."
        ],
        "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 relevant query returns source-linked chunks; the unrelated query abstains."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Run the supplied question, then an unrelated query. Inspect the answer and source. This standard-library demo uses lexical word overlap, not embeddings, a vector database or an AI citation measurement. Save actual OS command/exit/output and mark other OS branches unverified.",
          "The relevant query returns source-linked chunks; the unrelated query abstains."
        ]
      },
      "step_id": "L24-S01",
      "lesson_id": "L24"
    },
    {
      "title": "Record provenance and a human approval decision",
      "purpose": "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
      "user_action": "Use provenance-notes.md to record author, capture/source dates, rights, AI assistance and unresolved claims. SHA256 detects byte changes but does not sign the file or prove truth. Read the source/command cards, review the native capstone and export course evidence. Actual publication requires your own account, current rules and a human decision.",
      "explanation": "Keep the input and the observed result together so you can reproduce this action later.",
      "estimated_time": "4 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "command_type": "shell",
      "required_inputs": [
        "provenance-notes.md",
        "agent-card.json",
        "capstone.md"
      ],
      "expected_result": "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
      "resources": [
        "provenance-notes.md",
        "agent-card.json",
        "capstone.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Record provenance and a human approval decision",
        "success_condition": "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
        "how_to_verify": "Record the handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision. Include the actual result or a specific observation; do not paste credentials.",
        "criteria": [
          "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
          "I can repeat this action from the saved input."
        ],
        "tokens": [],
        "user_visible_success_message": "Evidence saved. The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify record provenance and a human approval decision?",
          "answer": "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use provenance-notes.md, agent-card.json, capstone.md. Work in the same practice folder."
        }
      ],
      "quiz": null,
      "coach": {
        "intro": "We are going to record provenance and a human approval decision. The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
        "demo": "Use provenance-notes.md to record author, capture/source dates, rights, AI assistance and unresolved claims. SHA256 detects byte changes but does not sign the file or prove truth. Read the source/command cards, review the native capstone and export course evidence. Actual publication requires your own account, current rules and a human decision.",
        "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "video": {
        "purpose": "Demonstrate record provenance and a human approval decision",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Use provenance-notes.md to record author, capture/source dates, rights, AI assistance and unresolved claims. SHA256 detects byte changes but does not sign the file or prove truth. Read the source/command cards, review the native capstone and export course evidence. Actual publication requires your own account, current rules and a human decision. The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
        "on_screen_text": [
          "Record provenance and a human approval decision",
          "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision."
        ],
        "screen_recording_instructions": [
          "Use provenance-notes.md to record author, capture/source dates, rights, AI assistance and unresolved claims. SHA256 detects byte changes but does not sign the file or prove truth. Read the source/command cards, review the native capstone and export course evidence. Actual publication requires your own account, current rules and a human decision.",
          "Inspect the result: The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision.",
          "Record the evidence and check each criterion."
        ],
        "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 handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Use provenance-notes.md to record author, capture/source dates, rights, AI assistance and unresolved claims. SHA256 detects byte changes but does not sign the file or prove truth. Read the source/command cards, review the native capstone and export course evidence. Actual publication requires your own account, current rules and a human decision.",
          "The handoff includes native drafts, source/rights review, unsigned integrity manifest, explicit live-status limits and an approval decision."
        ]
      },
      "step_id": "L24-S02",
      "lesson_id": "L24"
    },
    {
      "title": "Write a repeatable onboarding checklist",
      "purpose": "The September 23 BuildBotsBetter profile wipe removed Desktop, Documents and hidden agent memory together. Repeatable onboarding protects the knowledge needed to recover.",
      "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": "The September 23 BuildBotsBetter profile wipe removed Desktop, Documents and hidden agent memory together. Repeatable onboarding protects the knowledge needed to recover.",
      "estimated_time": "6 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 checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification. Include the actual result or a specific observation; do not paste credentials.",
        "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."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify write a repeatable onboarding checklist?",
          "answer": "The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use onboarding-checklist.md. Work in the same practice folder."
        }
      ],
      "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "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": "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.",
        "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.",
          "Inspect the result: The checklist contains a concrete path and owner for rules, memory, permissions, guard, backup, restore and final verification.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "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": "L25-S01",
      "lesson_id": "L25"
    },
    {
      "title": "Demonstrate the variable-path limit safely",
      "purpose": "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.",
      "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": "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.",
      "estimated_time": "6 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 gUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed. Include the actual result or a specific observation; do not paste credentials.",
        "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."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify demonstrate the variable-path limit safely?",
          "answer": "GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use workspace_guard.py. Work in the same practice folder."
        }
      ],
      "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "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": "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.",
        "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.",
          "Inspect the result: GUARD PASS reports inside allowed and profile, outside, variable-derived profile and workspace root denied; no deletion was executed.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "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": "L25-S02",
      "lesson_id": "L25"
    },
    {
      "title": "Verify the actual protection in your tool",
      "purpose": "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.",
      "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; 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.",
      "explanation": "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.",
      "estimated_time": "6 min",
      "action_type": "inspect",
      "commands": {
        "all": ""
      },
      "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 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. Include the actual result or a specific observation; do not paste credentials.",
        "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."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I install a guard for this tool?",
          "answer": "Use the linked BBB safety reference for the exact tool/version protocol. Merge into the existing hooks instead of overwriting settings. Review/trust the hook if required, then verify a harmless call and a denied dry-run. The workspace_guard.py file is a teaching demonstration, not a universal hook adapter."
        },
        {
          "question": "Does Grok Bot have a working local delete guard?",
          "answer": "The project’s live September 29 tests found no working shell hook. Restrict the tasks and workspace you hand it, keep independent backups, and do not claim local deletion is guarded."
        }
      ],
      "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "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": "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.",
        "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; 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.",
          "Inspect the 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.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "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": "L25-S03",
      "lesson_id": "L25"
    },
    {
      "title": "Enable a real backup of memory and project files",
      "purpose": "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.",
      "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.",
      "explanation": "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.",
      "estimated_time": "6 min",
      "action_type": "command",
      "commands": {
        "windows": ".\\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 a backup on another drive includes the tool’s user settings and memory folder and this project, and a successful schedule/time is recorded. Include the actual result or a specific observation; do not paste credentials.",
        "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": [],
        "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."
      },
      "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": "Can you create a scratch file on the actual second drive?",
          "fix": "Mount the drive and choose an accessible backup directory. Inspect every error; robocopy codes 8 and higher are failures.",
          "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": "How do I verify enable a real backup of memory and project files?",
          "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. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use profile-backup.ps1, profile-backup.sh, onboarding-checklist.md. Work in the same practice folder."
        }
      ],
      "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": "Can you create a scratch file on the actual second drive?"
      },
      "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": "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.",
        "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.",
          "Inspect the 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.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "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": "L25-S04",
      "lesson_id": "L25"
    },
    {
      "title": "Practice a hash-verified restore",
      "purpose": "A backup becomes useful only when restoration has been practiced. A same-volume practice copy proves the procedure but not protection against disk failure.",
      "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": "A backup becomes useful only when restoration has been practiced. A same-volume practice copy proves the procedure but not protection against disk failure.",
      "estimated_time": "6 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 rESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch. Include the actual result or a specific observation; do not paste credentials.",
        "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."
      },
      "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 is the current directory, exact command, exit code and complete output?",
          "fix": "Compare the input filename and working directory with this step. Rerun only after correcting that difference.",
          "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": "How do I verify practice a hash-verified restore?",
          "answer": "RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch. Keep the command or observation with your evidence."
        },
        {
          "question": "Which files do I need for this step?",
          "answer": "Use restore_drill.py. Work in the same practice folder."
        }
      ],
      "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": "What is the current directory, exact command, exit code and complete output?"
      },
      "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": "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.",
        "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.",
          "Inspect the result: RESTORE PASS contains matching hashes; the actual memory file is readable after restoration into scratch.",
          "Record the evidence and check each criterion."
        ],
        "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": [
          "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": "L25-S05",
      "lesson_id": "L25"
    }
  ],
  "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-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}\nmkdir -p \"$dest\"\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": "media_pack.py",
      "type": "py",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "# VERSION HISTORY\n# 2026-10-06 EDT | chatgpt_codex | media-catchup | v1: created structural draft checks, normalized scoring and lexical retrieval.\n\"\"\"Check local draft structure, provenance and retrieval. Never publishes content.\"\"\"\nimport argparse, hashlib, json, logging, math, re\nfrom datetime import datetime, timezone\nfrom pathlib import Path\n\nROOT=Path(__file__).resolve().parent\ndef read(name):return json.loads((ROOT/name).read_text(encoding='utf-8'))\ndef digest(p):return hashlib.sha256(p.read_bytes()).hexdigest()\ndef payloads():return sorted(p for p in ROOT.iterdir() if p.is_file() and p.name not in ['provenance.json','report.json','media-pack.log'] and not p.name.endswith('.zip'))\ndef issues():\n    problems=[]\n    try:\n        k=read('knowledge.json');versions=read('versions.json');cards=read('agent-card.json');rubric=read('rubric.json')\n        for field in ['topic','question','answer','context','entities','sources','author','date','next_action']:\n            if not k.get(field):problems.append('Missing knowledge field: '+field)\n        if not all(re.match(r'^https://[^/]+/.+',s) for s in k.get('sources',[])):problems.append('Source must be a direct HTTPS page')\n        if not all(e.casefold() in k['answer'].casefold() for e in k['entities']):problems.append('Answer lacks a named entity')\n        for entity in k['entities']:\n            if entity.casefold() not in versions['B']['text'].casefold():problems.append('Version B lacks entity '+entity)\n        if versions['A']['topic']!=versions['B']['topic'] or versions['A']['topic']!=k['topic']:problems.append('Comparison topic changed')\n        if versions['A']['format']!=versions['B']['format']:problems.append('Comparison format changed')\n        for version in versions.values():\n            if re.search(r'guarantee[sd]? (?:AI training|viral|ranking)',version['text'],re.I):problems.append('Unjustified outcome guarantee')\n            if not version['text'].strip():problems.append('Empty comparison')\n        if k['platform']=='threads' and any(len(v['text'])>500 for v in versions.values()):problems.append('Threads root draft exceeds 500 characters')\n        if k['platform']=='xai-xsi' and any(len(v['text'])>280 for v in versions.values()):problems.append('X practice root draft exceeds 280 characters')\n        if k['platform']=='pinterest':\n            pin=read('native.json')\n            if len(pin['title'])>100 or len(pin['description'])>500:problems.append('Pin practice metadata exceeds title/description limit')\n            if pin['ratio']!='2:3' or not pin['board'] or not pin['alt']:problems.append('Incomplete static Pin card')\n        for osname in ['windows','macos','linux']:\n            card=cards.get(osname,{})\n            if not all(card.get(f) is not None for f in ['shell','cwd','prerequisites','command','expected_exit','expected_output','failure','scope']):problems.append('Incomplete command card '+osname)\n            if card.get('expected_exit')!=0:problems.append('Unexpected success exit '+osname)\n        rows=[json.loads(line) for line in (ROOT/'rag.jsonl').read_text(encoding='utf-8').splitlines() if line.strip()]\n        if len({r['id'] for r in rows})!=len(rows) or len(rows)<2:problems.append('RAG IDs duplicate or too few rows')\n        for r in rows:\n            if not all(r.get(f) for f in ['id','entity','question','answer','source']):problems.append('Incomplete retrieval row')\n            if r['entity'].casefold() not in r['answer'].casefold():problems.append('Retrieval answer not standalone')\n        score(rubric)\n        manifest=read('provenance.json')\n        actual={p.name:digest(p) for p in payloads()}\n        if manifest['sha256']!=actual:problems.append('Changed bytes or missing provenance entries; review before hash')\n    except (KeyError,ValueError,TypeError,OSError) as e:problems.append('Invalid input: '+str(e))\n    return problems\ndef score(rubric):\n    values=rubric['values'];names=rubric['dimensions']\n    if len(values)!=len(names) or not values:raise ValueError('Rubric dimensions/values mismatch')\n    if any(isinstance(v,bool) or not isinstance(v,(int,float)) or not math.isfinite(v) or not 0<=v<=10 for v in values):raise ValueError('Scores must be finite numbers from 0 to 10')\n    return round(100*sum(values)/(10*len(values)),2)\ndef main():\n    logging.basicConfig(filename=ROOT/'media-pack.log',encoding='utf-8',level=logging.INFO)\n    parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('action',choices=['lint','hash','score','retrieve']);parser.add_argument('--query',default='');a=parser.parse_args()\n    if a.action=='hash':\n        data={'at':datetime.now(timezone.utc).isoformat(),'author':'learner draft','kind':'unsigned SHA256 integrity manifest; not C2PA or proof of truth','sha256':{p.name:digest(p) for p in payloads()}}\n        (ROOT/'provenance.json').write_text(json.dumps(data,indent=2),encoding='utf-8');print('HASH PASS: unsigned reviewed bytes')\n    elif a.action=='lint':\n        errors=issues();report={'result':'MEDIA FAIL' if errors else 'MEDIA PASS','issues':errors,'scope':'Structural local draft checks; no factual, publication, ranking, OCR/ASR or AI-training certification'}\n        (ROOT/'report.json').write_text(json.dumps(report,indent=2),encoding='utf-8');print(json.dumps(report,indent=2));logging.info('%s issues=%d',report['result'],len(errors));raise SystemExit(1 if errors else 0)\n    elif a.action=='score':print('READINESS '+str(score(read('rubric.json')))+' /100: subjective rubric; no distribution prediction')\n    else:\n        query=set(re.findall(r'\\w+',a.query.casefold()));rows=[json.loads(s) for s in (ROOT/'rag.jsonl').read_text(encoding='utf-8').splitlines() if s.strip()]\n        ranked=sorted([(len(query & set(re.findall(r'\\w+',r['question'].casefold()))),r) for r in rows],key=lambda x:x[0],reverse=True)\n        hits=[r for n,r in ranked if n>0][:2];print(json.dumps({'retrieval':'lexical demonstration, not vector embeddings','matches':hits,'abstained':not bool(hits)},indent=2))\nif __name__=='__main__':\n    try:main()\n    except Exception:logging.exception('Media pack failed');raise\n",
      "filename": "media_pack.py",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R007",
      "name": "studio.html",
      "type": "html",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "<!doctype html>\n<!-- VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original local native draft editor and score calculator.\n-->\n<html lang=\"en\"><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Native draft studio</title>\n<style>body{font:17px system-ui,sans-serif;background:#10151d;color:#f4f6fb;margin:0;padding:24px;max-width:1000px}textarea,input{font:inherit;background:#202a38;color:inherit;border:1px solid #687789;border-radius:5px;box-sizing:border-box;width:100%;padding:12px}textarea{min-height:160px}section{padding:18px;border:1px solid #687789;border-radius:8px;margin:16px 0}button{padding:12px;margin:8px;background:#b7f48a;border:0;border-radius:5px;color:#10151d}label{display:block;margin:12px 0}h1{font-size:clamp(26px,6vw,42px)}.pair{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:16px}small{display:block;color:#bac8d7}output{font-weight:bold}a{color:#b7f48a}</style>\n<h1>Facebook draft studio</h1><p>Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.</p><p>One topic, one format, two versions. Keep the audience and promise fixed. These drafts are synthetic practice examples.</p>\n<label>Topic <input id=\"topic\"></label><label>Native format <input id=\"format\"></label>\n<div class=\"pair\"><section><h2>A · Human baseline</h2><textarea id=\"a\"></textarea><small id=\"ac\"></small></section><section><h2>B · Human and machine clarity</h2><textarea id=\"b\"></textarea><small id=\"bc\"></small></section></div>\n<p id=\"difference\"></p><button id=\"export\">Download versions.json</button><p id=\"status\" role=\"status\"></p>\n<section><h2>Readiness self-assessment</h2><p>Rate each dimension from 0 to 10 using your saved evidence. The result measures this rubric, not the chance of virality or AI citation. Facebook's eleven dimensions are normalized to 100.</p><div id=\"scores\"></div><output id=\"total\"></output><button id=\"rubric-export\">Download rubric.json</button></section>\n<section><h2>Review before publication</h2><p>Check factual claims, media consent, community rules, current format limits and destination links. A readable draft does not guarantee model training, indexing or recommendation. This page saves downloads only; it sends nothing to a platform. Return to the course in your other browser tab after downloading your drafts.</p></section>\n<script>\n// VERSION HISTORY\n// 2026-10-06 EDT | chatgpt_codex | media-catchup | v1: local-only editor; no API or storage.\nconst initial={\"A\": {\"topic\": \"Repair meetup for squeaky bicycle brakes\", \"format\": \"local Group discussion\", \"text\": \"Anyone else fed up with squeaky brakes? Thinking of doing a little repair meetup on Saturday. Who is in?\"}, \"B\": {\"topic\": \"Repair meetup for squeaky bicycle brakes\", \"format\": \"local Group discussion\", \"text\": \"Bicycle brakes squeaking? Our neighborhood repair meetup draft is Saturday, 10 am at the community hall. Bring your bicycle model and describe when the squeak occurs. A volunteer mechanic will explain what needs inspection; this post is not a diagnosis. Which brake questions should we add to the session?\"}}, dimensions=[\"Human value\", \"Engagement depth\", \"Organic discovery\", \"Semantic clarity\", \"AI discoverability\", \"Retrieval readiness\", \"Community value\", \"Agent readiness\", \"Multilingual potential\", \"Provenance and trust\", \"Future longevity\"];\nconst $=id=>document.getElementById(id);\n$('topic').value=initial.A.topic;$('format').value=initial.A.format;$('a').value=initial.A.text;$('b').value=initial.B.text;\nfunction update(){for(const id of ['a','b'])$(id+'c').textContent=$(id).value.length+' characters';const entities=[\"bicycle brakes\", \"repair meetup\"];const missing=entities.filter(e=>!$('b').value.toLowerCase().includes(e.toLowerCase()));$('difference').textContent=missing.length?'B is missing named entities: '+missing.join(', '):'B contains the named entities. Review human tone, factual claims and context manually.';const inputs=[...document.querySelectorAll('#scores input')];$('total').textContent=(100*inputs.reduce((sum,x)=>sum+Number(x.value),0)/(10*dimensions.length)).toFixed(2)+' /100 · self-assessment';}\ndimensions.forEach((name,i)=>{const label=document.createElement('label');label.textContent=name;const input=document.createElement('input');input.type='range';input.min=0;input.max=10;input.value=0;input.setAttribute('aria-label',name);const out=document.createElement('output');out.textContent='0';input.addEventListener('input',()=>{out.textContent=input.value;update()});label.append(input,out);$('scores').append(label)});\nfunction download(name,data){const link=document.createElement('a');const url=URL.createObjectURL(new Blob([JSON.stringify(data,null,2)+'\\n'],{type:'application/json'}));link.href=url;link.download=name;link.click();setTimeout(()=>URL.revokeObjectURL(url),1000);$('status').textContent='Downloaded '+name+'. Review and replace the matching file in the extracted resource folder.';}\n$('export').onclick=()=>download('versions.json',Object.fromEntries(['A','B'].map((v,i)=>[v,{topic:$('topic').value,format:$('format').value,text:$(i?'b':'a').value}])));\n$('rubric-export').onclick=()=>download('rubric.json',{dimensions,values:[...document.querySelectorAll('#scores input')].map(x=>Number(x.value)),kind:'self-assessment; review evidence before interpreting'});\nfor(const id of ['a','b'])$(id).addEventListener('input',update);update();\n</script></html>",
      "filename": "studio.html",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R008",
      "name": "versions.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"A\": {\n    \"topic\": \"Repair meetup for squeaky bicycle brakes\",\n    \"format\": \"local Group discussion\",\n    \"text\": \"Anyone else fed up with squeaky brakes? Thinking of doing a little repair meetup on Saturday. Who is in?\"\n  },\n  \"B\": {\n    \"topic\": \"Repair meetup for squeaky bicycle brakes\",\n    \"format\": \"local Group discussion\",\n    \"text\": \"Bicycle brakes squeaking? Our neighborhood repair meetup draft is Saturday, 10 am at the community hall. Bring your bicycle model and describe when the squeak occurs. A volunteer mechanic will explain what needs inspection; this post is not a diagnosis. Which brake questions should we add to the session?\"\n  }\n}\n",
      "filename": "versions.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R009",
      "name": "knowledge.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"platform\": \"facebook\",\n  \"topic\": \"Repair meetup for squeaky bicycle brakes\",\n  \"question\": \"What information makes a bicycle brakes repair meetup useful to neighbors?\",\n  \"answer\": \"A bicycle brakes repair meetup invitation should name the location and time, distinguish peer observations from a mechanic diagnosis, and invite residents to describe the bicycle and symptom without exposing private addresses.\",\n  \"context\": \"Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\",\n  \"example\": \"Synthetic teaching example; replace with a checked observation before public use.\",\n  \"entities\": [\n    \"bicycle brakes\",\n    \"repair meetup\"\n  ],\n  \"sources\": [\n    \"https://transparency.meta.com/features/explaining-ranking/fb-feed/\"\n  ],\n  \"related_topics\": [\n    \"community events\",\n    \"bike maintenance\"\n  ],\n  \"keywords\": [\n    \"bicycle brakes\",\n    \"repair meetup\"\n  ],\n  \"language\": \"en\",\n  \"author\": \"chatgpt_codex teaching fixture\",\n  \"date\": \"2026-10-06\",\n  \"next_action\": \"Ask the organizer to confirm the venue, accessibility, volunteer expertise and community posting rules before approving the invitation.\"\n}\n",
      "filename": "knowledge.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R010",
      "name": "agent-card.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"windows\": {\n    \"shell\": \"PowerShell\",\n    \"cwd\": \"extracted course resource folder\",\n    \"prerequisites\": [\n      \"Python 3.10+\",\n      \"Reviewed local resource files\"\n    ],\n    \"command\": \"python media_pack.py lint\",\n    \"expected_exit\": 0,\n    \"expected_output\": \"MEDIA PASS\",\n    \"failure\": \"Read report.json. Restore a broken field; review the correction before running media_pack.py hash. Do not hash an unexplained change.\",\n    \"scope\": \"Validate draft metadata locally; never publish or change accounts.\"\n  },\n  \"macos\": {\n    \"shell\": \"zsh\",\n    \"cwd\": \"extracted course resource folder\",\n    \"prerequisites\": [\n      \"Python 3.10+\",\n      \"Reviewed local resource files\"\n    ],\n    \"command\": \"python3 media_pack.py lint\",\n    \"expected_exit\": 0,\n    \"expected_output\": \"MEDIA PASS\",\n    \"failure\": \"Read report.json. Restore a broken field; review the correction before running media_pack.py hash. Do not hash an unexplained change.\",\n    \"scope\": \"Validate draft metadata locally; never publish or change accounts.\"\n  },\n  \"linux\": {\n    \"shell\": \"bash\",\n    \"cwd\": \"extracted course resource folder\",\n    \"prerequisites\": [\n      \"Python 3.10+\",\n      \"Reviewed local resource files\"\n    ],\n    \"command\": \"python3 media_pack.py lint\",\n    \"expected_exit\": 0,\n    \"expected_output\": \"MEDIA PASS\",\n    \"failure\": \"Read report.json. Restore a broken field; review the correction before running media_pack.py hash. Do not hash an unexplained change.\",\n    \"scope\": \"Validate draft metadata locally; never publish or change accounts.\"\n  }\n}\n",
      "filename": "agent-card.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R011",
      "name": "rag.jsonl",
      "type": "jsonl",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\"id\": \"facebook-1\", \"entity\": \"bicycle brakes\", \"question\": \"What information makes a bicycle brakes repair meetup useful to neighbors?\", \"answer\": \"A bicycle brakes repair meetup invitation should name the location and time, distinguish peer observations from a mechanic diagnosis, and invite residents to describe the bicycle and symptom without exposing private addresses.\", \"source\": \"https://transparency.meta.com/features/explaining-ranking/fb-feed/\"}\n{\"id\": \"facebook-2\", \"entity\": \"bicycle brakes\", \"question\": \"What should the bicycle brakes audience do next?\", \"answer\": \"bicycle brakes: Ask the organizer to confirm the venue, accessibility, volunteer expertise and community posting rules before approving the invitation.\", \"source\": \"https://transparency.meta.com/features/explaining-ranking/fb-feed/\"}\n",
      "filename": "rag.jsonl",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R012",
      "name": "rubric.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"dimensions\": [\n    \"Human value\",\n    \"Engagement depth\",\n    \"Organic discovery\",\n    \"Semantic clarity\",\n    \"AI discoverability\",\n    \"Retrieval readiness\",\n    \"Community value\",\n    \"Agent readiness\",\n    \"Multilingual potential\",\n    \"Provenance and trust\",\n    \"Future longevity\"\n  ],\n  \"values\": [\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0\n  ],\n  \"kind\": \"unscored draft; score only after reviewing evidence\"\n}\n",
      "filename": "rubric.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R013",
      "name": "native.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"venue\": \"community hall, fictional example\",\n  \"time\": \"Saturday 10 am, date to be confirmed\",\n  \"surface\": \"Group\",\n  \"privacy\": \"No home addresses or private member quotes\",\n  \"moderation\": \"Organizer review required\"\n}\n",
      "filename": "native.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R014",
      "name": "claims.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"taxonomy\": [\n    \"ESTABLISHED\",\n    \"EVIDENCE-SUPPORTED\",\n    \"EMERGING\",\n    \"HYPOTHESIS\",\n    \"SPECULATION\"\n  ],\n  \"claims\": [\n    {\n      \"claim\": \"Facebook Feed uses signals and predictions to rank candidate content.\",\n      \"label\": \"ESTABLISHED\",\n      \"source\": \"https://transparency.meta.com/features/explaining-ranking/fb-feed/\",\n      \"checked\": \"2026-10-06\"\n    },\n    {\n      \"claim\": \"A specific symptom prompt will generate more useful replies than a vague invitation.\",\n      \"label\": \"HYPOTHESIS\",\n      \"source\": \"Local experiment proposal; no result claimed\"\n    },\n    {\n      \"claim\": \"Future SI may coordinate knowledge across platforms\",\n      \"label\": \"SPECULATION\",\n      \"source\": \"Design possibility; no accepted forecast or training guarantee\"\n    }\n  ]\n}\n",
      "filename": "claims.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R015",
      "name": "metrics.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"status\": \"NOT RUN\",\n  \"topic\": \"Repair meetup for squeaky bicycle brakes\",\n  \"format\": \"local Group discussion\",\n  \"primary_metric\": \"substantive replies per reached viewer\",\n  \"exposures\": null,\n  \"outcomes\": null,\n  \"rate\": null,\n  \"confounders\": [\n    \"audience mix\",\n    \"time of day\",\n    \"distribution\",\n    \"prior exposure\"\n  ],\n  \"stop_rule\": \"Set a observation window and minimum exposure count before starting. Report inconclusive when underpowered.\",\n  \"ai_citations\": [],\n  \"agent_execution\": {\n    \"attempts\": 0,\n    \"successes\": 0,\n    \"os_evidence\": []\n  }\n}\n",
      "filename": "metrics.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R016",
      "name": "provenance-notes.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\nRecord author, real capture date, source URLs, permissions, AI assistance, changes and reviewed evidence. SHA256 detects changes to bytes. A C2PA signed manifest requires separate credentials and verification; no signature is supplied.\nPublic status does not grant universal crawler/API access or guarantee pretraining, fine-tuning, retrieval or AI citation. Synthetic Intelligence (SI) is a speculative course term; semantic indexing is a separate concept.\n",
      "filename": "provenance-notes.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R017",
      "name": "versions.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "versions.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R018",
      "name": "knowledge.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "knowledge.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R019",
      "name": "agent-card.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "agent-card.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R020",
      "name": "rag.jsonl.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "rag.jsonl.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R021",
      "name": "rubric.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "rubric.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R022",
      "name": "native.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "native.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R023",
      "name": "claims.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "claims.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R024",
      "name": "metrics.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "metrics.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R025",
      "name": "agent-training.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"schema_version\": 1,\n  \"agent_role\": \"Facebook Content Agent\",\n  \"topic\": \"Repair meetup for squeaky bicycle brakes\",\n  \"operating_points\": {\n    \"01_platform_identity\": \"Facebook Content Agent; create native local Group discussion drafts rather than swapping platform labels.\",\n    \"02_audience\": \"Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\",\n    \"03_content_graph\": {\n      \"format\": \"local Group discussion\",\n      \"topic\": \"Repair meetup for squeaky bicycle brakes\",\n      \"alternatives\": \"First native surface/format exercises and native.json.\"\n    },\n    \"04_distribution_graph\": \"Group membership and community conversation; Page following, Feed/Reels discovery and Events serve different intents.\",\n    \"05_algorithm\": {\n      \"source\": \"https://transparency.meta.com/features/explaining-ranking/fb-feed/\",\n      \"documented_claim\": \"Facebook Feed uses signals and predictions to rank candidate content.\",\n      \"private_weights\": \"UNKNOWN; never fabricate weights, thresholds or penalties.\"\n    },\n    \"06_engagement_graph\": {\n      \"actions\": [\n        \"Comment with a symptom\",\n        \"Share with relevant neighbors\",\n        \"Join a relevant Group\",\n        \"Follow the organizer Page\",\n        \"Discuss or RSVP after venue confirmation\"\n      ],\n      \"useful_metric\": \"substantive replies per reached viewer\",\n      \"valuation\": \"Predeclare useful outcomes and denominators; no fabricated platform point values.\"\n    },\n    \"07_native_formats\": {\n      \"venue\": \"community hall, fictional example\",\n      \"time\": \"Saturday 10 am, date to be confirmed\",\n      \"surface\": \"Group\",\n      \"privacy\": \"No home addresses or private member quotes\",\n      \"moderation\": \"Organizer review required\"\n    },\n    \"08_creative_language\": \"Local, welcoming and logistical; no fabricated expert diagnosis or private member quotes.\",\n    \"09_cta_system\": [\n      \"Comment with a symptom\",\n      \"Share with relevant neighbors\",\n      \"Join a relevant Group\",\n      \"Follow the organizer Page\",\n      \"Discuss or RSVP after venue confirmation\"\n    ],\n    \"10_search\": {\n      \"entities\": [\n        \"bicycle brakes\",\n        \"repair meetup\"\n      ],\n      \"query\": \"What information makes a bicycle brakes repair meetup useful to neighbors?\",\n      \"task\": \"Observe current queries and record date/access limits before writing metadata.\"\n    },\n    \"11_platform_ai\": {\n      \"description\": \"Muse for Small Business documents connections to Facebook Pages, Instagram professional analytics and Meta ad accounts. User-authorized business assistance is separate from forcing recommendation or training.\",\n      \"source\": \"https://about.fb.com/news/2026/09/introducing-muse-small-business\",\n      \"checked\": \"2026-10-06\",\n      \"status\": \"Documented description; actual account availability/execution UNVERIFIED.\"\n    },\n    \"12_ai_discovery\": {\n      \"input_output\": \"Permissioned business-account information → analysis and business-task assistance; current account availability UNVERIFIED.\",\n      \"rule\": \"Do not promise a private model will parse, recommend, cite or train on the object.\"\n    },\n    \"13_multimodal\": {\n      \"entities\": [\n        \"bicycle brakes\",\n        \"repair meetup\"\n      ],\n      \"task\": \"Match visual labels, speech and captions; retain a text equivalent. Check actual media manually. No invented OCR/ASR results.\"\n    },\n    \"14_community\": {\n      \"task\": \"Review two public examples and current rules; obtain permission for private quotes.\",\n      \"fixture_status\": \"A/B and practice replies are synthetic, not real member observations.\"\n    },\n    \"15_native_patterns\": {\n      \"format\": \"local Group discussion\",\n      \"hypothesis\": \"A specific symptom prompt will generate more useful replies than a vague invitation.\",\n      \"status\": \"UNTESTED for this draft; empirical superiority not claimed.\"\n    },\n    \"16_failure_modes\": \"Local, welcoming and logistical; no fabricated expert diagnosis or private member quotes. Also refuse unsupported source/rights claims and never invent algorithmic penalties.\",\n    \"17_experiments\": {\n      \"controls\": [\n        \"same topic\",\n        \"same audience\",\n        \"same format\",\n        \"same promise\"\n      ],\n      \"protocol\": \"Change one factor; predeclare metric, time window and minimum exposure. Log confounders and inconclusive results.\"\n    },\n    \"18_analytics\": {\n      \"primary_metric\": \"substantive replies per reached viewer\",\n      \"observations\": \"NOT RUN; metrics.json uses nulls, not fabricated counts.\"\n    },\n    \"19_generation_rules\": {\n      \"inputs\": [\n        \"knowledge.json\",\n        \"actual audience observations\",\n        \"current rules\",\n        \"format limits\",\n        \"rights/permissions\",\n        \"source dates\"\n      ],\n      \"outputs\": [\n        \"native draft\",\n        \"controlled A/B\",\n        \"media/caption plan\",\n        \"sources and factual review\",\n        \"rubric with reasons\",\n        \"approval request\",\n        \"measurement plan\"\n      ],\n      \"state_machine\": [\n        \"DRAFT\",\n        \"REVIEW_REQUESTED\",\n        \"APPROVED_BY_AUTHORIZED_HUMAN\",\n        \"PUBLISHED_BY_AUTHORIZED_HUMAN\",\n        \"MEASURED\",\n        \"CORRECTED\"\n      ],\n      \"stop_conditions\": [\n        \"Missing audience/source\",\n        \"Unknown media rights\",\n        \"Unsupported claim\",\n        \"Unverified current publishing limit\",\n        \"No publication authorization\"\n      ],\n      \"scope\": \"Offline authoring and local validation only; no account connection or publishing tool provided.\"\n    },\n    \"20_b3_knowledge_layer\": {\n      \"artifacts\": [\n        \"knowledge.json\",\n        \"rag.jsonl\",\n        \"claims.json\",\n        \"agent-card.json\",\n        \"provenance-notes.md\"\n      ],\n      \"limits\": \"Lexical demonstration, unsigned integrity hashes, no guaranteed model training or future SI coordination.\"\n    }\n  },\n  \"source_scope\": \"Primary documentation and original editorial design. Feature description is not account-execution evidence.\"\n}\n",
      "filename": "agent-training.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R026",
      "name": "agent-training.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "agent-training.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R027",
      "name": "AGENT_OPERATING_MANUAL.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Facebook Content Agent operating manual\n\nAudience: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\n\nRead all twenty points in agent-training.json before drafting. Preserve concrete inputs, native output, actual evidence and a review request. This pack has no publishing integration.\n\nNative action chain: Comment with a symptom → Share with relevant neighbors → Join a relevant Group → Follow the organizer Page → Discuss or RSVP after venue confirmation\n\nNative AI: Muse for Small Business documents connections to Facebook Pages, Instagram professional analytics and Meta ad accounts. User-authorized business assistance is separate from forcing recommendation or training.\nPrimary source: https://about.fb.com/news/2026/09/introducing-muse-small-business\n\nReview actual account availability, documented inputs/outputs and a privacy/failure limit. Keep NOT VERIFIED when access is absent. Generate a native draft, not an invented performance report. Submit source, rights and preflight evidence before publication; log real outcomes only after authorized use.\n",
      "filename": "AGENT_OPERATING_MANUAL.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R028",
      "name": "audience.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Facebook audience\n\nTopic: Repair meetup for squeaky bicycle brakes\nAudience: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\n\nThe worksheet is a production draft. Save specific decisions, source URLs, dates and observed results. Never fill a result with imagined analytics.\n\n## Choose a surface and an audience\nMap Feed, Pages, Groups, Reels, Stories, Live, Events, comments, notifications and Marketplace in audience.md. Pick a local Group for the repair invitation; explain why a Marketplace listing or a Page broadcast would satisfy a different intent.\n\nYour artifact / evidence:\n\n## Check the community before composing\nReview a Group you may access: rules, description, pinned guides, past event posts and two public examples. Record date, allowed formats and moderation requirements. Keep private content out of the downloaded pack.\n\nYour artifact / evidence:\n\n## Choose the content engine\nDraft seven format ideas: educational post, discussion, video/Live, Reel, Group question, Event and source link. Choose one action per format and keep the repair invitation coherent.\n\nYour artifact / evidence:\n\n## Separate ranking signals from folklore\nDraw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties.\n\nYour artifact / evidence:\n\n## Build a local search brief\nWrite three queries a neighbor might use, such as bicycle brake repair meetup. Draft a descriptive Group/Event title and an About summary. Treat public search visibility as conditional on access and indexing.\n\nYour artifact / evidence:\n\n## Compose the controlled post pair\nOpen studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement.\n\nYour artifact / evidence:\n\n",
      "filename": "audience.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R029",
      "name": "native-production.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Facebook native-production\n\nTopic: Repair meetup for squeaky bicycle brakes\nAudience: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\n\nThe worksheet is a production draft. Save specific decisions, source URLs, dates and observed results. Never fill a result with imagined analytics.\n\n## Choose a surface and an audience\nMap Feed, Pages, Groups, Reels, Stories, Live, Events, comments, notifications and Marketplace in audience.md. Pick a local Group for the repair invitation; explain why a Marketplace listing or a Page broadcast would satisfy a different intent.\n\nYour artifact / evidence:\n\n## Check the community before composing\nReview a Group you may access: rules, description, pinned guides, past event posts and two public examples. Record date, allowed formats and moderation requirements. Keep private content out of the downloaded pack.\n\nYour artifact / evidence:\n\n## Choose the content engine\nDraft seven format ideas: educational post, discussion, video/Live, Reel, Group question, Event and source link. Choose one action per format and keep the repair invitation coherent.\n\nYour artifact / evidence:\n\n## Separate ranking signals from folklore\nDraw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties.\n\nYour artifact / evidence:\n\n## Build a local search brief\nWrite three queries a neighbor might use, such as bicycle brake repair meetup. Draft a descriptive Group/Event title and an About summary. Treat public search visibility as conditional on access and indexing.\n\nYour artifact / evidence:\n\n## Compose the controlled post pair\nOpen studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement.\n\nYour artifact / evidence:\n\n## Say, write and show the same thing\nPlan a three-frame preview: bicycle brake close-up, volunteer inspection, meetup details. Write exact speech, overlay and caption for each frame in native-production.md. Label fictional timing and venue as draft.\n\nYour artifact / evidence:\n\n## Design a Reel that stands alone\nWrite a 30-second story for one question: what information should a neighbor bring? Try definition, question, demonstration, lesson, mistake and solution variants. Deliver the answer before the next-action cue.\n\nYour artifact / evidence:\n\n## Plan the depth ladder\nConnect a Reel to the invitation, comments, Group guide and an organizer FAQ. Explain how a person can start at any depth without needing the previous post.\n\nYour artifact / evidence:\n\n## Turn comments into useful answers\nWrite three synthetic replies: a beginner question, an accessibility concern and an unresolved mechanical symptom. Respond without inventing a diagnosis; separate observation, expert inspection and confirmed information.\n\nYour artifact / evidence:\n\n## Close the community knowledge loop\nMap content → question → comment → answer → follow-up → discussion → FAQ → updated invitation. Draft one new FAQ from the accessibility question, marking its source as synthetic practice.\n\nYour artifact / evidence:\n\n## Make a Group guide and moderation rule\nDesign pinned-guide headings and a moderator escalation for unsafe advice or exposed addresses. Define when a member observation becomes verified knowledge.\n\nYour artifact / evidence:\n\n## Build a discussion graph\nDraw question → topic → volunteer expert → verified answer → bicycle component → tutorial. Include unresolved status and correction dates.\n\nYour artifact / evidence:\n\n## Localize without changing the invitation\nTranslate one short invitation into a language you know, or prepare a reviewer brief. Preserve the confirmed time, venue and component names. Describe cultural context; do not assert identical embedding coordinates.\n\nYour artifact / evidence:\n\n## Use entities and question-first writing\nDefine bicycle brakes as a bicycle component and repair meetup as an event. Rewrite the opening as a direct question with audience, context and limits.\n\nYour artifact / evidence:\n\n## Plan authentic community feedback\nDescribe consent before quoting members, capture original questions and distinguish real comments from synthetic exercises. Explain why manufactured comments or bot swarms damage trust.\n\nYour artifact / evidence:\n\n## Design the thirteen-layer package\nList post, visual/video, caption, transcript, seed-question draft, discussion, FAQ, article, course, JSON-LD object, translation, retrieval chunk and agent card. Link each layer to the same repair topic.\n\nYour artifact / evidence:\n\n## Recompose one live-show idea\nImagine a Late Night with Build Bots Better repair segment. Extract a community challenge, an educational clip, a source ledger and an organizer FAQ. Reframe the Facebook discussion for YouTube, TikTok, X and a website without copying identical captions.\n\nYour artifact / evidence:\n\n## Design six experiments and three versions\nSave traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes.\n\nYour artifact / evidence:\n\n## Audit the full invitation\nReview the local intent, rules, factual logistics, privacy, captions, readability and next action. Mark future agent discovery and SI as speculation; replace algorithm tricks with a reusable community asset.\n\nYour artifact / evidence:\n\n",
      "filename": "native-production.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R030",
      "name": "caption.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Facebook caption\n\nTopic: Repair meetup for squeaky bicycle brakes\nAudience: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\n\nThe worksheet is a production draft. Save specific decisions, source URLs, dates and observed results. Never fill a result with imagined analytics.\n\n## Compose the controlled post pair\nOpen studio.html. Keep the repair meetup, audience and Group discussion format fixed. Compare A and B for warmth, named location, time and a specific question. Edit B without turning the invitation into an advertisement.\n\nYour artifact / evidence:\n\n",
      "filename": "caption.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R031",
      "name": "diagnostic-log.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Facebook diagnostic-log\n\nTopic: Repair meetup for squeaky bicycle brakes\nAudience: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\n\nThe worksheet is a production draft. Save specific decisions, source URLs, dates and observed results. Never fill a result with imagined analytics.\n\n## Separate ranking signals from folklore\nDraw inventory → signals → predictions → relevance in audience.md. Record reactions, replies, saves, clicks and reshares as possible observations. Do not assign invented emoji weights, a guaranteed first-hour boost or universal link penalties.\n\nYour artifact / evidence:\n\n",
      "filename": "diagnostic-log.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R032",
      "name": "capstone.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Facebook capstone\n\nTopic: Repair meetup for squeaky bicycle brakes\nAudience: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\n\nThe worksheet is a production draft. Save specific decisions, source URLs, dates and observed results. Never fill a result with imagined analytics.\n\n## Design the thirteen-layer package\nList post, visual/video, caption, transcript, seed-question draft, discussion, FAQ, article, course, JSON-LD object, translation, retrieval chunk and agent card. Link each layer to the same repair topic.\n\nYour artifact / evidence:\n\n## Recompose one live-show idea\nImagine a Late Night with Build Bots Better repair segment. Extract a community challenge, an educational clip, a source ledger and an organizer FAQ. Reframe the Facebook discussion for YouTube, TikTok, X and a website without copying identical captions.\n\nYour artifact / evidence:\n\n## Design six experiments and three versions\nSave traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes.\n\nYour artifact / evidence:\n\n## Audit the full invitation\nReview the local intent, rules, factual logistics, privacy, captions, readability and next action. Mark future agent discovery and SI as speculation; replace algorithm tricks with a reusable community asset.\n\nYour artifact / evidence:\n\n",
      "filename": "capstone.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R033",
      "name": "experiments.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Facebook experiments\n\nTopic: Repair meetup for squeaky bicycle brakes\nAudience: Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\n\nThe worksheet is a production draft. Save specific decisions, source URLs, dates and observed results. Never fill a result with imagined analytics.\n\n## Design six experiments and three versions\nSave traditional, search-focused and full-knowledge invitation drafts in capstone.md. Plan A–F: baseline, SEO, semantic, AI-readable, community loop and complete stack. Set reach, community depth and knowledge utility as separate axes.\n\nYour artifact / evidence:\n\n",
      "filename": "experiments.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R034",
      "name": "requirements-map.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Shared-brief coverage\n\n### Part 1 — Understanding Facebook: The Platform Ecosystem\nOwn exercise: Choose a surface and an audience\n\n### Part 2 — The Facebook Content Engine\nOwn exercise: Choose the content engine\n\n### Part 3 — Facebook Algorithm & Discovery\nOwn exercise: Separate ranking signals from folklore\n\n### Part 4 — Facebook SEO & Social Search Architecture\nOwn exercise: Build a local search brief\n\n### Part 5 — Facebook as a Multimodal Knowledge System\nOwn exercise: Say, write and show the same thing\n\n### Part 6 — The Power of Comments: Comments as Knowledge\nOwn exercise: Turn comments into useful answers\n\n### Part 7 — The Facebook Knowledge Loop (B3 Knowledge Loop)\nOwn exercise: Close the community knowledge loop\n\n### Part 8 — Facebook Groups as Living Knowledge Bases\nOwn exercise: Make a Group guide and moderation rule\n\n### Part 9 — From Group Discussions to Knowledge Graphs\nOwn exercise: Build a discussion graph\n\n### Part 10 — Facebook Reels as Micro-Knowledge Objects\nOwn exercise: Design a Reel that stands alone\n\n### Part 11 — The Micro to Long-Form Knowledge Spectrum\nOwn exercise: Plan the depth ladder\n\n### Part 12 — Multilingual Facebook & Global AI Discoverability\nOwn exercise: Localize without changing the invitation\n\n### Part 13 — Entity-First Facebook Content\nOwn exercise: Use entities and question-first writing\n\n### Part 14 — Question-First Content Architecture\nOwn exercise: Use entities and question-first writing\n\n### Part 15 — RAG-Ready Facebook Content\nOwn exercise: Companion knowledge and truthful claims: mechanisms.md, claims.json, knowledge.json, rag.jsonl\n\n### Part 16 — Agent-Ready Facebook Content\nOwn exercise: Hash and lint the reviewed files; agent-card.json (three operating systems)\n\n### Part 17 — Community as Human Feedback Data\nOwn exercise: Plan authentic community feedback\n\n### Part 18 — AI vs Human Community Knowledge: The Human Signal\nOwn exercise: Plan authentic community feedback\n\n### Part 19 — Content Provenance & Trust Ledgers\nOwn exercise: Record provenance and a human approval decision; provenance-notes.md\n\n### Part 20 — The B3 13-Layer Facebook Content Stack\nOwn exercise: Design the thirteen-layer package\n\n### Part 21 — Cross-Platform Recomposition Matrix\nOwn exercise: Recompose one live-show idea\n\n### Part 22 — The Build Bots Better Content Factory\nOwn exercise: Recompose one live-show idea\n\n### Part 23 — Connection to \"Late Night with Build Bots Better\"\nOwn exercise: Recompose one live-show idea\n\n### Part 24 — The B3 Virality + Community + Knowledge Model\nOwn exercise: Design six experiments and three versions\n\n### Part 25 — The \"AI Training Data\" Exploration\nOwn exercise: Companion knowledge and truthful claims: mechanisms.md, claims.json, knowledge.json, rag.jsonl\n\n### Part 26 — The Synthetic Community Problem\nOwn exercise: Plan authentic community feedback\n\n### Part 27 — Build Bots Better: Beyond the Algorithm\nOwn exercise: Audit the full invitation\n\n### Part 28 — The B3 AI Readiness Score (0–100)\nOwn exercise: Use the readiness calculator; studio.html and rubric.json\n\n### Part 29 — Build Bots Better Empirical Experiments A through F\nOwn exercise: Design six experiments and three versions\n\n### Part 30 — The Future of Facebook: AI as the Discovery Layer\nOwn exercise: Audit the full invitation\n\n### Part 31 — From Social SEO to Intelligence Optimization\nOwn exercise: Audit the full invitation\n\n",
      "filename": "requirements-map.md",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R035",
      "name": "strategy.json",
      "type": "json",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "{\n  \"platform\": \"Facebook\",\n  \"progression\": [\n    \"Human value\",\n    \"Engagement\",\n    \"Discovery\",\n    \"Community\",\n    \"Search\",\n    \"AI discoverability\",\n    \"Retrieval\",\n    \"Agentic discovery\",\n    \"Future intelligence (speculative)\"\n  ],\n  \"epistemic_status\": \"Editorial framework; optimization stages do not guarantee distribution or learning\",\n  \"audiences\": [\n    \"human\",\n    \"platform\",\n    \"search/retrieval\",\n    \"authorized agent\"\n  ],\n  \"human_utility\": \"Neighbors want practical local answers and a discussion they can trust. Our persona is a volunteer planning a neighborhood repair meetup, not a generic developer audience.\",\n  \"measurement\": \"Compare the same topic, format, audience and promise. Change one independent variable per audience test.\"\n}\n",
      "filename": "strategy.json",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R036",
      "name": "strategy.json.VERSION_HISTORY.txt",
      "type": "txt",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n",
      "filename": "strategy.json.VERSION_HISTORY.txt",
      "generated_from": "BUILD_SPEC.json.resources",
      "version": "2.0"
    },
    {
      "resource_id": "R037",
      "name": "mechanisms.md",
      "type": "md",
      "purpose": "Working resource used by this Build; inspect before running.",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | media-catchup | v1: original learner production resource.\n\n# Discovery mechanisms and truth labels\n\nTraining and fine-tuning alter model weights; publishing a post cannot force either. RLHF/RLAIF uses preference data and is separate from inference. Crawling and public/in-app search build accessible indexes; private posts, robots rules, terms and APIs constrain access. Embeddings represent semantic similarity; vector databases retrieve vectors. RAG retrieves external chunks into context, while context windows are temporary inference inputs. Graphs encode named relationships. Recommendation systems rank candidate content for an audience. AI answers and citations may summarize accessible sources; citations are observed, not guaranteed. Provenance records origin and byte changes. Machine-readable schemas describe content but do not force rich results. Multimodal OCR/ASR interprets image/audio and requires human correction. Agent browsing/retrieval adds goal-driven tool actions. Licensed and enterprise repositories have explicit access contracts. Platform-specific AI features must be checked for account/region/version availability. Future SI learning and coordination is speculative.\n\nTaxonomy: ESTABLISHED requires a direct source; EVIDENCE-SUPPORTED requires reproducible observations; EMERGING describes a dated deployment; HYPOTHESIS is a proposed test; SPECULATION is a future possibility. The shared briefs use different counts/groupings (13,16,18); retain distinctions rather than inventing a uniform number. SI is not a promise of permanent model learning or a synonym for semantic indexing.\n",
      "filename": "mechanisms.md",
      "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": "Produce your native local Group discussion and its same-topic comparison, complete the detailed capstone plan, then review source facts, rights, current community rules and actual media. Run the meaningful failure/repair and source-linked retrieval checks. Export course evidence. A structural pack pass is separate from live publication, audience results or independent quality approval.",
    "required_inputs": [
      "workspace_guard.py",
      "restore_drill.py",
      "onboarding-checklist.md",
      "media_pack.py",
      "versions.json",
      "knowledge.json",
      "agent-card.json",
      "rubric.json",
      "native.json",
      "claims.json",
      "metrics.json",
      "provenance-notes.md",
      "agent-training.json",
      "AGENT_OPERATING_MANUAL.md",
      "audience.md",
      "native-production.md",
      "caption.md",
      "diagnostic-log.md",
      "capstone.md",
      "experiments.md",
      "requirements-map.md",
      "strategy.json",
      "mechanisms.md"
    ],
    "success_conditions": [
      "A reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources.",
      "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 reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources.",
    "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": "Creating Facebook Content for the AI, SI, and Agentic Era | BuildBotsBetter",
    "SEO_description": "A reviewed local Group discussion for Repair meetup for squeaky bicycle brakes, controlled A/B drafts, complete native production/capstone plans, an evidence rubric, source-linked retrieval objects and hash-checked companion resources.",
    "SEO_keywords": [
      "facebook-content-ai-si-agentic-era",
      "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": [
      "Platform access, account features and upload limits require current account checks.",
      "No content was published and no genuine audience metrics or AI citations are claimed.",
      "Studio and lint check draft structure; factual accuracy, media quality, OCR/ASR and community fit need human review.",
      "The provided fixture is synthetic. Actual content creation and live feedback must not be inferred from a browser walkthrough."
    ]
  },
  "sources": [
    {
      "title": "Shared Facebook requirements",
      "url": "../../specs/facebook-content-ai-si-agentic-era.md"
    },
    {
      "title": "Facebook primary platform guidance",
      "url": "https://transparency.meta.com/features/explaining-ranking/fb-feed/"
    },
    {
      "title": "Facebook documented native AI capabilities",
      "url": "https://about.fb.com/news/2026/09/introducing-muse-small-business"
    }
  ],
  "known_uncertainties": [
    "Platform access, account features and upload limits require current account checks.",
    "No content was published and no genuine audience metrics or AI citations are claimed.",
    "Studio and lint check draft structure; factual accuracy, media quality, OCR/ASR and community fit need human review.",
    "The provided fixture is synthetic. Actual content creation and live feedback must not be inferred from a browser walkthrough."
  ],
  "requirement_coverage": {
    "shared_parts": [
      "### Part 1 — Understanding Facebook: The Platform Ecosystem",
      "### Part 2 — The Facebook Content Engine",
      "### Part 3 — Facebook Algorithm & Discovery",
      "### Part 4 — Facebook SEO & Social Search Architecture",
      "### Part 5 — Facebook as a Multimodal Knowledge System",
      "### Part 6 — The Power of Comments: Comments as Knowledge",
      "### Part 7 — The Facebook Knowledge Loop (B3 Knowledge Loop)",
      "### Part 8 — Facebook Groups as Living Knowledge Bases",
      "### Part 9 — From Group Discussions to Knowledge Graphs",
      "### Part 10 — Facebook Reels as Micro-Knowledge Objects",
      "### Part 11 — The Micro to Long-Form Knowledge Spectrum",
      "### Part 12 — Multilingual Facebook & Global AI Discoverability",
      "### Part 13 — Entity-First Facebook Content",
      "### Part 14 — Question-First Content Architecture",
      "### Part 15 — RAG-Ready Facebook Content",
      "### Part 16 — Agent-Ready Facebook Content",
      "### Part 17 — Community as Human Feedback Data",
      "### Part 18 — AI vs Human Community Knowledge: The Human Signal",
      "### Part 19 — Content Provenance & Trust Ledgers",
      "### Part 20 — The B3 13-Layer Facebook Content Stack",
      "### Part 21 — Cross-Platform Recomposition Matrix",
      "### Part 22 — The Build Bots Better Content Factory",
      "### Part 23 — Connection to \"Late Night with Build Bots Better\"",
      "### Part 24 — The B3 Virality + Community + Knowledge Model",
      "### Part 25 — The \"AI Training Data\" Exploration",
      "### Part 26 — The Synthetic Community Problem",
      "### Part 27 — Build Bots Better: Beyond the Algorithm",
      "### Part 28 — The B3 AI Readiness Score (0–100)",
      "### Part 29 — Build Bots Better Empirical Experiments A through F",
      "### Part 30 — The Future of Facebook: AI as the Discovery Layer",
      "### Part 31 — From Social SEO to Intelligence Optimization"
    ],
    "part_to_exercise": [
      {
        "requirement": "### Part 1 — Understanding Facebook: The Platform Ecosystem",
        "exercise": "Choose a surface and an audience"
      },
      {
        "requirement": "### Part 2 — The Facebook Content Engine",
        "exercise": "Choose the content engine"
      },
      {
        "requirement": "### Part 3 — Facebook Algorithm & Discovery",
        "exercise": "Separate ranking signals from folklore"
      },
      {
        "requirement": "### Part 4 — Facebook SEO & Social Search Architecture",
        "exercise": "Build a local search brief"
      },
      {
        "requirement": "### Part 5 — Facebook as a Multimodal Knowledge System",
        "exercise": "Say, write and show the same thing"
      },
      {
        "requirement": "### Part 6 — The Power of Comments: Comments as Knowledge",
        "exercise": "Turn comments into useful answers"
      },
      {
        "requirement": "### Part 7 — The Facebook Knowledge Loop (B3 Knowledge Loop)",
        "exercise": "Close the community knowledge loop"
      },
      {
        "requirement": "### Part 8 — Facebook Groups as Living Knowledge Bases",
        "exercise": "Make a Group guide and moderation rule"
      },
      {
        "requirement": "### Part 9 — From Group Discussions to Knowledge Graphs",
        "exercise": "Build a discussion graph"
      },
      {
        "requirement": "### Part 10 — Facebook Reels as Micro-Knowledge Objects",
        "exercise": "Design a Reel that stands alone"
      },
      {
        "requirement": "### Part 11 — The Micro to Long-Form Knowledge Spectrum",
        "exercise": "Plan the depth ladder"
      },
      {
        "requirement": "### Part 12 — Multilingual Facebook & Global AI Discoverability",
        "exercise": "Localize without changing the invitation"
      },
      {
        "requirement": "### Part 13 — Entity-First Facebook Content",
        "exercise": "Use entities and question-first writing"
      },
      {
        "requirement": "### Part 14 — Question-First Content Architecture",
        "exercise": "Use entities and question-first writing"
      },
      {
        "requirement": "### Part 15 — RAG-Ready Facebook Content",
        "exercise": "Companion knowledge and truthful claims: mechanisms.md, claims.json, knowledge.json, rag.jsonl"
      },
      {
        "requirement": "### Part 16 — Agent-Ready Facebook Content",
        "exercise": "Hash and lint the reviewed files; agent-card.json (three operating systems)"
      },
      {
        "requirement": "### Part 17 — Community as Human Feedback Data",
        "exercise": "Plan authentic community feedback"
      },
      {
        "requirement": "### Part 18 — AI vs Human Community Knowledge: The Human Signal",
        "exercise": "Plan authentic community feedback"
      },
      {
        "requirement": "### Part 19 — Content Provenance & Trust Ledgers",
        "exercise": "Record provenance and a human approval decision; provenance-notes.md"
      },
      {
        "requirement": "### Part 20 — The B3 13-Layer Facebook Content Stack",
        "exercise": "Design the thirteen-layer package"
      },
      {
        "requirement": "### Part 21 — Cross-Platform Recomposition Matrix",
        "exercise": "Recompose one live-show idea"
      },
      {
        "requirement": "### Part 22 — The Build Bots Better Content Factory",
        "exercise": "Recompose one live-show idea"
      },
      {
        "requirement": "### Part 23 — Connection to \"Late Night with Build Bots Better\"",
        "exercise": "Recompose one live-show idea"
      },
      {
        "requirement": "### Part 24 — The B3 Virality + Community + Knowledge Model",
        "exercise": "Design six experiments and three versions"
      },
      {
        "requirement": "### Part 25 — The \"AI Training Data\" Exploration",
        "exercise": "Companion knowledge and truthful claims: mechanisms.md, claims.json, knowledge.json, rag.jsonl"
      },
      {
        "requirement": "### Part 26 — The Synthetic Community Problem",
        "exercise": "Plan authentic community feedback"
      },
      {
        "requirement": "### Part 27 — Build Bots Better: Beyond the Algorithm",
        "exercise": "Audit the full invitation"
      },
      {
        "requirement": "### Part 28 — The B3 AI Readiness Score (0–100)",
        "exercise": "Use the readiness calculator; studio.html and rubric.json"
      },
      {
        "requirement": "### Part 29 — Build Bots Better Empirical Experiments A through F",
        "exercise": "Design six experiments and three versions"
      },
      {
        "requirement": "### Part 30 — The Future of Facebook: AI as the Discovery Layer",
        "exercise": "Audit the full invitation"
      },
      {
        "requirement": "### Part 31 — From Social SEO to Intelligence Optimization",
        "exercise": "Audit the full invitation"
      }
    ],
    "native_exercises": [
      "Choose a surface and an audience",
      "Check the community before composing",
      "Choose the content engine",
      "Separate ranking signals from folklore",
      "Build a local search brief",
      "Compose the controlled post pair",
      "Say, write and show the same thing",
      "Design a Reel that stands alone",
      "Plan the depth ladder",
      "Turn comments into useful answers",
      "Close the community knowledge loop",
      "Make a Group guide and moderation rule",
      "Build a discussion graph",
      "Localize without changing the invitation",
      "Use entities and question-first writing",
      "Plan authentic community feedback",
      "Design the thirteen-layer package",
      "Recompose one live-show idea",
      "Design six experiments and three versions",
      "Audit the full invitation"
    ],
    "operational_safeguards": "Last lesson; resolved-path dry run, active tool guard check, scheduled off-volume backup and restore proof.",
    "time_allocation": "Native production exercises: 250 minutes; preparation: 6 minutes; knowledge pack: 24 minutes; operational safeguards: 30 minutes. Native work is 250/310 = 80.6% of planned instructional time."
  }
}
