{
  "schema_version": 2,
  "meta": {
    "build_id": "SWARM-BOT-ARMY",
    "slug": "swarm-bot-army",
    "title": "Build Your Own Swarm Bot Army",
    "subtitle": "Give one mission. Watch a measured, bounded crew organize the work.",
    "description": "Build and test a working PRACTICE coordinator, talent database, parallel workflow, recovery, memory, monitoring and human release gates; prepare an honest real-team transition.",
    "target_audience": "Normal non-technical people already comfortable managing an AI team and blind competition",
    "skill_level": "Stage 3/4 foundation; beginner-friendly Stage 5/6 lab",
    "estimated_time": "4-6 hours plus separately observed real-team trials",
    "expected_cost": "$0 for required PRACTICE lab; real usage unknown until measured",
    "platforms": [
      "windows",
      "macos",
      "linux"
    ],
    "version": 13,
    "author": "chatgpt_codex",
    "source_checked": "2026-10-06",
    "verification_status": "Windows r8 practice tests are separate from independent reviewer Windows/Linux r4 and r7 observations; r8 Linux extracted practice-suite execution passed (receipt records ZIP hash); macOS and a full r8 Linux card-by-card learner walk remain untested. No real general autonomous AI dispatch is implemented.",
    "prerequisites": [
      "Python 3.10+ and basic folder/browser/editor use.",
      "Permission to use the practice source notes; optional real workers need personal authorization."
    ]
  },
  "user_outcome": {
    "before": "Human assigns every bot by hand.",
    "after": "Build and test a working PRACTICE coordinator, talent database, parallel workflow, recovery, memory, monitoring and human release gates; prepare an honest real-team transition.",
    "finished_product": "A bounded source-note PRACTICE swarm with inspectable reports and a separate real-evidence gate."
  },
  "learning_objectives": [
    "Build a mission contract with enforceable local boundaries.",
    "Measure skills with blind auditions and explain worker selection.",
    "Prove task dependencies, actual overlap and independent review.",
    "Recover failures while respecting resource limits.",
    "Retain and restore shared mission memory.",
    "Review verified bytes and distinguish PRACTICE from observed real autonomy."
  ],
  "lessons": [
    {
      "lesson_id": "L01",
      "title": "From team to swarm",
      "purpose": "A kitchen manager gives the crew one dinner order; the crew organizes stations. A drone swarm here means harmless coordinated observation, not weapons or tactics. Stage 1: one bot. Stage 2: several bots. Stage 3: you coordinate a team. Stage 4: independent competition. Stage 5: work is organized around a mission. Stage 6: the workflow runs inside human-approved boundaries.",
      "estimated_time": "15-25 min",
      "learning_objective": "You can point to every component and state the PRACTICE limit.",
      "lessons_before_this": [],
      "lessons_after_this": [
        "L02"
      ],
      "module": "Foundation"
    },
    {
      "lesson_id": "L02",
      "title": "Start the kit safely",
      "purpose": "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library.",
      "estimated_time": "15-25 min",
      "learning_objective": "DOCTOR PASS appears; no credential or network is required.",
      "lessons_before_this": [
        "L01"
      ],
      "lessons_after_this": [
        "L03"
      ],
      "module": "Build Stage 5"
    },
    {
      "lesson_id": "L03",
      "title": "Give the manager a mission",
      "purpose": "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs.",
      "estimated_time": "15-25 min",
      "learning_objective": "CONTRACTS PASS appears.",
      "lessons_before_this": [
        "L02"
      ],
      "lessons_after_this": [
        "L04"
      ],
      "module": "Build Stage 5"
    },
    {
      "lesson_id": "L04",
      "title": "Discover skills through work",
      "purpose": "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence.",
      "estimated_time": "15-25 min",
      "learning_objective": "Each skill has measured PRACTICE profiles; tokens are not invented.",
      "lessons_before_this": [
        "L03"
      ],
      "lessons_after_this": [
        "L05"
      ],
      "module": "Build Stage 5"
    },
    {
      "lesson_id": "L05",
      "title": "Compete, rank, then select",
      "purpose": "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits.",
      "estimated_time": "15-25 min",
      "learning_objective": "Another twelve observations are recorded and rankings are recomputed.",
      "lessons_before_this": [
        "L04"
      ],
      "lessons_after_this": [
        "L06"
      ],
      "module": "Build Stage 5"
    },
    {
      "lesson_id": "L06",
      "title": "Watch the mission dashboard",
      "purpose": "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide.",
      "estimated_time": "15-25 min",
      "learning_objective": "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
      "lessons_before_this": [
        "L05"
      ],
      "lessons_after_this": [
        "L07"
      ],
      "module": "Build Stage 5"
    },
    {
      "lesson_id": "L07",
      "title": "Let dependencies choose the order",
      "purpose": "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs.",
      "estimated_time": "15-25 min",
      "learning_objective": "SWARM TEST PASS includes overlap, dependency order and independent review.",
      "lessons_before_this": [
        "L06"
      ],
      "lessons_after_this": [
        "L08"
      ],
      "module": "Build Stage 5"
    },
    {
      "lesson_id": "L08",
      "title": "Recover without endless loops",
      "purpose": "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again.",
      "estimated_time": "15-25 min",
      "learning_objective": "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
      "lessons_before_this": [
        "L07"
      ],
      "lessons_after_this": [
        "L09"
      ],
      "module": "Bounded Stage 6 lab and real transition"
    },
    {
      "lesson_id": "L09",
      "title": "Manage usage as part of intelligence",
      "purpose": "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions.",
      "estimated_time": "15-25 min",
      "learning_objective": "Tool-call and runtime stop cases remain unapproved.",
      "lessons_before_this": [
        "L08"
      ],
      "lessons_after_this": [
        "L10"
      ],
      "module": "Bounded Stage 6 lab and real transition"
    },
    {
      "lesson_id": "L10",
      "title": "Build Bot Better: keep and restore swarm memory",
      "purpose": "Individual memory is one worker remembering its own notes. Swarm memory is shared evidence about missions, strategies, worker performance, failures and verified results.",
      "estimated_time": "15-25 min",
      "learning_objective": "RESTORE PASS reports matching hashes; original state is still present.",
      "lessons_before_this": [
        "L09"
      ],
      "lessons_after_this": [
        "L11"
      ],
      "module": "Bounded Stage 6 lab and real transition"
    },
    {
      "lesson_id": "L11",
      "title": "Verify, grade and approve the bytes",
      "purpose": "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision.",
      "estimated_time": "15-25 min",
      "learning_objective": "APPROVAL PASS; approved.json exists only in the chosen run folder.",
      "lessons_before_this": [
        "L10"
      ],
      "lessons_after_this": [
        "L12"
      ],
      "module": "Bounded Stage 6 lab and real transition"
    },
    {
      "lesson_id": "L12",
      "title": "Connect to your real AI team honestly",
      "purpose": "Prepare supervised real worker tests with retained evidence and independent review.",
      "estimated_time": "15-25 min",
      "learning_objective": "An actual completed receipt imports into live-evidence/observations.jsonl; an unfilled template correctly fails.",
      "lessons_before_this": [
        "L11"
      ],
      "lessons_after_this": [
        "L13"
      ],
      "module": "Bounded Stage 6 lab and real transition"
    },
    {
      "lesson_id": "L13",
      "title": "Give the swarm an unseen mission",
      "purpose": "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it.",
      "estimated_time": "15-25 min",
      "learning_objective": "PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
      "lessons_before_this": [
        "L12"
      ],
      "lessons_after_this": [],
      "module": "Bounded Stage 6 lab and real transition"
    }
  ],
  "steps": [
    {
      "title": "Name the missing pieces",
      "purpose": "A kitchen manager gives the crew one dinner order; the crew organizes stations. A drone swarm here means harmless coordinated observation, not weapons or tactics. Stage 1: one bot. Stage 2: several bots. Stage 3: you coordinate a team. Stage 4: independent competition. Stage 5: work is organized around a mission. Stage 6: the workflow runs inside human-approved boundaries.",
      "user_action": "Write the stage your current workflow actually reaches. Name the human who assigns tasks, the goal and the missing coordinator. You do not need an existing fleet or hub. A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results.",
      "explanation": "One goal with boundaries and a result to verify. Several tools can be open while a human still assigns every task. Describe the coordination you actually observe. A run ID identifies one execution. A SHA256 hash is a fingerprint of file bytes; changed bytes change the fingerprint. A wave is a group of independent tasks that may run together. A fixture is a supplied practice input with an expected result, not live model performance.",
      "estimated_time": "7-12 min",
      "action_type": "inspect",
      "commands": {
        "windows": "",
        "macos": "",
        "linux": ""
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Your note distinguishes human coordination from bounded mission execution.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Name the missing pieces",
        "success_condition": "Your note distinguishes human coordination from bounded mission execution.",
        "how_to_verify": "Record the requested named facts in your own words; no terminal command is required. This checks evidence shape, not independent truth.",
        "criteria": [
          "Your note distinguishes human coordination from bounded mission execution.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "stage",
          "human"
        ],
        "user_visible_success_message": "Evidence saved. Your note distinguishes human coordination from bounded mission execution.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "No automatic coordinator exists just because several chat tabs are open.",
          "likely_cause": "Several tools can be open while a human still assigns every task. Describe the coordination you actually observe.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Describe what actually happens after a single mission, rather than counting bots.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Describe what actually happens after a single mission, rather than counting bots."
        }
      ],
      "faqs": [
        {
          "question": "What distinguishes a mission from several open chat tabs?",
          "answer": "One goal with boundaries and a result to verify. Several tools can be open while a human still assigns every task. Describe the coordination you actually observe."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What distinguishes a mission from several open chat tabs?",
        "choices": [
          "One goal with boundaries and a result to verify.",
          "More tabs always create a swarm."
        ],
        "correct_answer": 0,
        "explanation": "One goal with boundaries and a result to verify."
      },
      "coach": {
        "intro": "Your next small check: Name the missing pieces",
        "demo": "Write the stage your current workflow actually reaches. Name the human who assigns tasks, the goal and the missing coordinator. You do not need an existing fleet or hub. A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Your note distinguishes human coordination from bounded mission execution.",
        "failure": "Describe what actually happens after a single mission, rather than counting bots.",
        "help": "Describe what actually happens after a single mission, rather than counting bots."
      },
      "video": {
        "purpose": "Demonstrate Name the missing pieces",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A kitchen manager gives the crew one dinner order; the crew organizes stations. A drone swarm here means harmless coordinated observation, not weapons or tactics. Stage 1: one bot. Stage 2: several bots. Stage 3: you coordinate a team. Stage 4: independent competition. Stage 5: work is organized around a mission. Stage 6: the workflow runs inside human-approved boundaries. Write the stage your current workflow actually reaches. Name the human who assigns tasks, the goal and the missing coordinator. You do not need an existing fleet or hub. A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results. Check: Your note distinguishes human coordination from bounded mission execution.",
        "on_screen_text": [
          "Name the missing pieces",
          "Your note distinguishes human coordination from bounded mission execution."
        ],
        "screen_recording_instructions": [
          "Write the stage your current workflow actually reaches. Name the human who assigns tasks, the goal and the missing coordinator. You do not need an existing fleet or hub. A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results.",
          "Write the stage your current workflow actually reaches. Name the human who assigns tasks, the goal and the missing coordinator. You do not need an existing fleet or hub. A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A kitchen manager gives the crew one dinner order; the crew organizes stations. A drone swarm here means harmless coordinated observation, not weapons or tactics. Stage 1: one bot. Stage 2: several bots. Stage 3: you coordinate a team. Stage 4: independent competition. Stage 5: work is organized around a mission. Stage 6: the workflow runs inside human-approved boundaries.",
          "Write the stage your current workflow actually reaches. Name the human who assigns tasks, the goal and the missing coordinator. You do not need an existing fleet or hub. A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results.",
          "Your note distinguishes human coordination from bounded mission execution."
        ]
      },
      "step_id": "L01-S01",
      "lesson_id": "L01"
    },
    {
      "title": "See the whole architecture",
      "purpose": "A kitchen manager gives the crew one dinner order; the crew organizes stations. A drone swarm here means harmless coordinated observation, not weapons or tactics. Stage 1: one bot. Stage 2: several bots. Stage 3: you coordinate a team. Stage 4: independent competition. Stage 5: work is organized around a mission. Stage 6: the workflow runs inside human-approved boundaries.",
      "user_action": "Picture human -> mission contract -> coordinator -> talent database -> workers -> verifier -> approval -> report. Worker results and failures return to shared memory. Open kit/README.md and identify the manager, specialists and human release gate. PRACTICE workers are Python functions; they are not AI or brands.",
      "explanation": "The human after reviewing the verified draft. A component name alone does not establish a functioning service. Trace the arrows and identify the human gate.",
      "estimated_time": "7-12 min",
      "action_type": "inspect",
      "commands": {
        "windows": "",
        "macos": "",
        "linux": ""
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "You can point to every component and state the PRACTICE limit.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "See the whole architecture",
        "success_condition": "You can point to every component and state the PRACTICE limit.",
        "how_to_verify": "Record the requested named facts in your own words; no terminal command is required. This checks evidence shape, not independent truth.",
        "criteria": [
          "You can point to every component and state the PRACTICE limit.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "coordinator",
          "approval"
        ],
        "user_visible_success_message": "Evidence saved. You can point to every component and state the PRACTICE limit.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A role label can be mistaken for a real autonomous agent.",
          "likely_cause": "A component name alone does not establish a functioning service. Trace the arrows and identify the human gate.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Read the mode field and require real invocation evidence before calling it a live swarm.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Read the mode field and require real invocation evidence before calling it a live swarm."
        }
      ],
      "faqs": [
        {
          "question": "Who can release the final draft?",
          "answer": "The human after reviewing the verified draft. A component name alone does not establish a functioning service. Trace the arrows and identify the human gate."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Who can release the final draft?",
        "choices": [
          "The fastest worker without review.",
          "The human after reviewing the verified draft."
        ],
        "correct_answer": 1,
        "explanation": "The human after reviewing the verified draft."
      },
      "coach": {
        "intro": "Your next small check: See the whole architecture",
        "demo": "Picture human -> mission contract -> coordinator -> talent database -> workers -> verifier -> approval -> report. Worker results and failures return to shared memory. Open kit/README.md and identify the manager, specialists and human release gate. PRACTICE workers are Python functions; they are not AI or brands.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "You can point to every component and state the PRACTICE limit.",
        "failure": "Read the mode field and require real invocation evidence before calling it a live swarm.",
        "help": "Read the mode field and require real invocation evidence before calling it a live swarm."
      },
      "video": {
        "purpose": "Demonstrate See the whole architecture",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A kitchen manager gives the crew one dinner order; the crew organizes stations. A drone swarm here means harmless coordinated observation, not weapons or tactics. Stage 1: one bot. Stage 2: several bots. Stage 3: you coordinate a team. Stage 4: independent competition. Stage 5: work is organized around a mission. Stage 6: the workflow runs inside human-approved boundaries. Picture human -> mission contract -> coordinator -> talent database -> workers -> verifier -> approval -> report. Worker results and failures return to shared memory. Open kit/README.md and identify the manager, specialists and human release gate. PRACTICE workers are Python functions; they are not AI or brands. Check: You can point to every component and state the PRACTICE limit.",
        "on_screen_text": [
          "See the whole architecture",
          "You can point to every component and state the PRACTICE limit."
        ],
        "screen_recording_instructions": [
          "Picture human -> mission contract -> coordinator -> talent database -> workers -> verifier -> approval -> report. Worker results and failures return to shared memory. Open kit/README.md and identify the manager, specialists and human release gate. PRACTICE workers are Python functions; they are not AI or brands.",
          "Picture human -> mission contract -> coordinator -> talent database -> workers -> verifier -> approval -> report. Worker results and failures return to shared memory. Open kit/README.md and identify the manager, specialists and human release gate. PRACTICE workers are Python functions; they are not AI or brands.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A kitchen manager gives the crew one dinner order; the crew organizes stations. A drone swarm here means harmless coordinated observation, not weapons or tactics. Stage 1: one bot. Stage 2: several bots. Stage 3: you coordinate a team. Stage 4: independent competition. Stage 5: work is organized around a mission. Stage 6: the workflow runs inside human-approved boundaries.",
          "Picture human -> mission contract -> coordinator -> talent database -> workers -> verifier -> approval -> report. Worker results and failures return to shared memory. Open kit/README.md and identify the manager, specialists and human release gate. PRACTICE workers are Python functions; they are not AI or brands.",
          "You can point to every component and state the PRACTICE limit."
        ]
      },
      "step_id": "L01-S02",
      "lesson_id": "L01"
    },
    {
      "title": "Prepare one practice folder",
      "purpose": "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library.",
      "user_action": "Download Resources, extract into a new folder named swarm-practice outside any shared agent folder, and open that folder in a terminal. All later commands run in this extracted folder. Windows: Shift+right-click the folder and Open in Terminal. macOS/Linux: open Terminal and use cd followed by the folder path in quotes. Run the version command. If Python is absent, use your existing Python setup course or ask a helper to install it; do not install packages or create paid accounts for this exercise.",
      "explanation": "Inside the extracted practice folder. The terminal is in the wrong folder or resolves a store alias instead of the installed Python interpreter.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python --version",
        "macos": "python3 --version",
        "linux": "python3 --version"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Python reports 3.10 or newer.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Prepare one practice folder",
        "success_condition": "Python reports 3.10 or newer.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "Python reports 3.10 or newer.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "Python 3."
        ],
        "user_visible_success_message": "Evidence saved. Python reports 3.10 or newer.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step.",
        "python_min": [
          3,
          10
        ]
      },
      "troubleshooting": [
        {
          "problem": "Python not found or Store placeholder opens.",
          "likely_cause": "The terminal is in the wrong folder or resolves a store alias instead of the installed Python interpreter.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Use the installed Python launcher on Windows (py -3); on macOS/Linux use python3. Installation on a clean OS is not claimed by this kit.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Use the installed Python launcher on Windows (py -3); on macOS/Linux use python3. Installation on a clean OS is not claimed by this kit."
        }
      ],
      "faqs": [
        {
          "question": "Where should later commands run?",
          "answer": "Inside the extracted practice folder. The terminal is in the wrong folder or resolves a store alias instead of the installed Python interpreter."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Where should later commands run?",
        "choices": [
          "Inside the extracted practice folder.",
          "In any terminal folder."
        ],
        "correct_answer": 0,
        "explanation": "Inside the extracted practice folder."
      },
      "coach": {
        "intro": "Your next small check: Prepare one practice folder",
        "demo": "Download Resources, extract into a new folder named swarm-practice outside any shared agent folder, and open that folder in a terminal. All later commands run in this extracted folder. Windows: Shift+right-click the folder and Open in Terminal. macOS/Linux: open Terminal and use cd followed by the folder path in quotes. Run the version command. If Python is absent, use your existing Python setup course or ask a helper to install it; do not install packages or create paid accounts for this exercise.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Python reports 3.10 or newer.",
        "failure": "Use the installed Python launcher on Windows (py -3); on macOS/Linux use python3. Installation on a clean OS is not claimed by this kit.",
        "help": "Use the installed Python launcher on Windows (py -3); on macOS/Linux use python3. Installation on a clean OS is not claimed by this kit."
      },
      "video": {
        "purpose": "Demonstrate Prepare one practice folder",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library. Download Resources, extract into a new folder named swarm-practice outside any shared agent folder, and open that folder in a terminal. All later commands run in this extracted folder. Windows: Shift+right-click the folder and Open in Terminal. macOS/Linux: open Terminal and use cd followed by the folder path in quotes. Run the version command. If Python is absent, use your existing Python setup course or ask a helper to install it; do not install packages or create paid accounts for this exercise. Check: Python reports 3.10 or newer.",
        "on_screen_text": [
          "Prepare one practice folder",
          "Python reports 3.10 or newer."
        ],
        "screen_recording_instructions": [
          "Download Resources, extract into a new folder named swarm-practice outside any shared agent folder, and open that folder in a terminal. All later commands run in this extracted folder. Windows: Shift+right-click the folder and Open in Terminal. macOS/Linux: open Terminal and use cd followed by the folder path in quotes. Run the version command. If Python is absent, use your existing Python setup course or ask a helper to install it; do not install packages or create paid accounts for this exercise.",
          "Download Resources, extract into a new folder named swarm-practice outside any shared agent folder, and open that folder in a terminal. All later commands run in this extracted folder. Windows: Shift+right-click the folder and Open in Terminal. macOS/Linux: open Terminal and use cd followed by the folder path in quotes. Run the version command. If Python is absent, use your existing Python setup course or ask a helper to install it; do not install packages or create paid accounts for this exercise.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library.",
          "Download Resources, extract into a new folder named swarm-practice outside any shared agent folder, and open that folder in a terminal. All later commands run in this extracted folder. Windows: Shift+right-click the folder and Open in Terminal. macOS/Linux: open Terminal and use cd followed by the folder path in quotes. Run the version command. If Python is absent, use your existing Python setup course or ask a helper to install it; do not install packages or create paid accounts for this exercise.",
          "Python reports 3.10 or newer."
        ]
      },
      "step_id": "L02-S01",
      "lesson_id": "L02"
    },
    {
      "title": "Run the environment check",
      "purpose": "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library.",
      "user_action": "Run doctor and keep its actual output. Open guardrails.py: it permits only PRACTICE, local tools, no websites, zero monetary spend, bounded attempts and runtime. This guard checks application inputs; it does not sandbox arbitrary malicious Python. Inspect downloaded code before running it.",
      "explanation": "The local Python components needed by this practice kit are available. A missing file usually means the archive was not fully extracted or the terminal is in its parent folder.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py doctor",
        "macos": "python3 coordinator.py doctor",
        "linux": "python3 coordinator.py doctor"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "DOCTOR PASS appears; no credential or network is required.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Run the environment check",
        "success_condition": "DOCTOR PASS appears; no credential or network is required.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "DOCTOR PASS appears; no credential or network is required.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "DOCTOR PASS"
        ],
        "user_visible_success_message": "Evidence saved. DOCTOR PASS appears; no credential or network is required.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "ImportError or SQLite unavailable.",
          "likely_cause": "A missing file usually means the archive was not fully extracted or the terminal is in its parent folder.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Confirm all downloaded files are in the same extracted folder, and use a standard Python 3.10+ installation.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Confirm all downloaded files are in the same extracted folder, and use a standard Python 3.10+ installation."
        }
      ],
      "faqs": [
        {
          "question": "What does doctor prove?",
          "answer": "The local Python components needed by this practice kit are available. A missing file usually means the archive was not fully extracted or the terminal is in its parent folder."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What does doctor prove?",
        "choices": [
          "Every external AI service is authenticated.",
          "The local Python components needed by this practice kit are available."
        ],
        "correct_answer": 1,
        "explanation": "The local Python components needed by this practice kit are available."
      },
      "coach": {
        "intro": "Your next small check: Run the environment check",
        "demo": "Run doctor and keep its actual output. Open guardrails.py: it permits only PRACTICE, local tools, no websites, zero monetary spend, bounded attempts and runtime. This guard checks application inputs; it does not sandbox arbitrary malicious Python. Inspect downloaded code before running it.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "DOCTOR PASS appears; no credential or network is required.",
        "failure": "Confirm all downloaded files are in the same extracted folder, and use a standard Python 3.10+ installation.",
        "help": "Confirm all downloaded files are in the same extracted folder, and use a standard Python 3.10+ installation."
      },
      "video": {
        "purpose": "Demonstrate Run the environment check",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library. Run doctor and keep its actual output. Open guardrails.py: it permits only PRACTICE, local tools, no websites, zero monetary spend, bounded attempts and runtime. This guard checks application inputs; it does not sandbox arbitrary malicious Python. Inspect downloaded code before running it. Check: DOCTOR PASS appears; no credential or network is required.",
        "on_screen_text": [
          "Run the environment check",
          "DOCTOR PASS appears; no credential or network is required."
        ],
        "screen_recording_instructions": [
          "Run doctor and keep its actual output. Open guardrails.py: it permits only PRACTICE, local tools, no websites, zero monetary spend, bounded attempts and runtime. This guard checks application inputs; it does not sandbox arbitrary malicious Python. Inspect downloaded code before running it.",
          "Run doctor and keep its actual output. Open guardrails.py: it permits only PRACTICE, local tools, no websites, zero monetary spend, bounded attempts and runtime. This guard checks application inputs; it does not sandbox arbitrary malicious Python. Inspect downloaded code before running it.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library.",
          "Run doctor and keep its actual output. Open guardrails.py: it permits only PRACTICE, local tools, no websites, zero monetary spend, bounded attempts and runtime. This guard checks application inputs; it does not sandbox arbitrary malicious Python. Inspect downloaded code before running it.",
          "DOCTOR PASS appears; no credential or network is required."
        ]
      },
      "step_id": "L02-S02",
      "lesson_id": "L02"
    },
    {
      "title": "Read the mission contract",
      "purpose": "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs.",
      "user_action": "Open mission.json in a text editor. Find MISSION, OBJECTIVE, CONSTRAINTS, AVAILABLE RESOURCES, SUCCESS CRITERIA and APPROVAL RULES. The supplied source notes are invented and labelled. Human approval covers local release only. Run plan.",
      "explanation": "Both research and planning. An unsupported output type or malformed mission causes contract validation to stop before work begins.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py plan --mission mission.json",
        "macos": "python3 coordinator.py plan --mission mission.json",
        "linux": "python3 coordinator.py plan --mission mission.json"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Read the mission contract",
        "success_condition": "The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "depends",
          "writing",
          "testing"
        ],
        "user_visible_success_message": "Evidence saved. The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Invalid mission or unsupported deliverable.",
          "likely_cause": "An unsupported output type or malformed mission causes contract validation to stop before work begins.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Use guide or checklist, provide 2-30 unique source notes, and keep the PRACTICE constraints. This is a fixed recipe, not a general natural-language planner.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Use guide or checklist, provide 2-30 unique source notes, and keep the PRACTICE constraints. This is a fixed recipe, not a general natural-language planner."
        }
      ],
      "faqs": [
        {
          "question": "What must finish before writing starts?",
          "answer": "Both research and planning. An unsupported output type or malformed mission causes contract validation to stop before work begins."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What must finish before writing starts?",
        "choices": [
          "Both research and planning.",
          "Only testing."
        ],
        "correct_answer": 0,
        "explanation": "Both research and planning."
      },
      "coach": {
        "intro": "Your next small check: Read the mission contract",
        "demo": "Open mission.json in a text editor. Find MISSION, OBJECTIVE, CONSTRAINTS, AVAILABLE RESOURCES, SUCCESS CRITERIA and APPROVAL RULES. The supplied source notes are invented and labelled. Human approval covers local release only. Run plan.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing.",
        "failure": "Use guide or checklist, provide 2-30 unique source notes, and keep the PRACTICE constraints. This is a fixed recipe, not a general natural-language planner.",
        "help": "Use guide or checklist, provide 2-30 unique source notes, and keep the PRACTICE constraints. This is a fixed recipe, not a general natural-language planner."
      },
      "video": {
        "purpose": "Demonstrate Read the mission contract",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs. Open mission.json in a text editor. Find MISSION, OBJECTIVE, CONSTRAINTS, AVAILABLE RESOURCES, SUCCESS CRITERIA and APPROVAL RULES. The supplied source notes are invented and labelled. Human approval covers local release only. Run plan. Check: The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing.",
        "on_screen_text": [
          "Read the mission contract",
          "The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing."
        ],
        "screen_recording_instructions": [
          "Open mission.json in a text editor. Find MISSION, OBJECTIVE, CONSTRAINTS, AVAILABLE RESOURCES, SUCCESS CRITERIA and APPROVAL RULES. The supplied source notes are invented and labelled. Human approval covers local release only. Run plan.",
          "Open mission.json in a text editor. Find MISSION, OBJECTIVE, CONSTRAINTS, AVAILABLE RESOURCES, SUCCESS CRITERIA and APPROVAL RULES. The supplied source notes are invented and labelled. Human approval covers local release only. Run plan.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs.",
          "Open mission.json in a text editor. Find MISSION, OBJECTIVE, CONSTRAINTS, AVAILABLE RESOURCES, SUCCESS CRITERIA and APPROVAL RULES. The supplied source notes are invented and labelled. Human approval covers local release only. Run plan.",
          "The plan contains research and planning with no dependencies, writing waiting for both, and testing waiting for writing."
        ]
      },
      "step_id": "L03-S01",
      "lesson_id": "L03"
    },
    {
      "title": "Test a rejected boundary",
      "purpose": "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs.",
      "user_action": "Run the supplied negative-contract check. It attempts an external website permission, nonzero spending, malformed score and escaped output path. It must reject every case before any mission work.",
      "explanation": "This practice mode promises zero paid calls and cannot enforce a live budget. A changed guardrail can accept permissions that the practice environment cannot enforce.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python test_swarm.py --contracts",
        "macos": "python3 test_swarm.py --contracts",
        "linux": "python3 test_swarm.py --contracts"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "CONTRACTS PASS appears.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Test a rejected boundary",
        "success_condition": "CONTRACTS PASS appears.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "CONTRACTS PASS appears.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "CONTRACTS PASS"
        ],
        "user_visible_success_message": "Evidence saved. CONTRACTS PASS appears.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A test unexpectedly accepts an invalid mission.",
          "likely_cause": "A changed guardrail can accept permissions that the practice environment cannot enforce.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Stop. Compare your guardrails.py with the reviewed kit and do not add real credentials or broaden permissions.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Stop. Compare your guardrails.py with the reviewed kit and do not add real credentials or broaden permissions."
        }
      ],
      "faqs": [
        {
          "question": "Why reject a mission that allows paid tools?",
          "answer": "This practice mode promises zero paid calls and cannot enforce a live budget. A changed guardrail can accept permissions that the practice environment cannot enforce."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Why reject a mission that allows paid tools?",
        "choices": [
          "Every paid tool is always unsafe.",
          "This practice mode promises zero paid calls and cannot enforce a live budget."
        ],
        "correct_answer": 1,
        "explanation": "This practice mode promises zero paid calls and cannot enforce a live budget."
      },
      "coach": {
        "intro": "Your next small check: Test a rejected boundary",
        "demo": "Run the supplied negative-contract check. It attempts an external website permission, nonzero spending, malformed score and escaped output path. It must reject every case before any mission work.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "CONTRACTS PASS appears.",
        "failure": "Stop. Compare your guardrails.py with the reviewed kit and do not add real credentials or broaden permissions.",
        "help": "Stop. Compare your guardrails.py with the reviewed kit and do not add real credentials or broaden permissions."
      },
      "video": {
        "purpose": "Demonstrate Test a rejected boundary",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs. Run the supplied negative-contract check. It attempts an external website permission, nonzero spending, malformed score and escaped output path. It must reject every case before any mission work. Check: CONTRACTS PASS appears.",
        "on_screen_text": [
          "Test a rejected boundary",
          "CONTRACTS PASS appears."
        ],
        "screen_recording_instructions": [
          "Run the supplied negative-contract check. It attempts an external website permission, nonzero spending, malformed score and escaped output path. It must reject every case before any mission work.",
          "Run the supplied negative-contract check. It attempts an external website permission, nonzero spending, malformed score and escaped output path. It must reject every case before any mission work.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs.",
          "Run the supplied negative-contract check. It attempts an external website permission, nonzero spending, malformed score and escaped output path. It must reject every case before any mission work.",
          "CONTRACTS PASS appears."
        ]
      },
      "step_id": "L03-S02",
      "lesson_id": "L03"
    },
    {
      "title": "Run twelve independent auditions",
      "purpose": "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence.",
      "user_action": "Run audition. Amber, Blue and Coral each attempt research, planning, writing and testing against the same input. The grader checks source preservation, outline structure, draft shape and review outcome. It records actual elapsed time, errors and pass/fail. Scores of 0 or 100 mean structural fixture performance only.",
      "explanation": "A structural test of this deterministic practice output. A worker deadline or missing source note fails a fixture; retain the failure as measured evidence.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py audition --mission mission.json",
        "macos": "python3 coordinator.py audition --mission mission.json",
        "linux": "python3 coordinator.py audition --mission mission.json"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "AUDITION PASS: 12 observed PRACTICE tests.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Run twelve independent auditions",
        "success_condition": "AUDITION PASS: 12 observed PRACTICE tests.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "AUDITION PASS: 12 observed PRACTICE tests.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "AUDITION PASS"
        ],
        "user_visible_success_message": "Evidence saved. AUDITION PASS: 12 observed PRACTICE tests.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A worker times out or receives zero.",
          "likely_cause": "A worker deadline or missing source note fails a fixture; retain the failure as measured evidence.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Read the failed dimension in talent.sqlite or the talent output. Zero is useful evidence; do not replace it with a guessed high score.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Read the failed dimension in talent.sqlite or the talent output. Zero is useful evidence; do not replace it with a guessed high score."
        }
      ],
      "faqs": [
        {
          "question": "What does a score of 100 measure here?",
          "answer": "A structural test of this deterministic practice output. A worker deadline or missing source note fails a fixture; retain the failure as measured evidence."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What does a score of 100 measure here?",
        "choices": [
          "A structural test of this deterministic practice output.",
          "Perfect real-world creative quality."
        ],
        "correct_answer": 0,
        "explanation": "A structural test of this deterministic practice output."
      },
      "coach": {
        "intro": "Your next small check: Run twelve independent auditions",
        "demo": "Run audition. Amber, Blue and Coral each attempt research, planning, writing and testing against the same input. The grader checks source preservation, outline structure, draft shape and review outcome. It records actual elapsed time, errors and pass/fail. Scores of 0 or 100 mean structural fixture performance only.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "AUDITION PASS: 12 observed PRACTICE tests.",
        "failure": "Read the failed dimension in talent.sqlite or the talent output. Zero is useful evidence; do not replace it with a guessed high score.",
        "help": "Read the failed dimension in talent.sqlite or the talent output. Zero is useful evidence; do not replace it with a guessed high score."
      },
      "video": {
        "purpose": "Demonstrate Run twelve independent auditions",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence. Run audition. Amber, Blue and Coral each attempt research, planning, writing and testing against the same input. The grader checks source preservation, outline structure, draft shape and review outcome. It records actual elapsed time, errors and pass/fail. Scores of 0 or 100 mean structural fixture performance only. Check: AUDITION PASS: 12 observed PRACTICE tests.",
        "on_screen_text": [
          "Run twelve independent auditions",
          "AUDITION PASS: 12 observed PRACTICE tests."
        ],
        "screen_recording_instructions": [
          "Run audition. Amber, Blue and Coral each attempt research, planning, writing and testing against the same input. The grader checks source preservation, outline structure, draft shape and review outcome. It records actual elapsed time, errors and pass/fail. Scores of 0 or 100 mean structural fixture performance only.",
          "Run audition. Amber, Blue and Coral each attempt research, planning, writing and testing against the same input. The grader checks source preservation, outline structure, draft shape and review outcome. It records actual elapsed time, errors and pass/fail. Scores of 0 or 100 mean structural fixture performance only.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence.",
          "Run audition. Amber, Blue and Coral each attempt research, planning, writing and testing against the same input. The grader checks source preservation, outline structure, draft shape and review outcome. It records actual elapsed time, errors and pass/fail. Scores of 0 or 100 mean structural fixture performance only.",
          "AUDITION PASS: 12 observed PRACTICE tests."
        ]
      },
      "step_id": "L04-S01",
      "lesson_id": "L04"
    },
    {
      "title": "Inspect the talent database",
      "purpose": "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence.",
      "user_action": "Run talent. Identify the best currently observed writer and researcher, the number of observations, last-test date, average seconds and success rate. The latest five observations per bot/skill drive selection. A live audition uses reviewed 25-point quality, 25-point accuracy, 20-point completeness, 15-point usefulness and 15-point tool-discipline ratings, plus measured speed, errors, reliability and usage separately.",
      "explanation": "A local SQLite database. No auditions have run in this folder, so there are no skill observations to inspect.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py talent",
        "macos": "python3 coordinator.py talent",
        "linux": "python3 coordinator.py talent"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Each skill has measured PRACTICE profiles; tokens are not invented.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Inspect the talent database",
        "success_condition": "Each skill has measured PRACTICE profiles; tokens are not invented.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "Each skill has measured PRACTICE profiles; tokens are not invented.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "research",
          "observations"
        ],
        "user_visible_success_message": "Evidence saved. Each skill has measured PRACTICE profiles; tokens are not invented.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Profiles appear empty or claim real brand skills.",
          "likely_cause": "No auditions have run in this folder, so there are no skill observations to inspect.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Run audition first. Keep REAL_OBSERVED receipts separate; a fixture result cannot establish Claude, Codex or Grok capability.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Run audition first. Keep REAL_OBSERVED receipts separate; a fixture result cannot establish Claude, Codex or Grok capability."
        }
      ],
      "faqs": [
        {
          "question": "What stores observed skill results?",
          "answer": "A local SQLite database. No auditions have run in this folder, so there are no skill observations to inspect."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What stores observed skill results?",
        "choices": [
          "An assumed model-brand ranking.",
          "A local SQLite database."
        ],
        "correct_answer": 1,
        "explanation": "A local SQLite database."
      },
      "coach": {
        "intro": "Your next small check: Inspect the talent database",
        "demo": "Run talent. Identify the best currently observed writer and researcher, the number of observations, last-test date, average seconds and success rate. The latest five observations per bot/skill drive selection. A live audition uses reviewed 25-point quality, 25-point accuracy, 20-point completeness, 15-point usefulness and 15-point tool-discipline ratings, plus measured speed, errors, reliability and usage separately.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Each skill has measured PRACTICE profiles; tokens are not invented.",
        "failure": "Run audition first. Keep REAL_OBSERVED receipts separate; a fixture result cannot establish Claude, Codex or Grok capability.",
        "help": "Run audition first. Keep REAL_OBSERVED receipts separate; a fixture result cannot establish Claude, Codex or Grok capability."
      },
      "video": {
        "purpose": "Demonstrate Inspect the talent database",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence. Run talent. Identify the best currently observed writer and researcher, the number of observations, last-test date, average seconds and success rate. The latest five observations per bot/skill drive selection. A live audition uses reviewed 25-point quality, 25-point accuracy, 20-point completeness, 15-point usefulness and 15-point tool-discipline ratings, plus measured speed, errors, reliability and usage separately. Check: Each skill has measured PRACTICE profiles; tokens are not invented.",
        "on_screen_text": [
          "Inspect the talent database",
          "Each skill has measured PRACTICE profiles; tokens are not invented."
        ],
        "screen_recording_instructions": [
          "Run talent. Identify the best currently observed writer and researcher, the number of observations, last-test date, average seconds and success rate. The latest five observations per bot/skill drive selection. A live audition uses reviewed 25-point quality, 25-point accuracy, 20-point completeness, 15-point usefulness and 15-point tool-discipline ratings, plus measured speed, errors, reliability and usage separately.",
          "Run talent. Identify the best currently observed writer and researcher, the number of observations, last-test date, average seconds and success rate. The latest five observations per bot/skill drive selection. A live audition uses reviewed 25-point quality, 25-point accuracy, 20-point completeness, 15-point usefulness and 15-point tool-discipline ratings, plus measured speed, errors, reliability and usage separately.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence.",
          "Run talent. Identify the best currently observed writer and researcher, the number of observations, last-test date, average seconds and success rate. The latest five observations per bot/skill drive selection. A live audition uses reviewed 25-point quality, 25-point accuracy, 20-point completeness, 15-point usefulness and 15-point tool-discipline ratings, plus measured speed, errors, reliability and usage separately.",
          "Each skill has measured PRACTICE profiles; tokens are not invented."
        ]
      },
      "step_id": "L04-S02",
      "lesson_id": "L04"
    },
    {
      "title": "Trace a selection decision",
      "purpose": "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits.",
      "user_action": "Read selection_score in coordinator.py and your talent output: 70% quality, up to 25 reliability points, and up to 5 speed points. Require quality at least 50. Costs are equally zero in this kit, so money does not distinguish workers. A live selector must reject unknown usage when a hard budget is required; among qualified candidates compare measured cost, speed and quality with a declared policy.",
      "explanation": "The worker must meet the quality threshold. A fast candidate may have failed the required skill, making it ineligible before speed is compared.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py talent",
        "macos": "python3 coordinator.py talent",
        "linux": "python3 coordinator.py talent"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Trace a selection decision",
        "success_condition": "You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "research",
          "quality"
        ],
        "user_visible_success_message": "Evidence saved. You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "The fastest worker has failed the skill test.",
          "likely_cause": "A fast candidate may have failed the required skill, making it ineligible before speed is compared.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Quality eligibility comes before speed. Do not remove the quality filter just to make a failed mission run.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Quality eligibility comes before speed. Do not remove the quality filter just to make a failed mission run."
        }
      ],
      "faqs": [
        {
          "question": "Which selector rule comes before speed?",
          "answer": "The worker must meet the quality threshold. A fast candidate may have failed the required skill, making it ineligible before speed is compared."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Which selector rule comes before speed?",
        "choices": [
          "The worker must meet the quality threshold.",
          "The fastest worker always wins."
        ],
        "correct_answer": 0,
        "explanation": "The worker must meet the quality threshold."
      },
      "coach": {
        "intro": "Your next small check: Trace a selection decision",
        "demo": "Read selection_score in coordinator.py and your talent output: 70% quality, up to 25 reliability points, and up to 5 speed points. Require quality at least 50. Costs are equally zero in this kit, so money does not distinguish workers. A live selector must reject unknown usage when a hard budget is required; among qualified candidates compare measured cost, speed and quality with a declared policy.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed.",
        "failure": "Quality eligibility comes before speed. Do not remove the quality filter just to make a failed mission run.",
        "help": "Quality eligibility comes before speed. Do not remove the quality filter just to make a failed mission run."
      },
      "video": {
        "purpose": "Demonstrate Trace a selection decision",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits. Read selection_score in coordinator.py and your talent output: 70% quality, up to 25 reliability points, and up to 5 speed points. Require quality at least 50. Costs are equally zero in this kit, so money does not distinguish workers. A live selector must reject unknown usage when a hard budget is required; among qualified candidates compare measured cost, speed and quality with a declared policy. Check: You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed.",
        "on_screen_text": [
          "Trace a selection decision",
          "You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed."
        ],
        "screen_recording_instructions": [
          "Read selection_score in coordinator.py and your talent output: 70% quality, up to 25 reliability points, and up to 5 speed points. Require quality at least 50. Costs are equally zero in this kit, so money does not distinguish workers. A live selector must reject unknown usage when a hard budget is required; among qualified candidates compare measured cost, speed and quality with a declared policy.",
          "Read selection_score in coordinator.py and your talent output: 70% quality, up to 25 reliability points, and up to 5 speed points. Require quality at least 50. Costs are equally zero in this kit, so money does not distinguish workers. A live selector must reject unknown usage when a hard budget is required; among qualified candidates compare measured cost, speed and quality with a declared policy.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits.",
          "Read selection_score in coordinator.py and your talent output: 70% quality, up to 25 reliability points, and up to 5 speed points. Require quality at least 50. Costs are equally zero in this kit, so money does not distinguish workers. A live selector must reject unknown usage when a hard budget is required; among qualified candidates compare measured cost, speed and quality with a declared policy.",
          "You can explain why the first candidate ranks ahead of the next and why no real-model price is claimed."
        ]
      },
      "step_id": "L05-S01",
      "lesson_id": "L05"
    },
    {
      "title": "Retest instead of freezing reputations",
      "purpose": "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits.",
      "user_action": "Repeat auditions once and compare observation counts. The database retains all observations, while selection uses the most recent five. Repeat after a changed model, tool, prompt or recurring failure. Wider skills such as coding, debugging, SQL, fact checking, image/video creation and editing need their own test artifacts and human rubrics; this kit does not fake those capabilities.",
      "explanation": "Recent observations can change the selection. Reusing an old database without new observations leaves the earlier ranking unchanged.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py audition --mission mission.json",
        "macos": "python3 coordinator.py audition --mission mission.json",
        "linux": "python3 coordinator.py audition --mission mission.json"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Another twelve observations are recorded and rankings are recomputed.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Retest instead of freezing reputations",
        "success_condition": "Another twelve observations are recorded and rankings are recomputed.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "Another twelve observations are recorded and rankings are recomputed.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "AUDITION PASS"
        ],
        "user_visible_success_message": "Evidence saved. Another twelve observations are recorded and rankings are recomputed.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A favorite worker remains best forever despite new failures.",
          "likely_cause": "Reusing an old database without new observations leaves the earlier ranking unchanged.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Check that selection reads recent observations, not a hard-coded agent brand score.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Check that selection reads recent observations, not a hard-coded agent brand score."
        }
      ],
      "faqs": [
        {
          "question": "Why repeat an audition?",
          "answer": "Recent observations can change the selection. Reusing an old database without new observations leaves the earlier ranking unchanged."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Why repeat an audition?",
        "choices": [
          "To keep a favorite permanently first.",
          "Recent observations can change the selection."
        ],
        "correct_answer": 1,
        "explanation": "Recent observations can change the selection."
      },
      "coach": {
        "intro": "Your next small check: Retest instead of freezing reputations",
        "demo": "Repeat auditions once and compare observation counts. The database retains all observations, while selection uses the most recent five. Repeat after a changed model, tool, prompt or recurring failure. Wider skills such as coding, debugging, SQL, fact checking, image/video creation and editing need their own test artifacts and human rubrics; this kit does not fake those capabilities.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Another twelve observations are recorded and rankings are recomputed.",
        "failure": "Check that selection reads recent observations, not a hard-coded agent brand score.",
        "help": "Check that selection reads recent observations, not a hard-coded agent brand score."
      },
      "video": {
        "purpose": "Demonstrate Retest instead of freezing reputations",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits. Repeat auditions once and compare observation counts. The database retains all observations, while selection uses the most recent five. Repeat after a changed model, tool, prompt or recurring failure. Wider skills such as coding, debugging, SQL, fact checking, image/video creation and editing need their own test artifacts and human rubrics; this kit does not fake those capabilities. Check: Another twelve observations are recorded and rankings are recomputed.",
        "on_screen_text": [
          "Retest instead of freezing reputations",
          "Another twelve observations are recorded and rankings are recomputed."
        ],
        "screen_recording_instructions": [
          "Repeat auditions once and compare observation counts. The database retains all observations, while selection uses the most recent five. Repeat after a changed model, tool, prompt or recurring failure. Wider skills such as coding, debugging, SQL, fact checking, image/video creation and editing need their own test artifacts and human rubrics; this kit does not fake those capabilities.",
          "Repeat auditions once and compare observation counts. The database retains all observations, while selection uses the most recent five. Repeat after a changed model, tool, prompt or recurring failure. Wider skills such as coding, debugging, SQL, fact checking, image/video creation and editing need their own test artifacts and human rubrics; this kit does not fake those capabilities.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits.",
          "Repeat auditions once and compare observation counts. The database retains all observations, while selection uses the most recent five. Repeat after a changed model, tool, prompt or recurring failure. Wider skills such as coding, debugging, SQL, fact checking, image/video creation and editing need their own test artifacts and human rubrics; this kit does not fake those capabilities.",
          "Another twelve observations are recorded and rankings are recomputed."
        ]
      },
      "step_id": "L05-S02",
      "lesson_id": "L05"
    },
    {
      "title": "Open a read-only monitor",
      "purpose": "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide.",
      "user_action": "In a second terminal in the same extracted folder, start dashboard.py. It binds only 127.0.0.1 and chooses an available port automatically. Open the printed URL, not a guessed port. Leave the terminal open; Ctrl+C stops it. Before the first mission, Waiting is expected.",
      "explanation": "The exact loopback URL printed by dashboard.py. The server terminal has stopped or the browser uses an old port; the default chooses a free loopback port.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python dashboard.py",
        "macos": "python3 dashboard.py",
        "linux": "python3 dashboard.py"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "A PRACTICE Mission Control page opens at the printed localhost URL.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Open a read-only monitor",
        "success_condition": "A PRACTICE Mission Control page opens at the printed localhost URL.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "A PRACTICE Mission Control page opens at the printed localhost URL.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "http://127.0.0.1:"
        ],
        "user_visible_success_message": "Evidence saved. A PRACTICE Mission Control page opens at the printed localhost URL.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Address already in use or browser cannot connect.",
          "likely_cause": "The server terminal has stopped or the browser uses an old port; the default chooses a free loopback port.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Use the default automatic port, check the exact printed URL and keep the server terminal running. Never bind to 0.0.0.0.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Use the default automatic port, check the exact printed URL and keep the server terminal running. Never bind to 0.0.0.0."
        }
      ],
      "faqs": [
        {
          "question": "Which address should open the monitor?",
          "answer": "The exact loopback URL printed by dashboard.py. The server terminal has stopped or the browser uses an old port; the default chooses a free loopback port."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Which address should open the monitor?",
        "choices": [
          "The exact loopback URL printed by dashboard.py.",
          "A guessed public address."
        ],
        "correct_answer": 0,
        "explanation": "The exact loopback URL printed by dashboard.py."
      },
      "coach": {
        "intro": "Your next small check: Open a read-only monitor",
        "demo": "In a second terminal in the same extracted folder, start dashboard.py. It binds only 127.0.0.1 and chooses an available port automatically. Open the printed URL, not a guessed port. Leave the terminal open; Ctrl+C stops it. Before the first mission, Waiting is expected.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "A PRACTICE Mission Control page opens at the printed localhost URL.",
        "failure": "Use the default automatic port, check the exact printed URL and keep the server terminal running. Never bind to 0.0.0.0.",
        "help": "Use the default automatic port, check the exact printed URL and keep the server terminal running. Never bind to 0.0.0.0."
      },
      "video": {
        "purpose": "Demonstrate Open a read-only monitor",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide. In a second terminal in the same extracted folder, start dashboard.py. It binds only 127.0.0.1 and chooses an available port automatically. Open the printed URL, not a guessed port. Leave the terminal open; Ctrl+C stops it. Before the first mission, Waiting is expected. Check: A PRACTICE Mission Control page opens at the printed localhost URL.",
        "on_screen_text": [
          "Open a read-only monitor",
          "A PRACTICE Mission Control page opens at the printed localhost URL."
        ],
        "screen_recording_instructions": [
          "In a second terminal in the same extracted folder, start dashboard.py. It binds only 127.0.0.1 and chooses an available port automatically. Open the printed URL, not a guessed port. Leave the terminal open; Ctrl+C stops it. Before the first mission, Waiting is expected.",
          "In a second terminal in the same extracted folder, start dashboard.py. It binds only 127.0.0.1 and chooses an available port automatically. Open the printed URL, not a guessed port. Leave the terminal open; Ctrl+C stops it. Before the first mission, Waiting is expected.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide.",
          "In a second terminal in the same extracted folder, start dashboard.py. It binds only 127.0.0.1 and chooses an available port automatically. Open the printed URL, not a guessed port. Leave the terminal open; Ctrl+C stops it. Before the first mission, Waiting is expected.",
          "A PRACTICE Mission Control page opens at the printed localhost URL."
        ]
      },
      "step_id": "L06-S01",
      "lesson_id": "L06"
    },
    {
      "title": "Know what the monitor means",
      "purpose": "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide.",
      "user_action": "Keep the dashboard open while running the next lesson. It polls every two seconds and shows status, workers, queued/completed/failed/blocked tasks, measured skills, attempts, messages, usage, errors, verification and approval hash. Short sub-second practice tasks may finish between refreshes; the message history retains each wave. Tokens are null because no model ran.",
      "explanation": "It may finish between two-second refreshes; messages retain its history. The browser refresh interval is longer than a short task, so inspect saved messages for the complete sequence.",
      "estimated_time": "7-12 min",
      "action_type": "inspect",
      "commands": {
        "windows": "",
        "macos": "",
        "linux": ""
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Know what the monitor means",
        "success_condition": "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
        "how_to_verify": "Record the requested named facts in your own words; no terminal command is required. This checks evidence shape, not independent truth.",
        "criteria": [
          "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "PRACTICE",
          "messages"
        ],
        "user_visible_success_message": "Evidence saved. The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "You do not see a brief running state.",
          "likely_cause": "The browser refresh interval is longer than a short task, so inspect saved messages for the complete sequence.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Read the assigned and parallel_wave messages. A two-second monitor is not proof that tasks did not overlap.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Read the assigned and parallel_wave messages. A two-second monitor is not proof that tasks did not overlap."
        }
      ],
      "faqs": [
        {
          "question": "Why can a running task be missed on screen?",
          "answer": "It may finish between two-second refreshes; messages retain its history. The browser refresh interval is longer than a short task, so inspect saved messages for the complete sequence."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Why can a running task be missed on screen?",
        "choices": [
          "No visible task means no work ran.",
          "It may finish between two-second refreshes; messages retain its history."
        ],
        "correct_answer": 1,
        "explanation": "It may finish between two-second refreshes; messages retain its history."
      },
      "coach": {
        "intro": "Your next small check: Know what the monitor means",
        "demo": "Keep the dashboard open while running the next lesson. It polls every two seconds and shows status, workers, queued/completed/failed/blocked tasks, measured skills, attempts, messages, usage, errors, verification and approval hash. Short sub-second practice tasks may finish between refreshes; the message history retains each wave. Tokens are null because no model ran.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
        "failure": "Read the assigned and parallel_wave messages. A two-second monitor is not proof that tasks did not overlap.",
        "help": "Read the assigned and parallel_wave messages. A two-second monitor is not proof that tasks did not overlap."
      },
      "video": {
        "purpose": "Demonstrate Know what the monitor means",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide. Keep the dashboard open while running the next lesson. It polls every two seconds and shows status, workers, queued/completed/failed/blocked tasks, measured skills, attempts, messages, usage, errors, verification and approval hash. Short sub-second practice tasks may finish between refreshes; the message history retains each wave. Tokens are null because no model ran. Check: The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
        "on_screen_text": [
          "Know what the monitor means",
          "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks."
        ],
        "screen_recording_instructions": [
          "Keep the dashboard open while running the next lesson. It polls every two seconds and shows status, workers, queued/completed/failed/blocked tasks, measured skills, attempts, messages, usage, errors, verification and approval hash. Short sub-second practice tasks may finish between refreshes; the message history retains each wave. Tokens are null because no model ran.",
          "Keep the dashboard open while running the next lesson. It polls every two seconds and shows status, workers, queued/completed/failed/blocked tasks, measured skills, attempts, messages, usage, errors, verification and approval hash. Short sub-second practice tasks may finish between refreshes; the message history retains each wave. Tokens are null because no model ran.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide.",
          "Keep the dashboard open while running the next lesson. It polls every two seconds and shows status, workers, queued/completed/failed/blocked tasks, measured skills, attempts, messages, usage, errors, verification and approval hash. Short sub-second practice tasks may finish between refreshes; the message history retains each wave. Tokens are null because no model ran.",
          "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks."
        ]
      },
      "step_id": "L06-S02",
      "lesson_id": "L06"
    },
    {
      "title": "Launch the first mission",
      "purpose": "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs.",
      "user_action": "Run the mission once. Watch the monitor or open state/dashboard.json afterward. The coordinator chooses workers dynamically, keeps one assignment per worker per wave, runs independent tasks concurrently, sends results forward, grades outputs and waits at approval. It manages work instead of doing all jobs itself.",
      "explanation": "A verified local draft is held for human review. Qualified workers or earlier auditions are missing; inspect blocked tasks and skill observations.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py run --mission mission.json",
        "macos": "python3 coordinator.py run --mission mission.json",
        "linux": "python3 coordinator.py run --mission mission.json"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Launch the first mission",
        "success_condition": "MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "MISSION awaiting_approval"
        ],
        "user_visible_success_message": "Evidence saved. MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Mission is blocked at a dependency or no qualified replacement.",
          "likely_cause": "Qualified workers or earlier auditions are missing; inspect blocked tasks and skill observations.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Inspect messages and each task error. Rerun auditions after repairing input or tools; never mark a failed predecessor completed by hand.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Inspect messages and each task error. Rerun auditions after repairing input or tools; never mark a failed predecessor completed by hand."
        }
      ],
      "faqs": [
        {
          "question": "What does awaiting_approval mean?",
          "answer": "A verified local draft is held for human review. Qualified workers or earlier auditions are missing; inspect blocked tasks and skill observations."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What does awaiting_approval mean?",
        "choices": [
          "A verified local draft is held for human review.",
          "The draft has been publicly published."
        ],
        "correct_answer": 0,
        "explanation": "A verified local draft is held for human review."
      },
      "coach": {
        "intro": "Your next small check: Launch the first mission",
        "demo": "Run the mission once. Watch the monitor or open state/dashboard.json afterward. The coordinator chooses workers dynamically, keeps one assignment per worker per wave, runs independent tasks concurrently, sends results forward, grades outputs and waits at approval. It manages work instead of doing all jobs itself.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet.",
        "failure": "Inspect messages and each task error. Rerun auditions after repairing input or tools; never mark a failed predecessor completed by hand.",
        "help": "Inspect messages and each task error. Rerun auditions after repairing input or tools; never mark a failed predecessor completed by hand."
      },
      "video": {
        "purpose": "Demonstrate Launch the first mission",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs. Run the mission once. Watch the monitor or open state/dashboard.json afterward. The coordinator chooses workers dynamically, keeps one assignment per worker per wave, runs independent tasks concurrently, sends results forward, grades outputs and waits at approval. It manages work instead of doing all jobs itself. Check: MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet.",
        "on_screen_text": [
          "Launch the first mission",
          "MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet."
        ],
        "screen_recording_instructions": [
          "Run the mission once. Watch the monitor or open state/dashboard.json afterward. The coordinator chooses workers dynamically, keeps one assignment per worker per wave, runs independent tasks concurrently, sends results forward, grades outputs and waits at approval. It manages work instead of doing all jobs itself.",
          "Run the mission once. Watch the monitor or open state/dashboard.json afterward. The coordinator chooses workers dynamically, keeps one assignment per worker per wave, runs independent tasks concurrently, sends results forward, grades outputs and waits at approval. It manages work instead of doing all jobs itself.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs.",
          "Run the mission once. Watch the monitor or open state/dashboard.json afterward. The coordinator chooses workers dynamically, keeps one assignment per worker per wave, runs independent tasks concurrently, sends results forward, grades outputs and waits at approval. It manages work instead of doing all jobs itself.",
          "MISSION awaiting_approval plus a unique run ID. Four tasks complete; no approved.json exists yet."
        ]
      },
      "step_id": "L07-S01",
      "lesson_id": "L07"
    },
    {
      "title": "Prove parallel work and a waiting task",
      "purpose": "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs.",
      "user_action": "Run the kit self-test and inspect the latest report. The research and planning wave contains two different workers. Writing depends on their completed results. The test records worker start/end intervals and requires overlap. It also checks that the peer reviewer differs from the writer.",
      "explanation": "Overlapping measured start/end intervals from different workers. Only one worker is available or dependencies run too early; read measured task intervals.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python test_swarm.py",
        "macos": "python3 test_swarm.py",
        "linux": "python3 test_swarm.py"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "SWARM TEST PASS includes overlap, dependency order and independent review.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Prove parallel work and a waiting task",
        "success_condition": "SWARM TEST PASS includes overlap, dependency order and independent review.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "SWARM TEST PASS includes overlap, dependency order and independent review.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "SWARM TEST PASS"
        ],
        "user_visible_success_message": "Evidence saved. SWARM TEST PASS includes overlap, dependency order and independent review.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A wave contains one task or writing begins too early.",
          "likely_cause": "Only one worker is available or dependencies run too early; read measured task intervals.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Keep parallel_workers at two and qualified different workers available. Read depends fields; simultaneous dispatch alone is not proof of overlap.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Keep parallel_workers at two and qualified different workers available. Read depends fields; simultaneous dispatch alone is not proof of overlap."
        }
      ],
      "faqs": [
        {
          "question": "What proves actual parallel work?",
          "answer": "Overlapping measured start/end intervals from different workers. Only one worker is available or dependencies run too early; read measured task intervals."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What proves actual parallel work?",
        "choices": [
          "Two role names written in a document.",
          "Overlapping measured start/end intervals from different workers."
        ],
        "correct_answer": 1,
        "explanation": "Overlapping measured start/end intervals from different workers."
      },
      "coach": {
        "intro": "Your next small check: Prove parallel work and a waiting task",
        "demo": "Run the kit self-test and inspect the latest report. The research and planning wave contains two different workers. Writing depends on their completed results. The test records worker start/end intervals and requires overlap. It also checks that the peer reviewer differs from the writer.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "SWARM TEST PASS includes overlap, dependency order and independent review.",
        "failure": "Keep parallel_workers at two and qualified different workers available. Read depends fields; simultaneous dispatch alone is not proof of overlap.",
        "help": "Keep parallel_workers at two and qualified different workers available. Read depends fields; simultaneous dispatch alone is not proof of overlap."
      },
      "video": {
        "purpose": "Demonstrate Prove parallel work and a waiting task",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs. Run the kit self-test and inspect the latest report. The research and planning wave contains two different workers. Writing depends on their completed results. The test records worker start/end intervals and requires overlap. It also checks that the peer reviewer differs from the writer. Check: SWARM TEST PASS includes overlap, dependency order and independent review.",
        "on_screen_text": [
          "Prove parallel work and a waiting task",
          "SWARM TEST PASS includes overlap, dependency order and independent review."
        ],
        "screen_recording_instructions": [
          "Run the kit self-test and inspect the latest report. The research and planning wave contains two different workers. Writing depends on their completed results. The test records worker start/end intervals and requires overlap. It also checks that the peer reviewer differs from the writer.",
          "Run the kit self-test and inspect the latest report. The research and planning wave contains two different workers. Writing depends on their completed results. The test records worker start/end intervals and requires overlap. It also checks that the peer reviewer differs from the writer.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs.",
          "Run the kit self-test and inspect the latest report. The research and planning wave contains two different workers. Writing depends on their completed results. The test records worker start/end intervals and requires overlap. It also checks that the peer reviewer differs from the writer.",
          "SWARM TEST PASS includes overlap, dependency order and independent review."
        ]
      },
      "step_id": "L07-S02",
      "lesson_id": "L07"
    },
    {
      "title": "Inject a crash and see replacement",
      "purpose": "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again.",
      "user_action": "Run with --inject crash. The first writing attempt fails on purpose. The coordinator records the error, lowers that observed skill result, tries a different qualified worker and verifies the replacement. No worker is blamed for a real crash: this failure is injected PRACTICE.",
      "explanation": "A bounded retry selects a different qualified worker. The attempt cap is exhausted or the remaining workers lack a passing writing audition.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py run --mission mission.json --inject crash",
        "macos": "python3 coordinator.py run --mission mission.json --inject crash",
        "linux": "python3 coordinator.py run --mission mission.json --inject crash"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "The report records failure_detected, a second writing assignment to another worker and awaiting_approval.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Inject a crash and see replacement",
        "success_condition": "The report records failure_detected, a second writing assignment to another worker and awaiting_approval.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "The report records failure_detected, a second writing assignment to another worker and awaiting_approval.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "MISSION awaiting_approval"
        ],
        "user_visible_success_message": "Evidence saved. The report records failure_detected, a second writing assignment to another worker and awaiting_approval.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Mission blocks after retries are exhausted.",
          "likely_cause": "The attempt cap is exhausted or the remaining workers lack a passing writing audition.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Read max_attempts and recent qualification scores. Blocking is safer than infinite retry. Retest the workers before trying a changed approach.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Read max_attempts and recent qualification scores. Blocking is safer than infinite retry. Retest the workers before trying a changed approach."
        }
      ],
      "faqs": [
        {
          "question": "What should happen after the injected writing crash?",
          "answer": "A bounded retry selects a different qualified worker. The attempt cap is exhausted or the remaining workers lack a passing writing audition."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What should happen after the injected writing crash?",
        "choices": [
          "A bounded retry selects a different qualified worker.",
          "Retry forever until something returns."
        ],
        "correct_answer": 0,
        "explanation": "A bounded retry selects a different qualified worker."
      },
      "coach": {
        "intro": "Your next small check: Inject a crash and see replacement",
        "demo": "Run with --inject crash. The first writing attempt fails on purpose. The coordinator records the error, lowers that observed skill result, tries a different qualified worker and verifies the replacement. No worker is blamed for a real crash: this failure is injected PRACTICE.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "The report records failure_detected, a second writing assignment to another worker and awaiting_approval.",
        "failure": "Read max_attempts and recent qualification scores. Blocking is safer than infinite retry. Retest the workers before trying a changed approach.",
        "help": "Read max_attempts and recent qualification scores. Blocking is safer than infinite retry. Retest the workers before trying a changed approach."
      },
      "video": {
        "purpose": "Demonstrate Inject a crash and see replacement",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again. Run with --inject crash. The first writing attempt fails on purpose. The coordinator records the error, lowers that observed skill result, tries a different qualified worker and verifies the replacement. No worker is blamed for a real crash: this failure is injected PRACTICE. Check: The report records failure_detected, a second writing assignment to another worker and awaiting_approval.",
        "on_screen_text": [
          "Inject a crash and see replacement",
          "The report records failure_detected, a second writing assignment to another worker and awaiting_approval."
        ],
        "screen_recording_instructions": [
          "Run with --inject crash. The first writing attempt fails on purpose. The coordinator records the error, lowers that observed skill result, tries a different qualified worker and verifies the replacement. No worker is blamed for a real crash: this failure is injected PRACTICE.",
          "Run with --inject crash. The first writing attempt fails on purpose. The coordinator records the error, lowers that observed skill result, tries a different qualified worker and verifies the replacement. No worker is blamed for a real crash: this failure is injected PRACTICE.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again.",
          "Run with --inject crash. The first writing attempt fails on purpose. The coordinator records the error, lowers that observed skill result, tries a different qualified worker and verifies the replacement. No worker is blamed for a real crash: this failure is injected PRACTICE.",
          "The report records failure_detected, a second writing assignment to another worker and awaiting_approval."
        ]
      },
      "step_id": "L08-S01",
      "lesson_id": "L08"
    },
    {
      "title": "Test timeout and bad-output repair",
      "purpose": "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again.",
      "user_action": "Run test_swarm.py again. The regression suite injects a deadline failure and empty output, detects each, reassigns once and verifies. It also tests a one-attempt mission that must stay blocked. In real work, distinguish service outage, missing permission, misunderstood brief and unusable content before selecting a recovery strategy.",
      "explanation": "Only after repair and verification pass. A process can exit successfully with empty content; verify the draft structure and source coverage.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python test_swarm.py",
        "macos": "python3 test_swarm.py",
        "linux": "python3 test_swarm.py"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Test timeout and bad-output repair",
        "success_condition": "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "SWARM TEST PASS"
        ],
        "user_visible_success_message": "Evidence saved. Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "The system reports completion despite an empty draft.",
          "likely_cause": "A process can exit successfully with empty content; verify the draft structure and source coverage.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Require mechanical verification plus independent content review. Never call a worker response a success just because its process exited zero.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Require mechanical verification plus independent content review. Never call a worker response a success just because its process exited zero."
        }
      ],
      "faqs": [
        {
          "question": "When may a malformed result count as complete?",
          "answer": "Only after repair and verification pass. A process can exit successfully with empty content; verify the draft structure and source coverage."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "When may a malformed result count as complete?",
        "choices": [
          "When its process exits zero.",
          "Only after repair and verification pass."
        ],
        "correct_answer": 1,
        "explanation": "Only after repair and verification pass."
      },
      "coach": {
        "intro": "Your next small check: Test timeout and bad-output repair",
        "demo": "Run test_swarm.py again. The regression suite injects a deadline failure and empty output, detects each, reassigns once and verifies. It also tests a one-attempt mission that must stay blocked. In real work, distinguish service outage, missing permission, misunderstood brief and unusable content before selecting a recovery strategy.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
        "failure": "Require mechanical verification plus independent content review. Never call a worker response a success just because its process exited zero.",
        "help": "Require mechanical verification plus independent content review. Never call a worker response a success just because its process exited zero."
      },
      "video": {
        "purpose": "Demonstrate Test timeout and bad-output repair",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again. Run test_swarm.py again. The regression suite injects a deadline failure and empty output, detects each, reassigns once and verifies. It also tests a one-attempt mission that must stay blocked. In real work, distinguish service outage, missing permission, misunderstood brief and unusable content before selecting a recovery strategy. Check: Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
        "on_screen_text": [
          "Test timeout and bad-output repair",
          "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass."
        ],
        "screen_recording_instructions": [
          "Run test_swarm.py again. The regression suite injects a deadline failure and empty output, detects each, reassigns once and verifies. It also tests a one-attempt mission that must stay blocked. In real work, distinguish service outage, missing permission, misunderstood brief and unusable content before selecting a recovery strategy.",
          "Run test_swarm.py again. The regression suite injects a deadline failure and empty output, detects each, reassigns once and verifies. It also tests a one-attempt mission that must stay blocked. In real work, distinguish service outage, missing permission, misunderstood brief and unusable content before selecting a recovery strategy.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again.",
          "Run test_swarm.py again. The regression suite injects a deadline failure and empty output, detects each, reassigns once and verifies. It also tests a one-attempt mission that must stay blocked. In real work, distinguish service outage, missing permission, misunderstood brief and unusable content before selecting a recovery strategy.",
          "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass."
        ]
      },
      "step_id": "L08-S02",
      "lesson_id": "L08"
    },
    {
      "title": "Read the actual usage ledger",
      "purpose": "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions.",
      "user_action": "Open the latest report usage object. It records task count, successful tasks, failures, retries, tool calls, elapsed seconds, images/videos and zero billed practice dollars. Tokens are null, with a reason. Local runtime is measured; model token and subscription measurements need an actual provider receipt.",
      "explanation": "As null with its reason. A missing provider receipt is not evidence of zero usage; distinguish unknown from a practice cost of zero.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py memory",
        "macos": "python3 coordinator.py memory",
        "linux": "python3 coordinator.py memory"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Read the actual usage ledger",
        "success_condition": "You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "tool_calls",
          "tokens"
        ],
        "user_visible_success_message": "Evidence saved. You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A dollar or token estimate looks measured.",
          "likely_cause": "A missing provider receipt is not evidence of zero usage; distinguish unknown from a practice cost of zero.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Keep cost_basis and token_basis alongside values. In REAL_OBSERVED receipts use null when unavailable; label estimates and do not use them to promise a hard spending cap.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Keep cost_basis and token_basis alongside values. In REAL_OBSERVED receipts use null when unavailable; label estimates and do not use them to promise a hard spending cap."
        }
      ],
      "faqs": [
        {
          "question": "How should unknown token usage appear?",
          "answer": "As null with its reason. A missing provider receipt is not evidence of zero usage; distinguish unknown from a practice cost of zero."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "How should unknown token usage appear?",
        "choices": [
          "As null with its reason.",
          "As measured zero."
        ],
        "correct_answer": 0,
        "explanation": "As null with its reason."
      },
      "coach": {
        "intro": "Your next small check: Read the actual usage ledger",
        "demo": "Open the latest report usage object. It records task count, successful tasks, failures, retries, tool calls, elapsed seconds, images/videos and zero billed practice dollars. Tokens are null, with a reason. Local runtime is measured; model token and subscription measurements need an actual provider receipt.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero.",
        "failure": "Keep cost_basis and token_basis alongside values. In REAL_OBSERVED receipts use null when unavailable; label estimates and do not use them to promise a hard spending cap.",
        "help": "Keep cost_basis and token_basis alongside values. In REAL_OBSERVED receipts use null when unavailable; label estimates and do not use them to promise a hard spending cap."
      },
      "video": {
        "purpose": "Demonstrate Read the actual usage ledger",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions. Open the latest report usage object. It records task count, successful tasks, failures, retries, tool calls, elapsed seconds, images/videos and zero billed practice dollars. Tokens are null, with a reason. Local runtime is measured; model token and subscription measurements need an actual provider receipt. Check: You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero.",
        "on_screen_text": [
          "Read the actual usage ledger",
          "You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero."
        ],
        "screen_recording_instructions": [
          "Open the latest report usage object. It records task count, successful tasks, failures, retries, tool calls, elapsed seconds, images/videos and zero billed practice dollars. Tokens are null, with a reason. Local runtime is measured; model token and subscription measurements need an actual provider receipt.",
          "Open the latest report usage object. It records task count, successful tasks, failures, retries, tool calls, elapsed seconds, images/videos and zero billed practice dollars. Tokens are null, with a reason. Local runtime is measured; model token and subscription measurements need an actual provider receipt.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions.",
          "Open the latest report usage object. It records task count, successful tasks, failures, retries, tool calls, elapsed seconds, images/videos and zero billed practice dollars. Tokens are null, with a reason. Local runtime is measured; model token and subscription measurements need an actual provider receipt.",
          "You can identify actual seconds/calls and explain unknown tokens without turning unknown into zero."
        ]
      },
      "step_id": "L09-S01",
      "lesson_id": "L09"
    },
    {
      "title": "Prove the stop switches",
      "purpose": "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions.",
      "user_action": "Run the self-test resource cases. A one-call cap must stop before the next dispatch. A very short mission deadline must stop and never release. Practice workers honor bounded sleeps, but this is not containment for arbitrary external tools. Maximum cost is exactly zero because this mode never invokes paid models.",
      "explanation": "Stop before a second dispatch and hold release. Only reporting usage after dispatch cannot enforce a ceiling; check the pre-dispatch stop condition.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python test_swarm.py",
        "macos": "python3 test_swarm.py",
        "linux": "python3 test_swarm.py"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Tool-call and runtime stop cases remain unapproved.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Prove the stop switches",
        "success_condition": "Tool-call and runtime stop cases remain unapproved.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "Tool-call and runtime stop cases remain unapproved.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "SWARM TEST PASS"
        ],
        "user_visible_success_message": "Evidence saved. Tool-call and runtime stop cases remain unapproved.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Budget exceeded or a stopped report says completed.",
          "likely_cause": "Only reporting usage after dispatch cannot enforce a ceiling; check the pre-dispatch stop condition.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Stop real dispatch until an adapter enforces per-call ceilings, process timeouts and unknown-usage handling. A threads timeout cannot kill arbitrary work.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Stop real dispatch until an adapter enforces per-call ceilings, process timeouts and unknown-usage handling. A threads timeout cannot kill arbitrary work."
        }
      ],
      "faqs": [
        {
          "question": "What should a one-call cap do?",
          "answer": "Stop before a second dispatch and hold release. Only reporting usage after dispatch cannot enforce a ceiling; check the pre-dispatch stop condition."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What should a one-call cap do?",
        "choices": [
          "Allow extra calls and update the count later.",
          "Stop before a second dispatch and hold release."
        ],
        "correct_answer": 1,
        "explanation": "Stop before a second dispatch and hold release."
      },
      "coach": {
        "intro": "Your next small check: Prove the stop switches",
        "demo": "Run the self-test resource cases. A one-call cap must stop before the next dispatch. A very short mission deadline must stop and never release. Practice workers honor bounded sleeps, but this is not containment for arbitrary external tools. Maximum cost is exactly zero because this mode never invokes paid models.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Tool-call and runtime stop cases remain unapproved.",
        "failure": "Stop real dispatch until an adapter enforces per-call ceilings, process timeouts and unknown-usage handling. A threads timeout cannot kill arbitrary work.",
        "help": "Stop real dispatch until an adapter enforces per-call ceilings, process timeouts and unknown-usage handling. A threads timeout cannot kill arbitrary work."
      },
      "video": {
        "purpose": "Demonstrate Prove the stop switches",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions. Run the self-test resource cases. A one-call cap must stop before the next dispatch. A very short mission deadline must stop and never release. Practice workers honor bounded sleeps, but this is not containment for arbitrary external tools. Maximum cost is exactly zero because this mode never invokes paid models. Check: Tool-call and runtime stop cases remain unapproved.",
        "on_screen_text": [
          "Prove the stop switches",
          "Tool-call and runtime stop cases remain unapproved."
        ],
        "screen_recording_instructions": [
          "Run the self-test resource cases. A one-call cap must stop before the next dispatch. A very short mission deadline must stop and never release. Practice workers honor bounded sleeps, but this is not containment for arbitrary external tools. Maximum cost is exactly zero because this mode never invokes paid models.",
          "Run the self-test resource cases. A one-call cap must stop before the next dispatch. A very short mission deadline must stop and never release. Practice workers honor bounded sleeps, but this is not containment for arbitrary external tools. Maximum cost is exactly zero because this mode never invokes paid models.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions.",
          "Run the self-test resource cases. A one-call cap must stop before the next dispatch. A very short mission deadline must stop and never release. Practice workers honor bounded sleeps, but this is not containment for arbitrary external tools. Maximum cost is exactly zero because this mode never invokes paid models.",
          "Tool-call and runtime stop cases remain unapproved."
        ]
      },
      "step_id": "L09-S02",
      "lesson_id": "L09"
    },
    {
      "title": "Reuse observations across missions",
      "purpose": "Reuse saved mission outcomes and observed worker quality after process restart.",
      "user_action": "Close and reopen a terminal, then run memory and talent. Reports live under state/<run-id>, the SQLite talent database persists observations, and recent failures influence the next selection. Each run ID prevents overwriting earlier missions. The local message history is separate from any external team communication service.",
      "explanation": "Saved mission reports and SQLite observations. The new terminal points to another extracted folder, so it opens a different state database.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py memory",
        "macos": "python3 coordinator.py memory",
        "linux": "python3 coordinator.py memory"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Earlier missions, attempts, source notes and outcomes remain available after process restart.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Reuse observations across missions",
        "success_condition": "Earlier missions, attempts, source notes and outcomes remain available after process restart.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "Earlier missions, attempts, source notes and outcomes remain available after process restart.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "research",
          "observations"
        ],
        "user_visible_success_message": "Evidence saved. Earlier missions, attempts, source notes and outcomes remain available after process restart.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "History disappears or workers share one overwritten result.",
          "likely_cause": "The new terminal points to another extracted folder, so it opens a different state database.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Use the same extracted folder and retain state. In production preserve identities, task/run IDs, decisions, verification and lessons learned in your own authorized shared system.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Use the same extracted folder and retain state. In production preserve identities, task/run IDs, decisions, verification and lessons learned in your own authorized shared system."
        }
      ],
      "faqs": [
        {
          "question": "Which memory survives a terminal restart?",
          "answer": "Saved mission reports and SQLite observations. The new terminal points to another extracted folder, so it opens a different state database."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Which memory survives a terminal restart?",
        "choices": [
          "Saved mission reports and SQLite observations.",
          "Only terminal scrollback."
        ],
        "correct_answer": 0,
        "explanation": "Saved mission reports and SQLite observations."
      },
      "coach": {
        "intro": "Your next small check: Reuse observations across missions",
        "demo": "Close and reopen a terminal, then run memory and talent. Reports live under state/<run-id>, the SQLite talent database persists observations, and recent failures influence the next selection. Each run ID prevents overwriting earlier missions. The local message history is separate from any external team communication service.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Earlier missions, attempts, source notes and outcomes remain available after process restart.",
        "failure": "Use the same extracted folder and retain state. In production preserve identities, task/run IDs, decisions, verification and lessons learned in your own authorized shared system.",
        "help": "Use the same extracted folder and retain state. In production preserve identities, task/run IDs, decisions, verification and lessons learned in your own authorized shared system."
      },
      "video": {
        "purpose": "Demonstrate Reuse observations across missions",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Reuse saved mission outcomes and observed worker quality after process restart. Close and reopen a terminal, then run memory and talent. Reports live under state/<run-id>, the SQLite talent database persists observations, and recent failures influence the next selection. Each run ID prevents overwriting earlier missions. The local message history is separate from any external team communication service. Check: Earlier missions, attempts, source notes and outcomes remain available after process restart.",
        "on_screen_text": [
          "Reuse observations across missions",
          "Earlier missions, attempts, source notes and outcomes remain available after process restart."
        ],
        "screen_recording_instructions": [
          "Close and reopen a terminal, then run memory and talent. Reports live under state/<run-id>, the SQLite talent database persists observations, and recent failures influence the next selection. Each run ID prevents overwriting earlier missions. This local JSON message log is a practice stand-in for the existing BBB Conversation Hub, not an automatic BOTS integration.",
          "Close and reopen a terminal, then run memory and talent. Reports live under state/<run-id>, the SQLite talent database persists observations, and recent failures influence the next selection. Each run ID prevents overwriting earlier missions. The local message history is separate from any external team communication service.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Reuse saved mission outcomes and observed worker quality after process restart.",
          "Close and reopen a terminal, then run memory and talent. Reports live under state/<run-id>, the SQLite talent database persists observations, and recent failures influence the next selection. Each run ID prevents overwriting earlier missions. The local message history is separate from any external team communication service.",
          "Earlier missions, attempts, source notes and outcomes remain available after process restart."
        ]
      },
      "step_id": "L10-S01",
      "lesson_id": "L10"
    },
    {
      "title": "Keep a tested backup of swarm memory",
      "purpose": "Individual memory is one worker remembering its own notes. Swarm memory is shared evidence about missions, strategies, worker performance, failures and verified results.",
      "user_action": "Stop the coordinator before backing up; keep the dashboard read-only. Run restore.py. It copies state to a unique archive backup, restores into a second scratch folder, and compares every file hash. Nothing is deleted. A backup recovery lesson is that a same-disk copy is only a rehearsal: retain a real non-secret backup on a different device before relying on it.",
      "explanation": "Restored data against the saved backup evidence. An incomplete backup or wrong destination does not reproduce the observed skill records.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python restore.py",
        "macos": "python3 restore.py",
        "linux": "python3 restore.py"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "RESTORE PASS reports matching hashes; original state is still present.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Build Bot Better: prove a memory restore",
        "success_condition": "RESTORE PASS reports matching hashes; original state is still present.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "RESTORE PASS reports matching hashes; original state is still present.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "RESTORE PASS"
        ],
        "user_visible_success_message": "Evidence saved. RESTORE PASS reports matching hashes; original state is still present.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "SQLite copy taken during a write or backup stored beside a failing disk.",
          "likely_cause": "An incomplete backup or wrong destination does not reproduce the observed skill records.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Quiesce writers before this drill. Use SQLite backup for live systems; maintain separately protected, versioned backups. Never recursively delete a user profile.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Quiesce writers before this drill. Use SQLite backup for live systems; maintain separately protected, versioned backups. Never recursively delete a user profile."
        }
      ],
      "faqs": [
        {
          "question": "What does a restore check compare?",
          "answer": "Restored data against the saved backup evidence. An incomplete backup or wrong destination does not reproduce the observed skill records."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What does a restore check compare?",
        "choices": [
          "Whether a copied filename looks right.",
          "Restored data against the saved backup evidence."
        ],
        "correct_answer": 1,
        "explanation": "Restored data against the saved backup evidence."
      },
      "coach": {
        "intro": "Your next small check: Build Bot Better: prove a memory restore",
        "demo": "Stop the coordinator before backing up; keep the dashboard read-only. Run restore.py. It copies state to a unique archive backup, restores into a second scratch folder, and compares every file hash. Nothing is deleted. A backup recovery lesson is that a same-disk copy is only a rehearsal: retain a real non-secret backup on a different device before relying on it.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "RESTORE PASS reports matching hashes; original state is still present.",
        "failure": "Quiesce writers before this drill. Use SQLite backup for live systems; maintain separately protected, versioned backups. Never recursively delete a user profile.",
        "help": "Quiesce writers before this drill. Use SQLite backup for live systems; maintain separately protected, versioned backups. Never recursively delete a user profile."
      },
      "video": {
        "purpose": "Demonstrate Build Bot Better: prove a memory restore",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Individual memory is one worker remembering its own notes. Swarm memory is shared evidence about missions, strategies, worker performance, failures and verified results. Stop the coordinator before backing up; keep the dashboard read-only. Run restore.py. It copies state to a unique archive backup, restores into a second scratch folder, and compares every file hash. Nothing is deleted. A backup recovery lesson is that a same-disk copy is only a rehearsal: retain a real non-secret backup on a different device before relying on it. Check: RESTORE PASS reports matching hashes; original state is still present.",
        "on_screen_text": [
          "Build Bot Better: prove a memory restore",
          "RESTORE PASS reports matching hashes; original state is still present."
        ],
        "screen_recording_instructions": [
          "Stop the coordinator before backing up; keep the dashboard read-only. Run restore.py. It copies state to a unique archive backup, restores into a second scratch folder, and compares every file hash. Nothing is deleted. A backup recovery lesson is that a same-disk copy is only a rehearsal: retain a real non-secret backup on a different device before relying on it.",
          "Stop the coordinator before backing up; keep the dashboard read-only. Run restore.py. It copies state to a unique archive backup, restores into a second scratch folder, and compares every file hash. Nothing is deleted. A backup recovery lesson is that a same-disk copy is only a rehearsal: retain a real non-secret backup on a different device before relying on it.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Individual memory is one worker remembering its own notes. Swarm memory is shared evidence about missions, strategies, worker performance, failures and verified results.",
          "Stop the coordinator before backing up; keep the dashboard read-only. Run restore.py. It copies state to a unique archive backup, restores into a second scratch folder, and compares every file hash. Nothing is deleted. A backup recovery lesson is that a same-disk copy is only a rehearsal: retain a real non-secret backup on a different device before relying on it.",
          "RESTORE PASS reports matching hashes; original state is still present."
        ]
      },
      "step_id": "L10-S02",
      "lesson_id": "L10"
    },
    {
      "title": "Review the held draft",
      "purpose": "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision.",
      "user_action": "Open state/<run-id>/draft.json and report.json using the run ID printed by run. Confirm source IDs and exact note preservation, a different reviewer, all grades and no failed tasks. Read source accuracy and usefulness yourself: fixture structural scores cannot prove factual correctness, creativity or whether your own success criteria were understood.",
      "explanation": "The draft SHA256 fingerprint. A changed draft or unverified run cannot be released based on an earlier approval fingerprint.",
      "estimated_time": "7-12 min",
      "action_type": "inspect",
      "commands": {
        "windows": "",
        "macos": "",
        "linux": ""
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "Your review records what passed mechanically and what still needs human or real peer evaluation.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Review the held draft",
        "success_condition": "Your review records what passed mechanically and what still needs human or real peer evaluation.",
        "how_to_verify": "Record the requested named facts in your own words; no terminal command is required. This checks evidence shape, not independent truth.",
        "criteria": [
          "Your review records what passed mechanically and what still needs human or real peer evaluation.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "draft_sha256",
          "awaiting_approval"
        ],
        "user_visible_success_message": "Evidence saved. Your review records what passed mechanically and what still needs human or real peer evaluation.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A practice 100 is mistaken for a real editorial A.",
          "likely_cause": "A changed draft or unverified run cannot be released based on an earlier approval fingerprint.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Read the grade scope. Reject unsupported assertions or poor usefulness even if mechanical tests pass.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Read the grade scope. Reject unsupported assertions or poor usefulness even if mechanical tests pass."
        }
      ],
      "faqs": [
        {
          "question": "What identifies the bytes being reviewed?",
          "answer": "The draft SHA256 fingerprint. A changed draft or unverified run cannot be released based on an earlier approval fingerprint."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What identifies the bytes being reviewed?",
        "choices": [
          "The draft SHA256 fingerprint.",
          "Only the filename."
        ],
        "correct_answer": 0,
        "explanation": "The draft SHA256 fingerprint."
      },
      "coach": {
        "intro": "Your next small check: Review the held draft",
        "demo": "Open state/<run-id>/draft.json and report.json using the run ID printed by run. Confirm source IDs and exact note preservation, a different reviewer, all grades and no failed tasks. Read source accuracy and usefulness yourself: fixture structural scores cannot prove factual correctness, creativity or whether your own success criteria were understood.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "Your review records what passed mechanically and what still needs human or real peer evaluation.",
        "failure": "Read the grade scope. Reject unsupported assertions or poor usefulness even if mechanical tests pass.",
        "help": "Read the grade scope. Reject unsupported assertions or poor usefulness even if mechanical tests pass."
      },
      "video": {
        "purpose": "Demonstrate Review the held draft",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision. Open state/<run-id>/draft.json and report.json using the run ID printed by run. Confirm source IDs and exact note preservation, a different reviewer, all grades and no failed tasks. Read source accuracy and usefulness yourself: fixture structural scores cannot prove factual correctness, creativity or whether your own success criteria were understood. Check: Your review records what passed mechanically and what still needs human or real peer evaluation.",
        "on_screen_text": [
          "Review the held draft",
          "Your review records what passed mechanically and what still needs human or real peer evaluation."
        ],
        "screen_recording_instructions": [
          "Open state/<run-id>/draft.json and report.json using the run ID printed by run. Confirm source IDs and exact note preservation, a different reviewer, all grades and no failed tasks. Read source accuracy and usefulness yourself: fixture structural scores cannot prove factual correctness, creativity or whether your own success criteria were understood.",
          "Open state/<run-id>/draft.json and report.json using the run ID printed by run. Confirm source IDs and exact note preservation, a different reviewer, all grades and no failed tasks. Read source accuracy and usefulness yourself: fixture structural scores cannot prove factual correctness, creativity or whether your own success criteria were understood.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision.",
          "Open state/<run-id>/draft.json and report.json using the run ID printed by run. Confirm source IDs and exact note preservation, a different reviewer, all grades and no failed tasks. Read source accuracy and usefulness yourself: fixture structural scores cannot prove factual correctness, creativity or whether your own success criteria were understood.",
          "Your review records what passed mechanically and what still needs human or real peer evaluation."
        ]
      },
      "step_id": "L11-S01",
      "lesson_id": "L11"
    },
    {
      "title": "Approve one reviewed hash",
      "purpose": "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision.",
      "user_action": "Copy the exact run_id and draft_sha256 from report.json. Replace RUN_ID and SHA256 below; do not literally run the placeholders. The command accepts only the reviewed current bytes of a verified held draft. It creates approved.json locally and records the human release event. It never posts online. The self-test proves changed bytes and blocked runs cannot be approved.",
      "explanation": "Its content fingerprint no longer matches the reviewed bytes. The run ID is a placeholder or the submitted SHA256 does not match the current verified draft.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py approve --run-id RUN_ID --sha256 SHA256",
        "macos": "python3 coordinator.py approve --run-id RUN_ID --sha256 SHA256",
        "linux": "python3 coordinator.py approve --run-id RUN_ID --sha256 SHA256"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "APPROVAL PASS; approved.json exists only in the chosen run folder.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Approve one reviewed hash",
        "success_condition": "APPROVAL PASS; approved.json exists only in the chosen run folder.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "APPROVAL PASS; approved.json exists only in the chosen run folder.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "APPROVAL PASS"
        ],
        "user_visible_success_message": "Evidence saved. APPROVAL PASS; approved.json exists only in the chosen run folder.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Hash mismatch or state is not awaiting approval.",
          "likely_cause": "The run ID is a placeholder or the submitted SHA256 does not match the current verified draft.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Reopen current draft bytes. If tampered, rerun the mission for fresh verification. Do not force approval or edit the verification flag.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Reopen current draft bytes. If tampered, rerun the mission for fresh verification. Do not force approval or edit the verification flag."
        }
      ],
      "faqs": [
        {
          "question": "Why does a changed draft need fresh approval?",
          "answer": "Its content fingerprint no longer matches the reviewed bytes. The run ID is a placeholder or the submitted SHA256 does not match the current verified draft."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Why does a changed draft need fresh approval?",
        "choices": [
          "Approval belongs to a filename forever.",
          "Its content fingerprint no longer matches the reviewed bytes."
        ],
        "correct_answer": 1,
        "explanation": "Its content fingerprint no longer matches the reviewed bytes."
      },
      "coach": {
        "intro": "Your next small check: Approve one reviewed hash",
        "demo": "Copy the exact run_id and draft_sha256 from report.json. Replace RUN_ID and SHA256 below; do not literally run the placeholders. The command accepts only the reviewed current bytes of a verified held draft. It creates approved.json locally and records the human release event. It never posts online. The self-test proves changed bytes and blocked runs cannot be approved.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "APPROVAL PASS; approved.json exists only in the chosen run folder.",
        "failure": "Reopen current draft bytes. If tampered, rerun the mission for fresh verification. Do not force approval or edit the verification flag.",
        "help": "Reopen current draft bytes. If tampered, rerun the mission for fresh verification. Do not force approval or edit the verification flag."
      },
      "video": {
        "purpose": "Demonstrate Approve one reviewed hash",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision. Copy the exact run_id and draft_sha256 from report.json. Replace RUN_ID and SHA256 below; do not literally run the placeholders. The command accepts only the reviewed current bytes of a verified held draft. It creates approved.json locally and records the human release event. It never posts online. The self-test proves changed bytes and blocked runs cannot be approved. Check: APPROVAL PASS; approved.json exists only in the chosen run folder.",
        "on_screen_text": [
          "Approve one reviewed hash",
          "APPROVAL PASS; approved.json exists only in the chosen run folder."
        ],
        "screen_recording_instructions": [
          "Copy the exact run_id and draft_sha256 from report.json. Replace RUN_ID and SHA256 below; do not literally run the placeholders. The command accepts only the reviewed current bytes of a verified held draft. It creates approved.json locally and records the human release event. It never posts online. The self-test proves changed bytes and blocked runs cannot be approved.",
          "Copy the exact run_id and draft_sha256 from report.json. Replace RUN_ID and SHA256 below; do not literally run the placeholders. The command accepts only the reviewed current bytes of a verified held draft. It creates approved.json locally and records the human release event. It never posts online. The self-test proves changed bytes and blocked runs cannot be approved.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision.",
          "Copy the exact run_id and draft_sha256 from report.json. Replace RUN_ID and SHA256 below; do not literally run the placeholders. The command accepts only the reviewed current bytes of a verified held draft. It creates approved.json locally and records the human release event. It never posts online. The self-test proves changed bytes and blocked runs cannot be approved.",
          "APPROVAL PASS; approved.json exists only in the chosen run folder."
        ]
      },
      "step_id": "L11-S02",
      "lesson_id": "L11"
    },
    {
      "title": "Create real-team handoff tickets",
      "purpose": "Keep shared observations and clear ownership when moving from local practice to personally authorized real workers.",
      "user_action": "Move from the prototype to observed real work gradually. Create a task list, a dated work journal, separate authorized worker identities and a reviewer. Keep the human responsible for handoffs until real automatic dispatch has been tested.",
      "explanation": "No; an authenticated human-supervised dispatch is still required. Ticket preparation is a local export, not an authenticated worker adapter.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python handoff.py prepare mission.json",
        "macos": "python3 handoff.py prepare mission.json",
        "linux": "python3 handoff.py prepare mission.json"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Create real-team handoff tickets",
        "success_condition": "HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "HANDOFF PREPARED"
        ],
        "user_visible_success_message": "Evidence saved. HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A ticket is mistaken for an automatically dispatched job.",
          "likely_cause": "Ticket preparation is a local export, not an authenticated worker adapter.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Record actual invocation and receipt under each worker identity. This supervised bridge is Stage 5 preparation, not live Stage 6.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Record actual invocation and receipt under each worker identity. This supervised bridge is Stage 5 preparation, not live Stage 6."
        }
      ],
      "faqs": [
        {
          "question": "Do prepared tickets automatically invoke real AI?",
          "answer": "No; an authenticated human-supervised dispatch is still required. Ticket preparation is a local export, not an authenticated worker adapter."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Do prepared tickets automatically invoke real AI?",
        "choices": [
          "No; an authenticated human-supervised dispatch is still required.",
          "Yes; a ticket file is an AI invocation."
        ],
        "correct_answer": 0,
        "explanation": "No; an authenticated human-supervised dispatch is still required."
      },
      "coach": {
        "intro": "Your next small check: Create real-team handoff tickets",
        "demo": "Move from the prototype to observed real work gradually. Create a task list, a dated work journal, separate authorized worker identities and a reviewer. Keep the human responsible for handoffs until real automatic dispatch has been tested.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed.",
        "failure": "Record actual invocation and receipt under each worker identity. This supervised bridge is Stage 5 preparation, not live Stage 6.",
        "help": "Record actual invocation and receipt under each worker identity. This supervised bridge is Stage 5 preparation, not live Stage 6."
      },
      "video": {
        "purpose": "Demonstrate Create real-team handoff tickets",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Keep shared observations and clear ownership when moving from local practice to personally authorized real workers. Move from the prototype to observed real work gradually. Create a task list, a dated work journal, separate authorized worker identities and a reviewer. Keep the human responsible for handoffs until real automatic dispatch has been tested. Check: HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed.",
        "on_screen_text": [
          "Create real-team handoff tickets",
          "HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed."
        ],
        "screen_recording_instructions": [
          "Move from the prototype to observed real work gradually. Create a task list, a dated work journal, separate authorized worker identities and a reviewer. Keep the human responsible for handoffs until real automatic dispatch has been tested.",
          "Move from the prototype to observed real work gradually. Create a task list, a dated work journal, separate authorized worker identities and a reviewer. Keep the human responsible for handoffs until real automatic dispatch has been tested.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Keep shared observations and clear ownership when moving from local practice to personally authorized real workers.",
          "Move from the prototype to observed real work gradually. Create a task list, a dated work journal, separate authorized worker identities and a reviewer. Keep the human responsible for handoffs until real automatic dispatch has been tested.",
          "HANDOFF PREPARED emits tickets into live-evidence; no real worker invocation is falsely claimed."
        ]
      },
      "step_id": "L12-S01",
      "lesson_id": "L12"
    },
    {
      "title": "Import a real observed result",
      "purpose": "Keep shared observations and clear ownership when moving from local practice to personally authorized real workers.",
      "user_action": "Use real-observation-template.json only after a real worker returns an artifact and a different reviewer checks it. Save a permitted artifact beside the receipt, fill every field and ratings, replace null usage only with observed data, and run import. It rejects missing artifacts, self-review, invalid ratings and escaped paths. The importer checks receipt structure, not identity authenticity or factual truth. No synthetic real result is provided.",
      "explanation": "It lacks observed evidence and an independent reviewer. Placeholder identity, ratings or evidence cannot establish an actual worker result.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python handoff.py import real-observation-template.json",
        "macos": "python3 handoff.py import real-observation-template.json",
        "linux": "python3 handoff.py import real-observation-template.json"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "REJECTED: Real identity and independent reviewer required. This expected rejection exits with code 1 and saves no observation.",
      "resources": [
        "README.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Import a real observed result",
        "success_condition": "REJECTED: Real identity and independent reviewer required. This expected rejection exits with code 1 and saves no observation.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "An actual completed receipt imports into live-evidence/observations.jsonl; an unfilled template correctly fails.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "REJECTED:"
        ],
        "user_visible_success_message": "Expected template rejection recorded; this does not certify a real-worker result.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Template fails validation or someone invents usage to pass.",
          "likely_cause": "Placeholder identity, ratings or evidence cannot establish an actual worker result.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Keep missing facts unknown. Obtain actual evidence and review; never fill an agent name, artifact or score merely to make the command pass.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Keep missing facts unknown. Obtain actual evidence and review; never fill an agent name, artifact or score merely to make the command pass."
        }
      ],
      "faqs": [
        {
          "question": "Why should the empty real-result template fail import?",
          "answer": "It lacks observed evidence and an independent reviewer. Placeholder identity, ratings or evidence cannot establish an actual worker result."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Why should the empty real-result template fail import?",
        "choices": [
          "Every real result must be rejected.",
          "It lacks observed evidence and an independent reviewer."
        ],
        "correct_answer": 1,
        "explanation": "It lacks observed evidence and an independent reviewer."
      },
      "coach": {
        "intro": "Your next small check: Import a real observed result",
        "demo": "Use real-observation-template.json only after a real worker returns an artifact and a different reviewer checks it. Save a permitted artifact beside the receipt, fill every field and ratings, replace null usage only with observed data, and run import. It rejects missing artifacts, self-review, invalid ratings and escaped paths. The importer checks receipt structure, not identity authenticity or factual truth. No synthetic real result is provided.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "An actual completed receipt imports into live-evidence/observations.jsonl; an unfilled template correctly fails.",
        "failure": "Keep missing facts unknown. Obtain actual evidence and review; never fill an agent name, artifact or score merely to make the command pass.",
        "help": "Keep missing facts unknown. Obtain actual evidence and review; never fill an agent name, artifact or score merely to make the command pass."
      },
      "video": {
        "purpose": "Demonstrate Import a real observed result",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Keep shared observations and clear ownership when moving from local practice to personally authorized real workers. Use real-observation-template.json only after a real worker returns an artifact and a different reviewer checks it. Save a permitted artifact beside the receipt, fill every field and ratings, replace null usage only with observed data, and run import. It rejects missing artifacts, self-review, invalid ratings and escaped paths. The importer checks receipt structure, not identity authenticity or factual truth. No synthetic real result is provided. Check: REJECTED: Real identity and independent reviewer required. This expected rejection exits with code 1 and saves no observation.",
        "on_screen_text": [
          "Import a real observed result",
          "An actual completed receipt imports into live-evidence/observations.jsonl; an unfilled template correctly fails."
        ],
        "screen_recording_instructions": [
          "Use real-observation-template.json only after a real worker returns an artifact and a different reviewer checks it. Save a permitted artifact beside the receipt, fill every field and ratings, replace null usage only with observed data, and run import. It rejects missing artifacts, self-review, invalid ratings and escaped paths. The importer checks receipt structure, not identity authenticity or factual truth. No synthetic real result is provided.",
          "Use real-observation-template.json only after a real worker returns an artifact and a different reviewer checks it. Save a permitted artifact beside the receipt, fill every field and ratings, replace null usage only with observed data, and run import. It rejects missing artifacts, self-review, invalid ratings and escaped paths. The importer checks receipt structure, not identity authenticity or factual truth. No synthetic real result is provided.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Keep shared observations and clear ownership when moving from local practice to personally authorized real workers.",
          "Use real-observation-template.json only after a real worker returns an artifact and a different reviewer checks it. Save a permitted artifact beside the receipt, fill every field and ratings, replace null usage only with observed data, and run import. It rejects missing artifacts, self-review, invalid ratings and escaped paths. The importer checks receipt structure, not identity authenticity or factual truth. No synthetic real result is provided.",
          "REJECTED: Real identity and independent reviewer required. This expected rejection exits with code 1 and saves no observation."
        ]
      },
      "step_id": "L12-S02",
      "lesson_id": "L12"
    },
    {
      "title": "Create a fresh capstone input",
      "purpose": "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it.",
      "user_action": "Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery.",
      "explanation": "A guide or checklist using supplied source notes. The fixed recipe supports supplied-note guides and checklists, so unrelated output types are rejected.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python coordinator.py audition --mission capstone.json\npython coordinator.py run --mission capstone.json --inject bad-output",
        "macos": "python3 coordinator.py audition --mission capstone.json\npython3 coordinator.py run --mission capstone.json --inject bad-output",
        "linux": "python3 coordinator.py audition --mission capstone.json\npython3 coordinator.py run --mission capstone.json --inject bad-output"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Create a fresh capstone input",
        "success_condition": "A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "MISSION awaiting_approval"
        ],
        "user_visible_success_message": "Evidence saved. A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "Unseen mission needs video, internet research or arbitrary decomposition.",
          "likely_cause": "The fixed recipe supports supplied-note guides and checklists, so unrelated output types are rejected.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "This planner supports source-note guides/checklists only. Mark broader work unsupported; use real supervised auditions and a reviewed planner/adapter instead of claiming a finished video.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "This planner supports source-note guides/checklists only. Mark broader work unsupported; use real supervised auditions and a reviewed planner/adapter instead of claiming a finished video."
        }
      ],
      "faqs": [
        {
          "question": "Which fresh capstone can this planner handle?",
          "answer": "A guide or checklist using supplied source notes. The fixed recipe supports supplied-note guides and checklists, so unrelated output types are rejected."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "Which fresh capstone can this planner handle?",
        "choices": [
          "A guide or checklist using supplied source notes.",
          "Any video or internet-research mission."
        ],
        "correct_answer": 0,
        "explanation": "A guide or checklist using supplied source notes."
      },
      "coach": {
        "intro": "Your next small check: Create a fresh capstone input",
        "demo": "Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence.",
        "failure": "This planner supports source-note guides/checklists only. Mark broader work unsupported; use real supervised auditions and a reviewed planner/adapter instead of claiming a finished video.",
        "help": "This planner supports source-note guides/checklists only. Mark broader work unsupported; use real supervised auditions and a reviewed planner/adapter instead of claiming a finished video."
      },
      "video": {
        "purpose": "Demonstrate Create a fresh capstone input",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it. Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery. Check: A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence.",
        "on_screen_text": [
          "Create a fresh capstone input",
          "A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence."
        ],
        "screen_recording_instructions": [
          "Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery.",
          "Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it.",
          "Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery.",
          "A new mission has selected workers, parallel work, recovered error, verified results, held draft and complete usage/memory evidence."
        ]
      },
      "step_id": "L13-S01",
      "lesson_id": "L13"
    },
    {
      "title": "Graduate on evidence, not labels",
      "purpose": "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it.",
      "user_action": "Complete graduation.md. PRACTICE graduation requires measured auditions, selection, dependency order, overlap, communication, memory, budget stops, recovery, peer structural review, human review, approval and final report. REAL Stage 5 requires actual artifacts and independent real reviews. REAL Stage 6 additionally requires automatically dispatched authenticated workers, arbitrary mission decomposition validated by a human, measured usage, enforced external permissions and a fresh mission without hand-chaining. Keep that checkbox unearned until observed.",
      "explanation": "Observed automatic authenticated dispatch and bounded fresh-mission verification. Browser checkboxes and fixture outputs do not prove live automatic dispatch or externally enforced budgets.",
      "estimated_time": "7-12 min",
      "action_type": "execute",
      "commands": {
        "windows": "python test_swarm.py",
        "macos": "python3 test_swarm.py",
        "linux": "python3 test_swarm.py"
      },
      "command_type": "shell",
      "required_inputs": [],
      "expected_result": "PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
      "resources": [
        "README.md",
        "mission.json",
        "graduation.md"
      ],
      "checkpoint": {
        "what_is_being_checked": "Graduate on evidence, not labels",
        "success_condition": "PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
        "how_to_verify": "Run the command and retain the complete concise output; full JSON is optional with --full. Historical error fields in saved memory are not a new command failure. This checks evidence shape, not independent truth.",
        "criteria": [
          "PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
          "I distinguish actual PRACTICE evidence from real-worker or unverified claims."
        ],
        "tokens": [
          "SWARM TEST PASS"
        ],
        "user_visible_success_message": "Evidence saved. PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
        "failure_message": "Compare the observed output with the required result before continuing.",
        "troubleshooting_path": "Open the help for this step."
      },
      "troubleshooting": [
        {
          "problem": "A certificate is awarded because all browser boxes are checked.",
          "likely_cause": "Browser checkboxes and fixture outputs do not prove live automatic dispatch or externally enforced budgets.",
          "diagnostic_question": "What exact command, folder, error and run ID did you observe?",
          "fix": "Export your evidence; inspect actual reports and artifacts. Browser completion verifies input shape only. Ask whether tomorrow's mission can be trusted within demonstrated boundaries, not beyond them.",
          "alternative_fix": "Compare the supplied source and saved report before repeating. Keep failures; ask a helper with redacted evidence.",
          "when_to_escalate": "After two explained attempts, stop if access, billing or external permissions are unclear.",
          "bot_coach_response": "Export your evidence; inspect actual reports and artifacts. Browser completion verifies input shape only. Ask whether tomorrow's mission can be trusted within demonstrated boundaries, not beyond them."
        }
      ],
      "faqs": [
        {
          "question": "What earns real Stage 6 graduation?",
          "answer": "Observed automatic authenticated dispatch and bounded fresh-mission verification. Browser checkboxes and fixture outputs do not prove live automatic dispatch or externally enforced budgets."
        },
        {
          "question": "Python or python3 not found: which command should I use?",
          "answer": "Windows: try py -3 --version. macOS/Linux: try python3 --version. Use Python 3.10 or newer, then stay in the extracted practice folder. A missing interpreter needs installation before these steps can run."
        },
        {
          "question": "Wrong folder: coordinator.py cannot be opened",
          "answer": "Check the current folder and list its files. It must contain coordinator.py and mission.json from the extracted archive. Change into that folder before running the command."
        },
        {
          "question": "Dashboard port in use or localhost page unavailable",
          "answer": "Keep dashboard.py running and open its newly printed http://127.0.0.1 address. The default selects a free port. Do not use a public bind address."
        },
        {
          "question": "What are SQLite, a hash, a run ID, a wave and a fixture?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "Does this result prove real autonomous AI?",
          "answer": "No. These workers are deterministic practice functions. Human-supervised real receipts and automatic real dispatch require separate observed evidence."
        },
        {
          "question": "What is a SQLite talent database?",
          "answer": "A run ID names one saved mission. A SHA256 hash is a content fingerprint: changed bytes produce a different value. A wave is a group of tasks allowed to run together. A fixture is invented test input, not a real customer or model result. SQLite is the small local database file that keeps observed worker results."
        },
        {
          "question": "What is a work journal?",
          "answer": "An optional work journal records the date, the observed change and its reason. A local text file is sufficient for this standalone kit."
        }
      ],
      "quiz": {
        "question": "What earns real Stage 6 graduation?",
        "choices": [
          "Completing these practice browser checkpoints alone.",
          "Observed automatic authenticated dispatch and bounded fresh-mission verification."
        ],
        "correct_answer": 1,
        "explanation": "Observed automatic authenticated dispatch and bounded fresh-mission verification."
      },
      "coach": {
        "intro": "Your next small check: Graduate on evidence, not labels",
        "demo": "Complete graduation.md. PRACTICE graduation requires measured auditions, selection, dependency order, overlap, communication, memory, budget stops, recovery, peer structural review, human review, approval and final report. REAL Stage 5 requires actual artifacts and independent real reviews. REAL Stage 6 additionally requires automatically dispatched authenticated workers, arbitrary mission decomposition validated by a human, measured usage, enforced external permissions and a fresh mission without hand-chaining. Keep that checkbox unearned until observed.",
        "handoff": "Try this in your own practice workspace, then compare the result.",
        "success": "PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
        "failure": "Export your evidence; inspect actual reports and artifacts. Browser completion verifies input shape only. Ask whether tomorrow's mission can be trusted within demonstrated boundaries, not beyond them.",
        "help": "Export your evidence; inspect actual reports and artifacts. Browser completion verifies input shape only. Ask whether tomorrow's mission can be trusted within demonstrated boundaries, not beyond them."
      },
      "video": {
        "purpose": "Demonstrate Graduate on evidence, not labels",
        "duration_target": "45–75 seconds",
        "visual_type": "step walkthrough with optional browser narration; no rendered video is claimed",
        "narration_script": "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it. Complete graduation.md. PRACTICE graduation requires measured auditions, selection, dependency order, overlap, communication, memory, budget stops, recovery, peer structural review, human review, approval and final report. REAL Stage 5 requires actual artifacts and independent real reviews. REAL Stage 6 additionally requires automatically dispatched authenticated workers, arbitrary mission decomposition validated by a human, measured usage, enforced external permissions and a fresh mission without hand-chaining. Keep that checkbox unearned until observed. Check: PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
        "on_screen_text": [
          "Graduate on evidence, not labels",
          "PRACTICE graduation evidence is complete; real autonomy limits remain explicit."
        ],
        "screen_recording_instructions": [
          "Complete graduation.md. PRACTICE graduation requires measured auditions, selection, dependency order, overlap, communication, memory, budget stops, recovery, peer structural review, human review, approval and final report. REAL Stage 5 requires actual artifacts and independent real reviews. REAL Stage 6 additionally requires automatically dispatched authenticated workers, arbitrary mission decomposition validated by a human, measured usage, enforced external permissions and a fresh mission without hand-chaining. Keep that checkbox unearned until observed.",
          "Complete graduation.md. PRACTICE graduation requires measured auditions, selection, dependency order, overlap, communication, memory, budget stops, recovery, peer structural review, human review, approval and final report. REAL Stage 5 requires actual artifacts and independent real reviews. REAL Stage 6 additionally requires automatically dispatched authenticated workers, arbitrary mission decomposition validated by a human, measured usage, enforced external permissions and a fresh mission without hand-chaining. Keep that checkbox unearned until observed.",
          "Show the observed result and its limitations."
        ],
        "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 administrator’s provisioning receipt names your login, folder, schema and credential-variable name without revealing the credential."
        ],
        "bot_position": "right sidebar",
        "bot_expression": "calm",
        "transition": "Continue after checkpoint",
        "captions": [
          "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it.",
          "Complete graduation.md. PRACTICE graduation requires measured auditions, selection, dependency order, overlap, communication, memory, budget stops, recovery, peer structural review, human review, approval and final report. REAL Stage 5 requires actual artifacts and independent real reviews. REAL Stage 6 additionally requires automatically dispatched authenticated workers, arbitrary mission decomposition validated by a human, measured usage, enforced external permissions and a fresh mission without hand-chaining. Keep that checkbox unearned until observed.",
          "PRACTICE graduation evidence is complete; real autonomy limits remain explicit."
        ]
      },
      "step_id": "L13-S02",
      "lesson_id": "L13"
    }
  ],
  "resources": [
    {
      "filename": "coordinator.py",
      "title": "coordinator.py",
      "type": "practice script",
      "contents": "\"\"\"A mission manager for bounded, deterministic PRACTICE workers.\nVERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created measured talent DB, dependency scheduler, recovery and approval; hub 2089.\n2026-10-14 EDT | chatgpt_codex | expected user-input failures return concise REJECTED with exit 1; grok_bot-R4-003.\n2026-10-14 EDT | chatgpt_codex | readable bounded talent/memory summaries, full-detail option and actionable approval placeholder error.\n\"\"\"\nimport argparse\nimport hashlib\nimport json\nimport logging\nimport sqlite3\nimport time\nimport uuid\nfrom concurrent.futures import ThreadPoolExecutor, as_completed\nfrom datetime import datetime, timezone\nfrom pathlib import Path\nfrom guardrails import inside, validate\nfrom practice_bots import BOTS, grade, work\n\nROOT = Path(__file__).resolve().parent\nSTATE = ROOT/'state'\nSKILLS = ['research','planning','writing','testing']\n\n\ndef now(): return datetime.now(timezone.utc).isoformat()\ndef dump(path, value):\n    tmp=path.with_suffix(path.suffix+'.tmp')\n    tmp.write_text(json.dumps(value,indent=2,ensure_ascii=True),encoding='utf-8')\n    tmp.replace(path)\ndef db():\n    STATE.mkdir(exist_ok=True)\n    con=sqlite3.connect(STATE/'talent.sqlite')\n    con.execute('CREATE TABLE IF NOT EXISTS observations (id INTEGER PRIMARY KEY, at TEXT, bot TEXT, skill TEXT, score REAL, seconds REAL, success INTEGER, cost REAL, mode TEXT, error TEXT)')\n    con.commit()\n    return con\ndef observe(con,bot,skill,score,seconds,error=''):\n    con.execute('INSERT INTO observations (at,bot,skill,score,seconds,success,cost,mode,error) VALUES (?,?,?,?,?,?,?,?,?)',(now(),bot,skill,score,seconds,int(score>=90),0,'PRACTICE',error));con.commit()\ndef talent(con,skill):\n    # Most recent five observations per bot; old reputation cannot remain forever.\n    rows=[]\n    for bot in BOTS:\n        obs=con.execute('SELECT score,seconds,success,cost,at FROM observations WHERE bot=? AND skill=? ORDER BY id DESC LIMIT 5',(bot,skill)).fetchall()\n        if not obs: continue\n        n=len(obs); quality=sum(r[0] for r in obs)/n; seconds=sum(r[1] for r in obs)/n; reliability=sum(r[2] for r in obs)/n\n        rows.append({'bot':bot,'skill':skill,'quality':quality,'seconds':seconds,'success_rate':reliability,'observations':n,'cost_usd':0,'cost_basis':'measured local PRACTICE, no billed model','last_test':obs[0][4], 'selection_score':.7*quality+25*reliability+5/(1+seconds)})\n    return sorted(rows,key=lambda r:r['selection_score'],reverse=True)\ndef audition(m):\n    con=db(); count=0\n    for skill in SKILLS:\n        for bot in BOTS:\n            start=time.monotonic(); error=''; score=0\n            try:\n                inputs={'writing': {'items':[{},{}]}} if skill=='testing' else {}\n                answer=work(bot,skill,m,inputs,1,'none',m['constraints']['task_timeout_seconds']);score=grade(skill,answer['result'],m)\n            except Exception as e:error=type(e).__name__\n            observe(con,bot,skill,score,time.monotonic()-start,error);count+=1\n    profiles={s:talent(con,s) for s in SKILLS};dump(STATE/'talent.json',profiles);con.close()\n    print('AUDITION PASS: '+str(count)+' observed PRACTICE tests; scores are structural, not real AI capabilities')\n    return profiles\ndef plan(m):\n    validate(m)\n    tasks=[{'id':'research','skill':'research','depends':[]},{'id':'planning','skill':'planning','depends':[]},{'id':'writing','skill':'writing','depends':['research','planning']},{'id':'testing','skill':'testing','depends':['writing']}]\n    return {'mode':'PRACTICE','planner':'fixed recipe for guide/checklist; mission text is data, not executable instruction','tasks':tasks,'release_gate':'human approval of verified content hash'}\ndef execute(m,inject='none'):\n    validate(m); con=db()\n    for skill in SKILLS:\n        if not talent(con,skill): raise ValueError('Run audition first: '+skill)\n    run_id=uuid.uuid4().hex[:12];folder=STATE/run_id;folder.mkdir()\n    deadline=time.monotonic()+m['constraints']['max_runtime_seconds'];start=time.monotonic()\n    state={'run_id':run_id,'mode':'PRACTICE','mission':m,'status':'running','started':now(),'tasks':[{**t,'status':'queued','attempts':0,'tried':[],'result':None} for t in plan(m)['tasks']], 'messages':[],'usage':{'tokens':None,'token_basis':'No model invoked','cost_usd':0,'tool_calls':0,'tasks_succeeded':0,'failures':0,'retries':0,'image_generations':0,'video_generations':0},'verification':False,'elapsed_seconds':0}\n    def save():\n        state['elapsed_seconds']=time.monotonic()-start\n        state['skills']={s:talent(con,s) for s in SKILLS}\n        state['bots']=[{'bot':b,'status':'active' if any(t.get('bot')==b and t['status']=='running' for t in state['tasks']) else 'available'} for b in BOTS]\n        dump(folder/'report.json',state);dump(STATE/'dashboard.json',state)\n    def event(kind,**data): state['messages'].append({'at':now(),'kind':kind,**data});save()\n    event('mission_received',recipe=plan(m))\n    while any(t['status'] in ['queued','running'] for t in state['tasks']):\n        if time.monotonic()>=deadline:\n            state['status']='stopped_runtime';event('runtime_limit');break\n        completed={t['id'] for t in state['tasks'] if t['status']=='completed'}\n        ready=[t for t in state['tasks'] if t['status']=='queued' and set(t['depends'])<=completed]\n        if not ready:\n            state['status']='blocked';event('dependency_blocked');break\n        chosen=[];busy=set()\n        for t in ready:\n            candidates=[r for r in talent(con,t['skill']) if r['quality']>=50 and r['bot'] not in busy and r['bot'] not in t['tried']]\n            if t['id']=='testing': candidates=[r for r in candidates if r['bot']!=next(x['bot'] for x in state['tasks'] if x['id']=='writing')]\n            if not candidates:\n                if busy: continue\n                t['status']='failed';event('no_qualified_replacement',task=t['id']);continue\n            if state['usage']['tool_calls']>=m['constraints']['max_tool_calls']:\n                state['status']='stopped_budget';event('tool_call_limit');break\n            bot=candidates[0]['bot'];busy.add(bot);chosen.append(t);t.update(bot=bot,status='running',attempts=t['attempts']+1,dispatch_monotonic=time.monotonic());t['tried'].append(bot)\n            state['usage']['tool_calls']+=1\n            if t['attempts']>1: state['usage']['retries']+=1\n            event('assigned',task=t['id'],bot=bot,rankings=candidates,attempt=t['attempts'])\n            if len(chosen)>=m['constraints']['parallel_workers']: break\n        if state['status']=='stopped_budget': break\n        if not chosen: continue\n        inputs={t['id']:t['result'] for t in state['tasks'] if t['status']=='completed'}\n        with ThreadPoolExecutor(max_workers=len(chosen)) as pool:\n            futures={pool.submit(work,t['bot'],t['skill'],m,inputs,t['attempts'],inject,min(m['constraints']['task_timeout_seconds'],max(.001,deadline-time.monotonic()))):t for t in chosen}\n            event('parallel_wave',tasks=[t['id'] for t in chosen])\n            for future in as_completed(futures):\n                t=futures[future];error='';score=0;seconds=0\n                try:\n                    answer=future.result();seconds=answer['seconds'];score=grade(t['skill'],answer['result'],m)\n                    t['started_monotonic']=answer['started_monotonic'];t['ended_monotonic']=answer['ended_monotonic']\n                    if time.monotonic()>deadline: raise TimeoutError('mission deadline')\n                    if score<90: raise ValueError('output failed structural grading')\n                    t.update(result=answer['result'],status='completed');state['usage']['tasks_succeeded']+=1\n                except Exception as e:\n                    error=type(e).__name__+': '+str(e);score=0;seconds=time.monotonic()-t['dispatch_monotonic'];state['usage']['failures']+=1\n                    t['status']='queued' if t['attempts']<m['constraints']['max_attempts'] else 'failed'\n                observe(con,t['bot'],t['skill'],score,seconds,error);t['grade']=score;t['error']=error\n                event('verified' if not error else 'failure_detected',task=t['id'],score=score,error=error)\n    all_done=all(t['status']=='completed' for t in state['tasks'])\n    if all_done:\n        state['verification']=True;state['status']='awaiting_approval'\n        content=next(t['result'] for t in state['tasks'] if t['id']=='writing')\n        dump(folder/'draft.json',content);state['draft_sha256']=hashlib.sha256((folder/'draft.json').read_bytes()).hexdigest()\n    elif state['status']=='running':state['status']='blocked'\n    for t in state['tasks']:\n        if t['status'] in ['queued','running']:t['status']='blocked'\n    event('mission_report',status=state['status']);con.close()\n    print('MISSION '+state['status']+' '+run_id+'; local draft only; no publication')\n    return state\ndef approve(run_id,digest):\n    if not run_id or run_id=='RUN_ID' or not digest or digest=='SHA256':raise ValueError('Replace RUN_ID and SHA256 with the saved run ID and reviewed draft_sha256 from memory. No approval was written.')\n    folder=inside(STATE,run_id);report=json.loads((folder/'report.json').read_text())\n    if report['status']!='awaiting_approval' or not report['verification']:raise ValueError('Verified draft must await approval')\n    actual=hashlib.sha256((folder/'draft.json').read_bytes()).hexdigest()\n    if actual!=digest or actual!=report['draft_sha256']:raise ValueError('Hash mismatch: review current bytes before approval')\n    dump(folder/'approved.json',json.loads((folder/'draft.json').read_text()))\n    report.update(status='completed',approval={'at':now(),'sha256':digest,'scope':'Local release only; no external publication authorization'})\n    dump(folder/'report.json',report);dump(STATE/'dashboard.json',report)\n    print('APPROVAL PASS: verified local release; no external action')\ndef main():\n    parser=argparse.ArgumentParser();parser.add_argument('action',choices=['doctor','audition','plan','run','talent','memory','approve']);parser.add_argument('--mission',default='mission.json');parser.add_argument('--inject',choices=['none','crash','timeout','bad-output'],default='none');parser.add_argument('--run-id');parser.add_argument('--sha256');parser.add_argument('--full',action='store_true',help='Print complete retained JSON instead of the bounded terminal summary');a=parser.parse_args()\n    (ROOT/'logs').mkdir(exist_ok=True);logging.basicConfig(filename=ROOT/'logs/coordinator.log',encoding='utf-8',level=logging.INFO)\n    try:\n        if a.action=='doctor':\n            import sys\n            if sys.version_info<(3,10): raise ValueError('Python 3.10+ required')\n            print('DOCTOR PASS: Python, SQLite, futures; PRACTICE only, no paid dependency');return\n        if a.action=='approve':approve(a.run_id,a.sha256);return\n        if a.action=='talent':\n            con=db();profiles={s:talent(con,s) for s in SKILLS};con.close()\n            if a.full:print(json.dumps(profiles,indent=2))\n            else:\n                print('PRACTICE talent: latest-five observations; quality/reliability/speed determine selection, not model-brand reputation.')\n                for skill,rows in profiles.items():print(skill+': '+json.dumps(rows,separators=(',',':')))\n            return\n        if a.action=='memory':\n            reports=[json.loads(p.read_text()) for p in sorted(STATE.glob('*/report.json'))]\n            if a.run_id:reports=[r for r in reports if r['run_id']==a.run_id]\n            if a.full:print(json.dumps(reports,indent=2))\n            else:\n                print('PRACTICE memory: '+str(len(reports))+' saved runs; last5shown. Full source notes/attempts remain in state/<run-id>/report.json; use memory --full or --run-id ID.')\n                for r in reports[-5:]:print(json.dumps({k:r.get(k) for k in ('run_id','status','started','draft_sha256','usage')},separators=(',',':')))\n                con=db();print('Retained research observations: '+str(con.execute('SELECT COUNT(*) FROM observations').fetchone()[0]));con.close()\n            return\n        m=validate(json.loads(Path(a.mission).read_text(encoding='utf-8')))\n        if a.action=='audition':audition(m)\n        elif a.action=='plan':print(json.dumps(plan(m),indent=2))\n        else:execute(m,a.inject)\n    except (ValueError,FileNotFoundError,TypeError) as exc:\n        logging.exception('Swarm input rejected')\n        print('REJECTED: '+str(exc))\n        raise SystemExit(1)\n    except Exception:logging.exception('Swarm stopped');raise\nif __name__=='__main__':main()\n"
    },
    {
      "filename": "dashboard.py",
      "title": "dashboard.py",
      "type": "practice script",
      "contents": "\"\"\"Read-only localhost mission monitor; no dashboard approval endpoint.\nVERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created read-only two-second polling monitor; hub 2089.\n\"\"\"\nimport argparse\nimport json\nimport logging\nfrom http.server import BaseHTTPRequestHandler, ThreadingHTTPServer\nfrom pathlib import Path\n\nROOT=Path(__file__).resolve().parent\nPAGE='''<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>PRACTICE Mission Control</title><style>body{background:#101828;color:#eef2fa;font:16px system-ui;margin:24px}h1{color:#66e5c0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}section{background:#1c2940;border-radius:12px;padding:18px}pre{white-space:pre-wrap;overflow-wrap:anywhere}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:8px;border-bottom:1px solid #42516b}progress{width:100%}.muted{color:#bbc8dd}</style></head><body><h1>PRACTICE Mission Control</h1><p class=\"muted\">Deterministic local workers. No real AI, tokens or billable calls. Updates every two seconds. Human approves reviewed bytes in the terminal.</p><p id=\"connection\" role=\"status\">Waiting for the first mission</p><h2 id=\"mission\"></h2><p id=\"status\"></p><progress id=\"progress\" max=\"4\" value=\"0\"></progress><div class=\"grid\"><section><h2>Workers</h2><div id=\"bots\"></div></section><section><h2>Usage and limits</h2><pre id=\"usage\"></pre></section><section><h2>Verification and approval</h2><pre id=\"verification\"></pre></section></div><h2>Work queue</h2><table><thead><tr><th>Task</th><th>State</th><th>Worker</th><th>Attempt</th></tr></thead><tbody id=\"tasks\"></tbody></table><h2>Measured skills</h2><pre id=\"skills\"></pre><h2>Messages and errors</h2><pre id=\"messages\"></pre><details><summary>Full audit data</summary><pre id=\"raw\"></pre></details><script>async function refresh(){try{const r=await fetch('/state',{cache:'no-store'});if(!r.ok)throw Error('No mission yet');const s=await r.json();document.getElementById('connection').textContent='Connected: '+new Date().toLocaleTimeString();document.getElementById('mission').textContent=s.mission.mission;document.getElementById('status').textContent=s.status+' | run '+s.run_id;document.getElementById('progress').value=s.tasks.filter(t=>t.status==='completed').length;document.getElementById('bots').replaceChildren(...s.bots.map(b=>{const p=document.createElement('p');p.textContent=b.bot+': '+b.status;return p}));document.getElementById('tasks').replaceChildren(...s.tasks.map(t=>{const tr=document.createElement('tr');for(const v of [t.id,t.status,t.bot||'unassigned',t.attempts]){const td=document.createElement('td');td.textContent=v;tr.append(td)}return tr}));document.getElementById('usage').textContent='Worker calls: '+s.usage.tool_calls+' / '+s.mission.constraints.max_tool_calls+'\\\\nCompleted tasks: '+s.usage.tasks_succeeded+' / 4\\\\nFailures: '+s.usage.failures+' | Retries: '+s.usage.retries+'\\\\nElapsed: '+s.elapsed_seconds.toFixed(2)+' seconds\\\\nBilled PRACTICE cost: USD 0\\\\nTokens: null (no AI model invoked)\\\\nImages/videos: 0 (not generated)';document.getElementById('verification').textContent=(s.verification?'Structural checks passed.':'Not yet verified.')+'\\\\nStatus: '+s.status+'\\\\nHuman approval: '+(s.approval?'recorded for local release':'required before local release')+'\\\\nDraft SHA256: '+(s.draft_sha256||'pending');document.getElementById('skills').textContent=Object.entries(s.skills).map(([skill,rows])=>skill.toUpperCase()+'\\\\n'+rows.map(r=>r.bot+' | quality '+r.quality.toFixed(0)+'/100 | success '+(r.success_rate*100).toFixed(0)+'% | '+r.seconds.toFixed(3)+'s | '+r.observations+' tests').join('\\\\n')).join('\\\\n\\\\n');document.getElementById('messages').textContent=s.messages.map(m=>m.at.slice(11,19)+' '+m.kind+' '+(m.task||'')+' '+(m.bot||'')+(m.tasks?' ['+m.tasks.join(', ')+']':'')+(m.error?' ERROR: '+m.error:'')+(m.status?' '+m.status:'')).join('\\\\n');document.getElementById('raw').textContent=JSON.stringify(s,null,2)}catch(e){document.getElementById('connection').textContent='Waiting or disconnected: '+e.message}}refresh();setInterval(refresh,2000)</script></body></html>'''\n\nclass Handler(BaseHTTPRequestHandler):\n    def do_GET(self):\n        if self.path=='/': data=PAGE.encode();kind='text/html'\n        elif self.path=='/state':\n            try:data=(ROOT/'state/dashboard.json').read_bytes();json.loads(data);kind='application/json'\n            except (OSError,ValueError):self.send_error(404,'No mission yet');return\n        else:self.send_error(404);return\n        self.send_response(200);self.send_header('Content-Type',kind+'; charset=utf-8');self.send_header('Cache-Control','no-store');self.send_header('Content-Security-Policy',\"default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; connect-src 'self'\");self.end_headers();self.wfile.write(data)\n    def log_message(self,fmt,*args):logging.info(fmt,*args)\n\nif __name__=='__main__':\n    p=argparse.ArgumentParser();p.add_argument('--port',type=int,default=0);a=p.parse_args()\n    (ROOT/'logs').mkdir(exist_ok=True);logging.basicConfig(filename=ROOT/'logs/dashboard.log',encoding='utf-8',level=logging.INFO)\n    server=ThreadingHTTPServer(('127.0.0.1',a.port),Handler)\n    print('PRACTICE dashboard http://127.0.0.1:'+str(server.server_port)+' (Ctrl+C to stop)',flush=True)\n    try:server.serve_forever()\n    except KeyboardInterrupt:pass\n    finally:server.server_close()\n"
    },
    {
      "filename": "graduation.md",
      "title": "graduation.md",
      "type": "worksheet",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created independent swarm course; hub 2089. Revision 2026-10-14 EDT | chatgpt_codex | codex-20261014-overnight | r7 step-specific peer repairs.\n\n# Mission evidence\n\nRecord mission input hash, run ID, observed audition scores, source accuracy review, two overlapping worker intervals, dependency order, different reviewer, failed first attempt/replacement, resource limits, retained memory, final report and approval hash.\n\n[ ] PRACTICE: all above demonstrated on new source notes.\n[ ] REAL Stage 5: at least three actual authenticated workers, comparable blind auditions, artifacts, independent rubric reviews, observed timing/errors, known/unknown cost labels and human-supervised handoff.\n[ ] REAL Stage 6: reviewed general mission planner and automatic live-worker dispatch within enforced external boundaries, real monitored budget and runtime, actual failure recovery, independent verification and a fresh real mission without human task chaining. This kit does not implement or certify that gate.\n\nHuman review: Which source assertions did you verify? Which remain uncertain? Would tomorrow's mission fit the demonstrated capabilities? What needs approval?\n\nOne bot -> multiple bots -> AI team -> AI competition -> swarm -> autonomous swarm. You do not need to become an AI programmer. You need to learn how to build, manage, test, and supervise an AI workforce.\n"
    },
    {
      "filename": "guardrails.py",
      "title": "guardrails.py",
      "type": "practice script",
      "contents": "\"\"\"Boundaries for a local PRACTICE swarm, not an operating-system sandbox.\nVERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created bounded mission contract; hub 2089.\n\"\"\"\nimport math\nfrom pathlib import Path\n\n\ndef number(value, minimum, maximum, name):\n    if isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value) or not minimum <= value <= maximum:\n        raise ValueError('Invalid ' + name)\n    return value\n\n\ndef validate(m):\n    if m.get('mode') != 'PRACTICE':\n        raise ValueError('This executable supports PRACTICE only; real agents need separately reviewed adapters')\n    if m.get('deliverable') not in ['guide', 'checklist']:\n        raise ValueError('Supported deliverables: guide or checklist; free-form planning is not implemented')\n    for k in ['mission', 'objective', 'success_criteria']:\n        if not isinstance(m.get(k), str) or not 5 <= len(m[k]) <= 3000:\n            raise ValueError('Missing or invalid ' + k)\n    facts = m.get('resources')\n    if not isinstance(facts, list) or not 2 <= len(facts) <= 30:\n        raise ValueError('Provide 2-30 permitted source notes')\n    for f in facts:\n        if not isinstance(f, dict) or not all(isinstance(f.get(k), str) and 1 <= len(f[k]) <= 3000 for k in ['id', 'text', 'origin']):\n            raise ValueError('Source notes require id, text, origin')\n    if len({f['id'] for f in facts}) != len(facts):\n        raise ValueError('Duplicate source id')\n    c = m['constraints']\n    number(c['max_runtime_seconds'], .05, 300, 'runtime')\n    number(c['task_timeout_seconds'], .01, 10, 'task timeout')\n    for name, low, high in [('max_attempts',1,3),('parallel_workers',1,3),('max_tool_calls',1,100)]:\n        number(c[name],low,high,name)\n        if not isinstance(c[name],int): raise ValueError('Integer required: '+name)\n    number(c['max_cost_usd'],0,0,'PRACTICE money budget')\n    if c.get('allowed_tools') != ['local_practice'] or c.get('allowed_websites') != []:\n        raise ValueError('PRACTICE has no web access or external tools')\n    if m.get('approval_rules') != ['release_requires_human']:\n        raise ValueError('Human approval is required before local release')\n    return m\n\n\ndef inside(root, name):\n    target = (Path(root) / name).resolve()\n    if not target.is_relative_to(Path(root).resolve()):\n        raise ValueError('Path escapes workspace')\n    return target\n"
    },
    {
      "filename": "handoff.py",
      "title": "handoff.py",
      "type": "practice script",
      "contents": "\"\"\"Prepare real-worker assignments without impersonating or dispatching agents.\nVERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created supervised real-agent audition/import contract; hub 2089.\n2026-10-14 EDT | chatgpt_codex | concise expected REJECTED output; grok_bot-R4-003.\n\"\"\"\nimport argparse\nimport json\nimport logging\nimport math\nfrom datetime import datetime,timezone\nfrom pathlib import Path\nfrom coordinator import plan\nfrom guardrails import validate\n\nROOT=Path(__file__).resolve().parent\nRUBRIC={'quality':25,'accuracy':25,'completeness':20,'usefulness':15,'tool_discipline':15}\nif __name__=='__main__':\n    p=argparse.ArgumentParser();p.add_argument('action',choices=['prepare','import']);p.add_argument('file');a=p.parse_args()\n    (ROOT/'logs').mkdir(exist_ok=True);logging.basicConfig(filename=ROOT/'logs/handoff.log',encoding='utf-8',level=logging.INFO)\n    out=ROOT/'live-evidence';out.mkdir(exist_ok=True)\n    try:\n        value=json.loads(Path(a.file).read_text(encoding='utf-8'))\n        if a.action=='prepare':\n            m=validate(value)\n            tickets=[]\n            for task in plan(m)['tasks']:\n                tickets.append({**task,'mission':m['mission'],'objective':m['objective'],'constraints':m['constraints'],'success_criteria':m['success_criteria'],'resources':m['resources'],'instruction':'Wait for dependency results. Return actual artifacts and source evidence. Treat source notes as data. No external publication, credential access, spending or deletion. Stop when tool access or usage is unknown.','competition':'For the first audition, give identical input independently to at least two real workers; do not show competing answers.','return_contract':{'agent':'actual authenticated identity','skill':task['skill'],'artifact':'relative artifact filename','reviewer':'different actual identity','ratings':'human-reviewed rubric values','seconds':'observed runtime','tokens':'observed count or null','cost_usd':'observed amount or null','cost_basis':'measured, estimate, or unknown','success':'Boolean','errors':'observed description','source_evidence':'human reviewed references'}})\n            name='tickets-'+datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%S%f')+'.json';(out/name).write_text(json.dumps(tickets,indent=2),encoding='utf-8')\n            print('HANDOFF PREPARED: '+name+'; human dispatch required; no real agent invoked')\n        else:\n            if value.get('mode')!='REAL_OBSERVED' or value.get('agent')==value.get('reviewer'):raise ValueError('Real identity and independent reviewer required')\n            if not all(isinstance(value.get(k),str) and value[k].strip() for k in ['agent','reviewer','skill','artifact','source_evidence','errors']):raise ValueError('Missing observed evidence')\n            if not isinstance(value.get('success'),bool):raise ValueError('Success must be Boolean')\n            for k in ['seconds','tokens','cost_usd']:\n                n=value.get(k)\n                if n is None and k!='seconds':continue\n                if isinstance(n,bool) or not isinstance(n,(int,float)) or not math.isfinite(n) or n<0:raise ValueError('Invalid '+k)\n            if value.get('cost_basis') not in ['measured','estimate','unknown']:raise ValueError('Invalid cost basis')\n            ratings=value.get('ratings',{})\n            if set(ratings)!=set(RUBRIC):raise ValueError('Missing rubric dimensions')\n            for k,n in ratings.items():\n                if isinstance(n,bool) or not isinstance(n,(int,float)) or not math.isfinite(n) or not 0<=n<=RUBRIC[k]:raise ValueError('Invalid rating '+k)\n            artifact=(Path(a.file).resolve().parent/value['artifact']).resolve()\n            if not artifact.is_relative_to(Path(a.file).resolve().parent) or not artifact.is_file():raise ValueError('Missing or escaped artifact')\n            value.update(imported_at=datetime.now(timezone.utc).isoformat(),score=sum(ratings.values()),trust='Learner-supplied receipt; not independent proof of identity or billing')\n            with (out/'observations.jsonl').open('a',encoding='utf-8') as f:f.write(json.dumps(value)+'\\n')\n            print('OBSERVATION IMPORTED: kept separate from PRACTICE talent; not autonomous live graduation')\n    except (ValueError,FileNotFoundError) as exc:\n        logging.exception('Handoff input rejected')\n        print('REJECTED: '+str(exc))\n        raise SystemExit(1)\n    except Exception:logging.exception('Handoff validation failed');raise\n"
    },
    {
      "filename": "mission.json",
      "title": "mission.json",
      "type": "worksheet",
      "contents": "{\n  \"mode\": \"PRACTICE\",\n  \"mission\": \"Create a welcome guide for a neighborhood reading club\",\n  \"objective\": \"Turn the supplied club rules into an accurate member handout\",\n  \"deliverable\": \"guide\",\n  \"constraints\": {\n    \"max_runtime_seconds\": 30,\n    \"task_timeout_seconds\": 1,\n    \"max_attempts\": 2,\n    \"parallel_workers\": 2,\n    \"max_tool_calls\": 12,\n    \"max_cost_usd\": 0,\n    \"allowed_tools\": [\n      \"local_practice\"\n    ],\n    \"allowed_websites\": []\n  },\n  \"resources\": [\n    {\n      \"id\": \"rule-1\",\n      \"text\": \"Meet on the first Saturday at 10 AM.\",\n      \"origin\": \"Invented club rule for PRACTICE\"\n    },\n    {\n      \"id\": \"rule-2\",\n      \"text\": \"Bring one book and keep discussion respectful.\",\n      \"origin\": \"Invented club rule for PRACTICE\"\n    },\n    {\n      \"id\": \"rule-3\",\n      \"text\": \"Ask the organizer before inviting guests.\",\n      \"origin\": \"Invented club rule for PRACTICE\"\n    }\n  ],\n  \"success_criteria\": \"All three source notes appear accurately with source IDs; draft passes a different worker review; human approves final bytes\",\n  \"approval_rules\": [\n    \"release_requires_human\"\n  ]\n}"
    },
    {
      "filename": "practice_bots.py",
      "title": "practice_bots.py",
      "type": "practice script",
      "contents": "\"\"\"Three deliberately different deterministic workers: these are NOT AI models.\nVERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created practice auditions and mission workers; hub 2089.\n\"\"\"\nimport time\n\nBOTS = ['PRACTICE-amber', 'PRACTICE-blue', 'PRACTICE-coral']\n\n\ndef work(bot, skill, mission, inputs, attempt, inject, timeout):\n    started = time.monotonic()\n    delay = {'PRACTICE-amber': .09, 'PRACTICE-blue': .04, 'PRACTICE-coral': .06}[bot]\n    time.sleep(min(delay, timeout))\n    if delay >= timeout:\n        raise TimeoutError('practice worker deadline')\n    if inject == 'crash' and skill == 'writing' and attempt == 1:\n        raise RuntimeError('injected crash')\n    if inject == 'timeout' and skill == 'writing' and attempt == 1:\n        raise TimeoutError('injected timeout')\n    if skill == 'research':\n        result = {'notes': [{'source': f['id'], 'text': f['text']} for f in mission['resources']]}\n        if bot == 'PRACTICE-amber': result['notes'] = result['notes'][:1]\n    elif skill == 'planning':\n        result = {'outline': ['Goal: ' + mission['objective'], 'Evidence', 'Actions', 'Review']}\n        if bot == 'PRACTICE-blue': result['outline'] = []\n    elif skill == 'writing':\n        research = inputs.get('research', {'notes':[{'source':f['id'],'text':f['text']} for f in mission['resources']]})\n        result = {'title': mission['mission'], 'kind': mission['deliverable'], 'items': [{'source':n['source'], 'text':n['text']} for n in research['notes']], 'review_note':'Human must check source accuracy and usefulness.'}\n        if bot == 'PRACTICE-coral' or (inject == 'bad-output' and attempt == 1): result['items'] = []\n    elif skill == 'testing':\n        draft = inputs.get('writing')\n        result = {'reviewer':bot,'passed':bool(draft and len(draft.get('items',[])) >= 2), 'scope':'Mechanical PRACTICE peer check, not factual or creative quality'}\n        if bot == 'PRACTICE-blue': result['passed'] = False\n    else: raise ValueError('Unknown skill')\n    ended=time.monotonic()\n    return {'result':result, 'seconds':ended-started, 'started_monotonic':started, 'ended_monotonic':ended, 'tokens':None, 'cost_usd':0, 'tool_calls':1, 'image_generations':0, 'video_generations':0}\n\n\ndef grade(skill, result, mission):\n    \"\"\"Observed structural tests; numbers are not ratings of real brands or models.\"\"\"\n    if not isinstance(result,dict): return 0\n    if skill == 'research':\n        expected = {f['id']:f['text'] for f in mission['resources']}\n        notes = result.get('notes',[])\n        return 100 if len(notes)==len(expected) and {n.get('source'):n.get('text') for n in notes}==expected else 0\n    if skill == 'planning': return 100 if len(result.get('outline',[]))==4 and mission['objective'] in result['outline'][0] else 0\n    if skill == 'writing':\n        expected={f['id']:f['text'] for f in mission['resources']}\n        return 100 if result.get('title')==mission['mission'] and result.get('kind')==mission['deliverable'] and {n.get('source'):n.get('text') for n in result.get('items',[])}==expected else 0\n    if skill == 'testing': return 100 if result.get('passed') is True and result.get('reviewer') in BOTS else 0\n    return 0\n"
    },
    {
      "filename": "README.md",
      "title": "README.md",
      "type": "worksheet",
      "contents": "VERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created independent swarm course; hub 2089. Revision 2026-10-14 EDT | chatgpt_codex | codex-20261014-overnight | r7 step-specific peer repairs.\n\n# PRACTICE Swarm Lab\n\nExtract all files into one new practice folder. Python 3.10+; no pip install, account, password or paid model is required. On Windows use python or py -3; on macOS/Linux use python3.\n\nManager: coordinator.py. Specialists: practice_bots.py. Talent: state/talent.sqlite (append-only observations). Bounds: guardrails.py. Monitor: dashboard.py. Real handoff: handoff.py (manual dispatch; not automatic AI). Memory restore: restore.py. Checks: test_swarm.py.\n\nQuick start:\n\n    python coordinator.py doctor\n    python coordinator.py plan\n    python coordinator.py audition\n    python coordinator.py run --inject crash\n    python dashboard.py\n    python test_swarm.py\n\nDashboard chooses a free localhost port and prints it. Open that exact URL; Ctrl+C stops it. Reports and drafts are in state/<run-id>. Review a draft and use its exact run ID and SHA256 for local approval. No command publishes externally. Scripts log errors in logs/. Run IDs preserve mission history. Do not delete state to hide failures.\n\nThis is a deterministic recipe for source-note guides and checklists, not AI understanding or a broad natural-language planner. Structural scores only describe these fixture tasks. Tokens are unknown/not applicable; billed cost is measured zero because no model is called. The coordinator enforces call count, retries and runtime for trusted practice functions; it cannot contain malicious code. External URLs, paid calls and credentials have no execution path in this mode. The separate handoff receipt importer is learner-supplied evidence, not authenticated provider proof. Real autonomous Stage 6 remains unverified.\n"
    },
    {
      "filename": "real-observation-template.json",
      "title": "real-observation-template.json",
      "type": "worksheet",
      "contents": "{\n  \"mode\": \"REAL_OBSERVED\",\n  \"agent\": \"\",\n  \"reviewer\": \"\",\n  \"skill\": \"research\",\n  \"artifact\": \"\",\n  \"ratings\": {\n    \"quality\": null,\n    \"accuracy\": null,\n    \"completeness\": null,\n    \"usefulness\": null,\n    \"tool_discipline\": null\n  },\n  \"seconds\": null,\n  \"tokens\": null,\n  \"cost_usd\": null,\n  \"cost_basis\": \"unknown\",\n  \"success\": false,\n  \"errors\": \"\",\n  \"source_evidence\": \"\"\n}"
    },
    {
      "filename": "restore.py",
      "title": "restore.py",
      "type": "practice script",
      "contents": "\"\"\"Copy retained swarm memory and prove a scratch restore; never deletes source.\nVERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created non-destructive memory restore proof; hub 2089.\n\"\"\"\nimport hashlib\nimport logging\nimport shutil\nimport uuid\nfrom pathlib import Path\n\nROOT=Path(__file__).resolve().parent\nif __name__=='__main__':\n    (ROOT/'logs').mkdir(exist_ok=True);logging.basicConfig(filename=ROOT/'logs/restore.log',encoding='utf-8',level=logging.INFO)\n    try:\n        source=ROOT/'state'\n        if not source.exists():raise ValueError('Run auditions and one mission first')\n        archive=ROOT/'archive'/uuid.uuid4().hex;backup=archive/'backup';restored=archive/'restored'\n        shutil.copytree(source,backup);shutil.copytree(backup,restored)\n        originals={p.relative_to(source).as_posix():hashlib.sha256(p.read_bytes()).hexdigest() for p in source.rglob('*') if p.is_file()}\n        hashes={p.relative_to(restored).as_posix():hashlib.sha256(p.read_bytes()).hexdigest() for p in restored.rglob('*') if p.is_file()}\n        if not originals or hashes!=originals:raise ValueError('Restore hash mismatch')\n        print('RESTORE PASS: '+str(len(hashes))+' files match; same-disk practice only, not disaster backup')\n    except Exception:logging.exception('Restore failed');raise\n"
    },
    {
      "filename": "test_swarm.py",
      "title": "test_swarm.py",
      "type": "practice script",
      "contents": "\"\"\"Meaningful local regressions; retained isolated evidence, no paid calls.\nVERSION HISTORY\n2026-10-06 EDT | chatgpt_codex | codex-2026-10-06-swarm | created contract, recovery, overlap, approval, memory and resource tests; hub 2089.\n\"\"\"\nimport argparse\nimport copy\nimport hashlib\nimport json\nimport logging\nimport uuid\nfrom pathlib import Path\nimport coordinator as c\nfrom guardrails import inside, validate\n\nROOT=Path(__file__).resolve().parent\ndef rejects(fn):\n    try:fn()\n    except (ValueError,TypeError,KeyError):return\n    raise AssertionError('Invalid input was accepted')\n\ndef main(contracts_only=False):\n    m=json.loads((ROOT/'mission.json').read_text(encoding='utf-8'))\n    validate(m)\n    for change in [lambda x:x.update(mode='REAL'),lambda x:x['constraints'].update(max_cost_usd=.01),lambda x:x['constraints'].update(allowed_websites=['https://example.com']),lambda x:x['constraints'].update(max_runtime_seconds=float('nan')),lambda x:x['constraints'].update(max_attempts=True),lambda x:x.update(approval_rules=[]),lambda x:x.update(deliverable='video')]:\n        bad=copy.deepcopy(m);change(bad);rejects(lambda:validate(bad))\n    rejects(lambda:inside(ROOT,'../escaped.json'))\n    print('CONTRACTS PASS: unsupported mode, spending, network, nonfinite, Boolean, approval, recipe and path rejected')\n    if contracts_only:return\n    evidence=ROOT/'checks'/uuid.uuid4().hex;evidence.mkdir(parents=True)\n    results=[]\n    def start(name,mission=m):\n        c.STATE=evidence/name;c.audition(mission)\n    start('normal');r=c.execute(m)\n    assert r['status']=='awaiting_approval' and r['verification'] and r['usage']['tokens'] is None and r['usage']['cost_usd']==0\n    tasks={t['id']:t for t in r['tasks']};a,b=tasks['research'],tasks['planning']\n    assert a['bot']!=b['bot'] and max(a['started_monotonic'],b['started_monotonic'])<min(a['ended_monotonic'],b['ended_monotonic'])\n    assert tasks['writing']['started_monotonic']>=max(a['ended_monotonic'],b['ended_monotonic'])\n    assert tasks['testing']['bot']!=tasks['writing']['bot'] and tasks['testing']['started_monotonic']>=tasks['writing']['ended_monotonic']\n    folder=c.STATE/r['run_id'];assert not (folder/'approved.json').exists()\n    c.approve(r['run_id'],r['draft_sha256']);assert (folder/'approved.json').exists()\n    rejects(lambda:c.approve(r['run_id'],r['draft_sha256']))\n    # Reopening the DB preserves actual observation history and known failed workers.\n    con=c.db();n=con.execute('SELECT count(*) FROM observations').fetchone()[0];con.close();assert n==16\n    con=c.db();assert con.execute('SELECT count(*) FROM observations').fetchone()[0]==n;assert c.talent(con,'writing')[0]['quality']>=90;con.close()\n    results.append('Normal mission: measured overlap, dependency ordering, different peer, held draft, approval and persistent observations')\n    start('tamper');r=c.execute(m);folder=c.STATE/r['run_id'];original=(folder/'draft.json').read_bytes();(folder/'draft.json').write_bytes(original+b' ')\n    rejects(lambda:c.approve(r['run_id'],r['draft_sha256']));assert not (folder/'approved.json').exists();results.append('Changed bytes cannot be approved')\n    for injection in ['crash','timeout','bad-output']:\n        start(injection);r=c.execute(m,injection);writing=next(t for t in r['tasks'] if t['id']=='writing')\n        assert r['status']=='awaiting_approval' and r['usage']['failures']==1 and r['usage']['retries']==1 and writing['attempts']==2 and len(set(writing['tried']))==2\n        results.append(injection+': detected and reassigned, then verified')\n    limited=copy.deepcopy(m);limited['constraints']['max_attempts']=1;start('attempt-limit',limited);r=c.execute(limited,'bad-output')\n    assert r['status']=='blocked' and not r['verification'];rejects(lambda:c.approve(r['run_id'],'bad'));results.append('Retry exhaustion blocks dependent work and release')\n    limited=copy.deepcopy(m);limited['constraints']['max_tool_calls']=1;start('call-limit',limited);r=c.execute(limited)\n    assert r['status']=='stopped_budget' and r['usage']['tool_calls']<=1 and not r['verification'];results.append('Tool-call cap stops dispatch')\n    limited=copy.deepcopy(m);limited['constraints']['max_runtime_seconds']=.05;start('runtime-limit',limited);r=c.execute(limited)\n    assert r['status'] in ['stopped_runtime','blocked'] and not r['verification'] and r['elapsed_seconds']<.3;results.append('Runtime stop forbids release')\n    # An unseen input changes topic, objective, sources and deliverable; no worker roles supplied.\n    fresh=copy.deepcopy(m);fresh.update(mission='Prepare a seed-library borrowing checklist',objective='Help borrowers return labelled seeds',deliverable='checklist');fresh['resources']=[{'id':'seed-a','text':'Label every seed envelope.','origin':'PRACTICE invented policy'},{'id':'seed-b','text':'Record the borrowing date.','origin':'PRACTICE invented policy'}]\n    start('unseen',fresh);r=c.execute(fresh,'bad-output');assert r['status']=='awaiting_approval';draft=json.loads((c.STATE/r['run_id']/'draft.json').read_text());assert draft['title']==fresh['mission'] and draft['kind']=='checklist' and len(draft['items'])==2;results.append('Fresh constrained mission: new sources, topic, deliverable and recovered failure')\n    receipt={'status':'PASS','mode':'PRACTICE','tests':results,'limitations':'No AI invoked. Fixed recipes, structural scoring, Windows local execution; real autonomy unverified.'}\n    (evidence/'results.json').write_text(json.dumps(receipt,indent=2),encoding='utf-8')\n    print('SWARM TEST PASS: '+str(len(results))+' substantive checks; evidence '+str(evidence))\n    return receipt\nif __name__=='__main__':\n    p=argparse.ArgumentParser();p.add_argument('--contracts',action='store_true');a=p.parse_args()\n    (ROOT/'logs').mkdir(exist_ok=True);logging.basicConfig(filename=ROOT/'logs/test-swarm.log',encoding='utf-8',level=logging.INFO)\n    try:main(a.contracts)\n    except Exception:logging.exception('Swarm regression failed');raise\n"
    }
  ],
  "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": "Give Your Swarm a Mission",
    "instructions": "Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery. Complete graduation.md. PRACTICE graduation requires measured auditions, selection, dependency order, overlap, communication, memory, budget stops, recovery, peer structural review, human review, approval and final report. REAL Stage 5 requires actual artifacts and independent real reviews. REAL Stage 6 additionally requires automatically dispatched authenticated workers, arbitrary mission decomposition validated by a human, measured usage, enforced external permissions and a fresh mission without hand-chaining. Keep that checkbox unearned until observed.",
    "required_inputs": [
      "capstone.json",
      "graduation.md"
    ],
    "success_conditions": [
      "Build a mission contract with enforceable local boundaries.",
      "Measure skills with blind auditions and explain worker selection.",
      "Prove task dependencies, actual overlap and independent review.",
      "Recover failures while respecting resource limits.",
      "Retain and restore shared mission memory.",
      "Review verified bytes and distinguish PRACTICE from observed real autonomy."
    ],
    "automated_tests": "test_swarm.py; swarm_check.py actual Windows execution and synthetic browser evidence",
    "manual_tests": [
      "Review actual account sign-in where needed",
      "Check source/data assumptions",
      "Restore one real non-secret memory file"
    ],
    "expected_output": "New PRACTICE mission artifacts, reviewed local approval and report; real Stage 6 gate remains distinct.",
    "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": "Build Your Own Swarm Bot Army | BuildBotsBetter",
    "SEO_description": "Build and test a working PRACTICE coordinator, talent database, parallel workflow, recovery, memory, monitoring and human release gates; prepare an honest real-team transition.",
    "SEO_keywords": [
      "swarm bots",
      "mission coordinator",
      "bot talent database",
      "human oversight"
    ],
    "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": {
    "status": "Checks recorded separately after generation",
    "independence": "Shared brief and own prior player only; no peer build folders read",
    "claims": "No self-A or live swarm claim",
    "coverage": "13 lessons / 26 steps; one foundation lesson, twelve build/test lessons; all 30 shared specification output categories represented in meta, lessons, architecture, major_features, dashboard, capstone and graduation.",
    "peer_repair": "2026-10-14: step markers, failure rejection, distinct quizzes, plain definitions, targeted FAQs and clearer expected CLI rejections; fresh regression evidence stored separately."
  },
  "sources": [
    {
      "title": "Shared user swarm brief: retained verbatim snapshot",
      "url": "source-user-brief.md"
    },
    {
      "title": "Python concurrent futures documentation",
      "url": "https://docs.python.org/3/library/concurrent.futures.html"
    },
    {
      "title": "Python SQLite documentation",
      "url": "https://docs.python.org/3/library/sqlite3.html"
    },
    {
      "title": "Python local HTTP server documentation",
      "url": "https://docs.python.org/3/library/http.server.html"
    }
  ],
  "known_uncertainties": [
    "PRACTICE only: workers are deterministic functions, not AI models.",
    "Planner handles supplied-note guides/checklists through a fixed recipe; arbitrary mission understanding is unsupported.",
    "Mechanical grading is not factual, creative or peer AI quality validation.",
    "Real automatic AI dispatch, authentication, externally enforced budgets and permissions are not implemented; handoff is supervised.",
    "Windows kit/browser checks are tested by the author. Independent reviewer grok_bot tested Linux bash/Python and Windows PowerShell 5.1 on the r4 archive in October 2026. macOS execution remains untested; reviewer Linux evidence does not certify later changed code.",
    "No paid usage, image/video creation, live BOTS integration or published content is claimed.",
    "Walkthroughs are text/narration outlines, not rendered videos; Buzz is offline reviewed help."
  ],
  "course_promise": "Build and test a working PRACTICE coordinator, talent database, parallel workflow, recovery, memory, monitoring and human release gates; prepare an honest real-team transition.",
  "already_have": [
    "A computer, Python 3.10+ and a terminal; prior bot-fleet infrastructure is optional."
  ],
  "modules": [
    {
      "module_id": "M01",
      "title": "Foundation and the leap",
      "lesson_ids": [
        "L01"
      ]
    },
    {
      "module_id": "M02",
      "title": "Coordinator and mission setup",
      "lesson_ids": [
        "L02",
        "L03"
      ]
    },
    {
      "module_id": "M03",
      "title": "Discovery and competition",
      "lesson_ids": [
        "L04",
        "L05"
      ]
    },
    {
      "module_id": "M04",
      "title": "Monitoring and parallel execution",
      "lesson_ids": [
        "L06",
        "L07"
      ]
    },
    {
      "module_id": "M05",
      "title": "Failure recovery",
      "lesson_ids": [
        "L08"
      ]
    },
    {
      "module_id": "M06",
      "title": "Resource limits and shared memory",
      "lesson_ids": [
        "L09",
        "L10"
      ]
    },
    {
      "module_id": "M07",
      "title": "Verification and human approval",
      "lesson_ids": [
        "L11"
      ]
    },
    {
      "module_id": "M08",
      "title": "Real-team transition and capstone",
      "lesson_ids": [
        "L12",
        "L13"
      ]
    }
  ],
  "architecture": {
    "flow": [
      "human mission",
      "bounded coordinator",
      "observed talent",
      "dependency-aware workers",
      "independent verifier",
      "human approval",
      "final report"
    ],
    "memory": "Append-only SQLite observations and unique JSON mission reports",
    "message_system": "Timestamped local report messages; existing BOTS hub remains separate"
  },
  "major_features": [
    {
      "what": "Start the kit safely",
      "why": "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library.",
      "how": "The first setup step should prove the smallest component works before building the rest. The free kit needs Python 3.10+ and only its standard library.",
      "setup": "Download Resources, extract into a new folder named bbb-swarm-practice outside any shared agent folder, and open that folder in a terminal. All later commands run in this extracted folder. Windows: Shift+right-click the folder and Open in Terminal. macOS/Linux: open Terminal and use cd followed by the folder path in quotes. Run the version command. If Python is absent, use your existing Python setup course or ask a helper to install it; do not install packages or create paid accounts for this exercise.",
      "test": "DOCTOR PASS appears; no credential or network is required.",
      "what_can_go_wrong": "ImportError or SQLite unavailable.",
      "fix": "Confirm all downloaded files are in the same extracted folder, and use a standard Python 3.10+ installation."
    },
    {
      "what": "Give the manager a mission",
      "why": "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs.",
      "how": "A mission says the outcome, resources, success conditions and boundaries. It does not assign permanent people to jobs.",
      "setup": "Open mission.json in a text editor. Find MISSION, OBJECTIVE, CONSTRAINTS, AVAILABLE RESOURCES, SUCCESS CRITERIA and APPROVAL RULES. The supplied source notes are invented and labelled. Human approval covers local release only. Run plan.",
      "test": "CONTRACTS PASS appears.",
      "what_can_go_wrong": "A test unexpectedly accepts an invalid mission.",
      "fix": "Stop. Compare your guardrails.py with the reviewed kit and do not add real credentials or broaden permissions."
    },
    {
      "what": "Discover skills through work",
      "why": "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence.",
      "how": "An audition means giving comparable test work to several workers. Skill claims begin unknown. Reputation is not evidence.",
      "setup": "Run audition. Amber, Blue and Coral each attempt research, planning, writing and testing against the same input. The grader checks source preservation, outline structure, draft shape and review outcome. It records actual elapsed time, errors and pass/fail. Scores of 0 or 100 mean structural fixture performance only.",
      "test": "Each skill has measured PRACTICE profiles; tokens are not invented.",
      "what_can_go_wrong": "Profiles appear empty or claim real brand skills.",
      "fix": "Run audition first. Keep REAL_OBSERVED receipts separate; a fixture result cannot establish Claude, Codex or Grok capability."
    },
    {
      "what": "Compete, rank, then select",
      "why": "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits.",
      "how": "An important job can justify a short contest. Compare identical work blind, grade it, then choose the worker that meets your minimum quality within resource limits.",
      "setup": "Read selection_score in coordinator.py and your talent output: 70% quality, up to 25 reliability points, and up to 5 speed points. Require quality at least 50. Costs are equally zero in this kit, so money does not distinguish workers. A live selector must reject unknown usage when a hard budget is required; among qualified candidates compare measured cost, speed and quality with a declared policy.",
      "test": "Another twelve observations are recorded and rankings are recomputed.",
      "what_can_go_wrong": "A favorite worker remains best forever despite new failures.",
      "fix": "Check that selection reads recent observations, not a hard-coded agent brand score."
    },
    {
      "what": "Watch the mission dashboard",
      "why": "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide.",
      "how": "Mission Control answers what is running, what is waiting, how much resource has been used and what the human needs to decide.",
      "setup": "In a second terminal in the same extracted folder, start dashboard.py. It binds only 127.0.0.1 and chooses an available port automatically. Open the printed URL, not a guessed port. Leave the terminal open; Ctrl+C stops it. Before the first mission, Waiting is expected.",
      "test": "The dashboard labels its PRACTICE scope, and you know how to inspect message history for quick tasks.",
      "what_can_go_wrong": "You do not see a brief running state.",
      "fix": "Read the assigned and parallel_wave messages. A two-second monitor is not proof that tasks did not overlap."
    },
    {
      "what": "Let dependencies choose the order",
      "why": "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs.",
      "how": "Research and planning can happen together. A writer needs both results. A reviewer waits for the draft. This is the difference between parallel work and racing ahead with missing inputs.",
      "setup": "Run the mission once. Watch the monitor or open state/dashboard.json afterward. The coordinator chooses workers dynamically, keeps one assignment per worker per wave, runs independent tasks concurrently, sends results forward, grades outputs and waits at approval. It manages work instead of doing all jobs itself.",
      "test": "SWARM TEST PASS includes overlap, dependency order and independent review.",
      "what_can_go_wrong": "A wave contains one task or writing begins too early.",
      "fix": "Keep parallel_workers at two and qualified different workers available. Read depends fields; simultaneous dispatch alone is not proof of overlap."
    },
    {
      "what": "Recover without endless loops",
      "why": "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again.",
      "how": "One failed worker should not end the mission. Detect the cause, decide whether a bounded repair is sensible, request a different qualified worker, and verify again.",
      "setup": "Run with --inject crash. The first writing attempt fails on purpose. The coordinator records the error, lowers that observed skill result, tries a different qualified worker and verifies the replacement. No worker is blamed for a real crash: this failure is injected PRACTICE.",
      "test": "Timeout, malformed-output recovery and exhausted-attempt blocking checks pass.",
      "what_can_go_wrong": "The system reports completion despite an empty draft.",
      "fix": "Require mechanical verification plus independent content review. Never call a worker response a success just because its process exited zero."
    },
    {
      "what": "Manage usage as part of intelligence",
      "why": "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions.",
      "how": "Choosing a worker involves quality, reliability, speed and resource availability. Resource intelligence needs measurements and stop conditions.",
      "setup": "Open the latest report usage object. It records task count, successful tasks, failures, retries, tool calls, elapsed seconds, images/videos and zero billed practice dollars. Tokens are null, with a reason. In BBB, agents also report plan usage daily and at 90%+ leave the grading queue until reset. Local runtime is measured; model token and subscription measurements need an actual provider receipt.",
      "test": "Tool-call and runtime stop cases remain unapproved.",
      "what_can_go_wrong": "Budget exceeded or a stopped report says completed.",
      "fix": "Stop real dispatch until an adapter enforces per-call ceilings, process timeouts and unknown-usage handling. A threads timeout cannot kill arbitrary work."
    },
    {
      "what": "Build Bot Better: keep and restore swarm memory",
      "why": "Individual memory is one worker remembering its own notes. Swarm memory is shared evidence about missions, strategies, worker performance, failures and verified results.",
      "how": "Individual memory is one worker remembering its own notes. Swarm memory is shared evidence about missions, strategies, worker performance, failures and verified results.",
      "setup": "Close and reopen a terminal, then run memory and talent. Reports live under state/<run-id>, the SQLite talent database persists observations, and recent failures influence the next selection. Each run ID prevents overwriting earlier missions. This local JSON message log is a practice stand-in for the existing BBB Conversation Hub, not an automatic BOTS integration.",
      "test": "RESTORE PASS reports matching hashes; original state is still present.",
      "what_can_go_wrong": "SQLite copy taken during a write or backup stored beside a failing disk.",
      "fix": "Quiesce writers before this drill. Use SQLite backup for live systems; maintain separately protected, versioned backups. Never recursively delete a user profile."
    },
    {
      "what": "Verify, grade and approve the bytes",
      "why": "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision.",
      "how": "Testing checks observable conditions. Grading weighs quality. Verification compares output with mission evidence. Approval is a separate human decision.",
      "setup": "Open state/<run-id>/draft.json and report.json using the run ID printed by run. Confirm source IDs and exact note preservation, a different reviewer, all grades and no failed tasks. Read source accuracy and usefulness yourself: fixture structural scores cannot prove factual correctness, creativity or whether your own success criteria were understood.",
      "test": "APPROVAL PASS; approved.json exists only in the chosen run folder.",
      "what_can_go_wrong": "Hash mismatch or state is not awaiting approval.",
      "fix": "Reopen current draft bytes. If tampered, rerun the mission for fresh verification. Do not force approval or edit the verification flag."
    },
    {
      "what": "Connect to your real AI team honestly",
      "why": "Move from the prototype to observed real work gradually. Use your own worker identities, project journal and reviewed handoffs. This practice lab does not require a shared fleet or grading service.",
      "how": "Move from the prototype to observed real work gradually. Use your own worker identities, project journal and reviewed handoffs. This practice lab does not require a shared fleet or grading service.",
      "setup": "Run handoff prepare. It emits task tickets with mission, dependencies, identical blind audition instructions and a return contract. Give the first research/planning auditions independently to at least two personally authorized signed-in workers. Human dispatch is required; this command does not call AI, read SQL passwords or post as another identity. In BBB, each worker should post under its own authenticated login; do not borrow credentials.",
      "test": "An actual completed receipt imports into live-evidence/observations.jsonl; an unfilled template correctly fails.",
      "what_can_go_wrong": "Template fails validation or someone invents usage to pass.",
      "fix": "Keep missing facts unknown. Obtain actual evidence and review; never fill an agent name, artifact or score merely to make the command pass."
    },
    {
      "what": "Give the swarm an unseen mission",
      "why": "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it.",
      "how": "Final practice uses one new contract and no manual worker assignments. Real autonomous graduation requires a separately reviewed live adapter and observed fresh mission; this kit does not grant it.",
      "setup": "Copy mission.json to capstone.json in your editor. Invent a new topic not used in the club sample, set deliverable to checklist, replace every source note with permitted accurate notes, and write your objective and success criteria. Keep the zero-spend local constraints. Human supplies mission/constraints/success criteria and resources, but never writes task assignments. Run auditions on the new notes, then launch with bad-output to require recovery.",
      "test": "PRACTICE graduation evidence is complete; real autonomy limits remain explicit.",
      "what_can_go_wrong": "A certificate is awarded because all browser boxes are checked.",
      "fix": "Export your evidence; inspect actual reports and artifacts. Browser completion verifies input shape only. Ask whether tomorrow's mission can be trusted within demonstrated boundaries, not beyond them."
    }
  ],
  "honesty_limits": "Windows r8 practice tests are separate from independent reviewer Windows/Linux r4 and r7 observations; r8 Linux extracted practice-suite execution passed (receipt records ZIP hash); macOS and a full r8 Linux card-by-card learner walk remain untested. No real general autonomous AI dispatch is implemented.",
  "dashboard_requirements": [
    "mission status",
    "available and active workers",
    "queued/current/completed/failed/blocked tasks",
    "skills and observed performance",
    "elapsed time",
    "unknown tokens explicitly null",
    "measured local cost and cost basis",
    "messages",
    "errors",
    "retries",
    "verification",
    "progress",
    "approval state"
  ],
  "graduation_criteria": {
    "practice": [
      "Build a mission contract with enforceable local boundaries.",
      "Measure skills with blind auditions and explain worker selection.",
      "Prove task dependencies, actual overlap and independent review.",
      "Recover failures while respecting resource limits.",
      "Retain and restore shared mission memory.",
      "Review verified bytes and distinguish PRACTICE from observed real autonomy."
    ],
    "real_stage_5": "Actual authenticated workers and reviewed artifacts with measured auditions and supervised handoffs",
    "real_stage_6": "Automatic real dispatch and general mission planning within verified external bounds on a fresh mission; not certified by this kit"
  },
  "checkpoint_revision": "r13-20261017",
  "optional_fleet_notes": {
    "title": "Integrate your own team gradually",
    "body": "Keep a task list, a dated work journal and separate authorized worker identities. Start with supervised handoffs and independent review. Demonstrate automatic dispatch before claiming a real autonomous swarm."
  },
  "version_history": [
    "2026-10-14 EDT | chatgpt_codex | seven peer learning/evidence findings repaired; fresh regression required."
  ]
}
