{
 "schema_version": 2,
 "generated_utc": "2026-09-14T07:23:34Z",
 "label": "ASAP edition (2026-09-01)",
 "runbook_version": "2026-09-14.8",
 "source_sha256": "9dad48b882a79dacf1c8093f759ea190679bf1b42489a4841890951a12b2508d",
 "authority_note": "Publication runbook, ASAP edition, 2026-09-01. Version 2026-09-14.8. Requirements only; current course positions are re-earned from the per-course plans.",
 "route": [
  "content",
  "p3",
  "p5",
  "p6",
  "p7",
  "p8"
 ],
 "bar": {
  "strict_pass_min": 0.95,
  "severe_fails": 0,
  "final_run": "cold",
  "all_checkers_executed": true,
  "confirm": "Josh"
 },
 "phases": [
  {
   "id": "p0"
  },
  {
   "id": "p12",
   "name": "tree-and-pricing",
   "state": "done-all-four",
   "verify": "Blueprint predicates and each child plan's live state, re-earned from the owning repository's current main."
  },
  {
   "id": "p3",
   "name": "bank-gates",
   "verify": [
    "phase-bank-validation skill (answer-shape + key balance)",
    "QTI parse + assertions (original \u00a73.6) \u2014 NOT skippable: LearnWith marks a failed embedded item COMPLETE"
   ]
  },
  {
   "id": "p4"
  },
  {
   "id": "p5",
   "name": "publish-dark",
   "steps": [
    "bank-gates",
    "assets-qti",
    "images",
    "tree",
    "drift-preflight",
    "OWNER_WORD",
    "push-dark",
    "verify-live",
    "post-push",
    "xp",
    "evidence-bundle"
   ],
   "verify": [
    "verify-live readback reconciles push bundle exactly (APES pub_stage7_verify_live.py pattern)",
    "publishStatus == testing",
    "enrollments == 0",
    "evidence bundle README in course repo (Bio/APES format)",
    "every native write carries three receipts under one sealed plan digest: capture prior state (zero writes), execute with readback, replay with zero writes (restored from the cut list 2026-09-14)",
    "one writer per course surface, enforced by the writer lock; operator PR lands before the seal PR"
   ],
   "shape": "one course holds all units (APES: unit 1 mints, later units pin --course-id)"
  },
  {
   "id": "p6",
   "name": "live-qc-gauntlet",
   "instrument": "fleet course-QC harness (APES reports/step5_courseqc/ job pattern) \u2014 reuse, don't build",
   "loop": "judge -> remediate (1-repair/2-regenerate) -> re-push -> re-judge until bar",
   "repush_rules": [
    "denylist: every QC-dropped ID recorded at drop time; push tooling refuses denylisted IDs",
    "drift: never re-push a tree that mismatches last verified state (APES pub_preflight_drift.py)"
   ],
   "triage_classes": [
    "content",
    "context",
    "checker",
    "provider",
    "selection"
   ],
   "receipt_required": [
    "job_id",
    "course_id",
    "request_body_sha256",
    "submitted_at",
    "terminal_at",
    "status",
    "per_checker_status_all_five_executed_or_errored",
    "pass_rate",
    "llm_questions_checked",
    "llm_cache_hits",
    "llm_cache_dir",
    "cold_or_warm",
    "s3_report_keys_sha256",
    "cold_route_A_or_B"
   ],
   "final_run": "cold",
   "all_checkers_executed": true
  },
  {
   "id": "p7",
   "name": "walk-and-accept",
   "verify": [
    "factory walkthrough PASS on the staging deployment after the reversible flag PR (answers save; feedback choice-specific, non-leaking; keys unskewed)",
    "one human pass: start/middle/end + longest reading + each writing geometry",
    "XP spot-check: <80%=0, >=80%=base once, 100%=1.25x once, reload adds nothing"
   ],
   "account": "ONE owner test account, enrolled additively"
  },
  {
   "id": "p8",
   "name": "demo-and-flip",
   "verify": [
    "Ilma demo done from test account",
    "her word recorded",
    "then broader enrollment"
   ]
  }
 ],
 "stages": [
  {
   "id": "p0",
   "name": "CUT",
   "state": "cut",
   "contract_status": "CUT",
   "required_artifacts": [],
   "automated": false
  },
  {
   "id": "p12",
   "name": "tree-and-pricing",
   "state": "done-all-four",
   "contract_status": "DONE_ALL_FOUR",
   "required_artifacts": [
    "Blueprint predicates and each child plan's live state, re-earned from the owning repository's current main."
   ],
   "automated": false
  },
  {
   "id": "p3",
   "name": "bank-gates",
   "state": "required",
   "contract_status": "REQUIRED",
   "required_artifacts": [
    "phase-bank-validation skill (answer-shape + key balance)",
    "QTI parse + assertions (original \u00a73.6) \u2014 NOT skippable: LearnWith marks a failed embedded item COMPLETE"
   ],
   "automated": false
  },
  {
   "id": "p4",
   "name": "CUT",
   "state": "cut",
   "contract_status": "CUT",
   "required_artifacts": [],
   "automated": false
  },
  {
   "id": "p5",
   "name": "publish-dark",
   "state": "required",
   "contract_status": "REQUIRED",
   "required_artifacts": [
    "bank-gates",
    "assets-qti",
    "images",
    "tree",
    "drift-preflight",
    "OWNER_WORD",
    "push-dark",
    "verify-live",
    "post-push",
    "xp",
    "evidence-bundle",
    "verify-live readback reconciles push bundle exactly (APES pub_stage7_verify_live.py pattern)",
    "publishStatus == testing",
    "enrollments == 0",
    "evidence bundle README in course repo (Bio/APES format)",
    "every native write carries three receipts under one sealed plan digest: capture prior state (zero writes), execute with readback, replay with zero writes (restored from the cut list 2026-09-14)",
    "one writer per course surface, enforced by the writer lock; operator PR lands before the seal PR",
    "one course holds all units (APES: unit 1 mints, later units pin --course-id)"
   ],
   "automated": false
  },
  {
   "id": "p6",
   "name": "live-qc-gauntlet",
   "state": "required",
   "contract_status": "REQUIRED",
   "required_artifacts": [
    "denylist: every QC-dropped ID recorded at drop time; push tooling refuses denylisted IDs",
    "drift: never re-push a tree that mismatches last verified state (APES pub_preflight_drift.py)",
    "job_id",
    "course_id",
    "request_body_sha256",
    "submitted_at",
    "terminal_at",
    "status",
    "per_checker_status_all_five_executed_or_errored",
    "pass_rate",
    "llm_questions_checked",
    "llm_cache_hits",
    "llm_cache_dir",
    "cold_or_warm",
    "s3_report_keys_sha256",
    "cold_route_A_or_B",
    "fleet course-QC harness (APES reports/step5_courseqc/ job pattern) \u2014 reuse, don't build",
    "judge -> remediate (1-repair/2-regenerate) -> re-push -> re-judge until bar"
   ],
   "automated": false
  },
  {
   "id": "p7",
   "name": "walk-and-accept",
   "state": "required",
   "contract_status": "REQUIRED",
   "required_artifacts": [
    "factory walkthrough PASS on the staging deployment after the reversible flag PR (answers save; feedback choice-specific, non-leaking; keys unskewed)",
    "one human pass: start/middle/end + longest reading + each writing geometry",
    "XP spot-check: <80%=0, >=80%=base once, 100%=1.25x once, reload adds nothing",
    "ONE owner test account, enrolled additively"
   ],
   "automated": false
  },
  {
   "id": "p8",
   "name": "demo-and-flip",
   "state": "required",
   "contract_status": "REQUIRED",
   "required_artifacts": [
    "Ilma demo done from test account",
    "her word recorded",
    "then broader enrollment"
   ],
   "automated": false
  }
 ],
 "asap_stages": [
  {
   "id": "align",
   "label": "Align",
   "letter": "A",
   "native_phases": [
    "p12"
   ],
   "summary": "Know the whole course before choosing the next step.",
   "scope": "Reconcile the current population census, blueprint, curriculum coverage, teaching design, tree and pricing.",
   "proof": "Every applicable population has a current inventory and a course-owned requirement. Earlier courses grant a new course no completion credit.",
   "skills": [
    "ap-toolbox",
    "course-deficit-burndown",
    "reverse-engineer"
   ],
   "tools": [
    "Native census and blueprint selectors",
    "Course-owned source and teaching contracts"
   ]
  },
  {
   "id": "synthesize",
   "label": "Synthesize",
   "letter": "S",
   "native_phases": [
    "content",
    "p3"
   ],
   "summary": "Create and accept every required content population.",
   "scope": "Author and repair content, verify items and complete forms, and satisfy native bank and QTI checks.",
   "proof": "Acceptance is measured separately for each population. A gate-bank PASS does not prove practice, writing, media or whole-course readiness.",
   "skills": [
    "item-pipeline",
    "item-regen",
    "factory-batch-dispatch",
    "enrichment",
    "phase-bank-validation"
   ],
   "tools": [
    "Current native generation and item QC",
    "Whole-form and population validators"
   ]
  },
  {
   "id": "assemble",
   "label": "Assemble",
   "letter": "A",
   "native_phases": [
    "p5"
   ],
   "summary": "Connect accepted content to the learner experience.",
   "scope": "Compile native assets and use the course-owned publication route with exact readback, media, structure and XP evidence.",
   "proof": "Integrated, published and served coverage require their own receipts. Partial publication does not establish complete assembly.",
   "skills": [
    "native-assets-build",
    "publish-course-dark",
    "land-a-change",
    "100"
   ],
   "tools": [
    "Course-owned asset and QTI compilation",
    "Native publisher and exact served readback"
   ]
  },
  {
   "id": "prove",
   "label": "Prove",
   "letter": "P",
   "native_phases": [
    "p6",
    "p7",
    "p8"
   ],
   "summary": "Verify the final course and retain required human decisions.",
   "scope": "Final cold course QC, native learner acceptance, the human walkthrough and the recorded release decision.",
   "proof": "Use the native cold-QC bar and checker evidence, learner and XP readbacks, and the required human acceptance. A phase label cannot grant release authority.",
   "skills": [
    "course-qc-gauntlet",
    "100"
   ],
   "tools": [
    "Native course QC and learner acceptance",
    "Course-owned walkthrough and release decisions"
   ]
  }
 ],
 "population_scope": [
  "Gate MCQs",
  "Practice",
  "PowerPath / PP100",
  "Unit assessments",
  "Mock / exam forms",
  "Articles",
  "Embedded checks",
  "Videos / media",
  "Writing activities",
  "Writing scoring",
  "Train Your Eye"
 ],
 "courses": {
  "humgeo": {
   "label": "AP Human Geography",
   "current_stage": "p5",
   "state": "ASSEMBLE / DARK RUN STOPPED, OWNER DECISION OPEN",
   "as_of": "2026-09-11T09:05:36Z",
   "detail": "Dark publication execute stopped on 2026-09-10T21:55:02Z when TimeBack returned HTTP 422 for resource metadata type web_application. 9,654 of 12,552 planned rows were written (course, class, components, QTI items and tests, 204 QTI resources); 1,201 web_application resources and 1,551 links are unwritten. Since the stop, the v3 native namespace re-cut and digest seal landed (humgeo-rebuild #93, ap-one #1083) and a bounded read-only publication preflight landed (ap-one #1084). The owner decision on the 422 stop (undo and re-run under v3, a platform ask, or a one-row probe) is open. No live course acceptance is established.",
   "priority": 1
  },
  "apwh": {
   "label": "AP World History",
   "current_stage": "p3",
   "state": "GATE BANK PASS / PUBLICATION PREP ON OWNER DECISIONS",
   "as_of": "2026-09-11T09:05:36Z",
   "detail": "The final gate-bank and mock update landed in ap-one #1037 on 2026-09-08 and staging serves it. No APWH source repository has moved since: apwh-blueprint-build main is still 568985f6 (2026-09-08). Publication preparation (s6) waits on four open owner decisions: the one-boundary-check-per-article profile rule, funding the 176 boundary-check package or publishing dark without embedded checks, the inline Train Your Eye dialect, and opening the ap-one PR for the offline asset emitter and publication planner. Full p3 completion, dark publication, cold QC and learner acceptance are not established.",
   "priority": 2
  },
  "apush": {
   "label": "AP US History",
   "current_stage": "content",
   "state": "SYNTHESIZE / ACCEPTANCE AND RELEASE HOLDS",
   "as_of": "2026-09-11T09:05:36Z",
   "detail": "APUSH remains in content synthesis. Re-read on 2026-09-11 with both source repositories unmoved: the article-acceptance ledger at apush-build-outputs 98842f41 records 49 accepted (36 by legacy dual review, 13 by server strict mode) and 200 pending across 249 positions; units 4, 6, 7 and 8 have zero accepted records. PIPELINE.md at apush-course-build 319e0777 retains pre-publication status. The prior release/admission holds remain visible; they do not remove APUSH from the content stage.",
   "priority": 3
  },
  "psych": {
   "label": "AP Psychology",
   "current_stage": "p5",
   "state": "PARTIAL PUBLICATION THROUGH UNIT 4",
   "as_of": "2026-09-11T09:05:36Z",
   "detail": "Committed receipts now extend partial publication through Unit 4. The Unit 4 component tree was pushed to TimeBack from commit ab3db64b (234 created, 0 failed in publish_audit.jsonl; PR #128). Unit 3 render fixes U3-46 and U3-47 were re-pushed on 2026-09-10. Unit 5 is generated and gated through phase 3b (PR #137, 2026-09-11) but its README states nothing in it is published. Full-course dark readback, enrollment state, cold QC and learner acceptance remain UNMEASURED.",
   "priority": "parallel"
  }
 }
}
