Incept Course Builder — Spec Sheet

Version2026-09-14.13 (package); contract 2026-09-14.8
DirectionThe whole install is one deterministic script that acts on its inputs toward one goal, a live course. Every run with the same inputs takes the same path. A model is used only where a procedure row cannot decide, and then it reports why and proposes the next step.
StatusWorking spec. Changes after the first course ships through it.
ProductOne command installs a local workspace and dashboard on macOS; any tool-capable agent then builds one course through four steps on Alpha's native factory.
UsersThe course owner first; every authorized Alpha builder next. No person names, no one user's history, no one machine's paths anywhere in the package.
Not in scopeA second generator, judge, publisher, scheduler or gate. Course, spend or release authority. Any per-user firewall or zone tooling.
Governing routeThe ASAP publication runbook, in plain names: align (blueprint, tree, pricing), content, bank gates, publish dark, cold QC, walk and accept, demo and open. Phase ids appear only in machine files.

Readers: a builder deciding whether to install; an agent deciding what to do next. Both read the same rows.

1. The method

You build a course the way a good teacher does. Decide what students must know, write the test, map the units, write lessons that get students past the test, then put it in front of them. The Course Builder is that method installed, with the factory doing the heavy lifting and a receipt closing each step.

StepTeacher languageFactory phaseCloses when
0Onboard and discoversetup, alignMission recorded; credentials inventoried by name; every content family counted or marked UNMEASURED; existing material located
1Standards, essential knowledge, assessmentsalignBlueprint reconciled on nine dimensions; coverage matrix has no orphan; media rule written
2Course mapalignProfile, tree and pricing exist for this course; every unit has an assessment milestone; owner launch path named
3Lessons with checkscontent, bank gatesOne lesson proven end to end; every article has its profile count of judge-passed checks; every form complete with one owner; bank gates pass on one candidate SHA
4Host and presentpublish dark, cold QC, walk and accept, demo and openPublished dark with three receipts per write; cold QC at the bar with failures triaged; owner walk and XP check; designated reviewer decision; enrollment read back

2. Requirements

R1. Deterministic loop (agent-neutral)

R2. Start from what exists

R3. Templates (so a small model fills, not designs)

ArtifactTemplateOwner
Missiontemplates/mission.json: course, framework, learners, standards, families, existing material, approved sources, release approver roleours
Intake rowtemplates/intake-rows.json: id, kind, bin, check, receipt or reasonours
Blueprintcourse-blueprint/v1.2 schema, sixteen sections, nine mandatory; lint and oraclefactory
Course profilecourse profile JSON with UNMEASURED placeholders; the tree is TimeBack's own course, components, resourcesfactory pattern
Course mapcourse-map.json built by course_map.py: units, topics, lessons, gates and milestones read from the ap-one price manifest, gate map and framework titlesours over factory data
Titlestemplates/titles.json: from the framework titles file, never inventedours over factory data
ArticleEK-Article template v1.1 and its binary rubric, pinned by repository, ref and sha256 in templates/article-template.jsonfactory
Checkstemplates/check-set.md: the check count per article is read from the course profile (article_checks.required_per_substantive_concept_article; HumGeo 5, APWH 1), one judge request per check, four options, one key, distractors from named misconceptions, rationale eachours over the judge contract
Formstemplates/form-templates.json: quiz, unit test, mock; numbers read from the blueprint and framework, never inventedours over factory data
Stimulusdata table, quoted source or figure in the shape two live courses renderfactory
Receiptstemplates/receipts/<step>.json, generated from the step table so template and validator cannot driftours
Credentialstemplates/credentials.example.env: names onlyours

R4. The numbers come from the blueprint

R5. QC embedded from the start

ArtifactCheck inside the templateRuns
Blueprintlint, nine-dimension reconciliation, coverage matrixbefore step 2
Course maporacle diff; every unit has a milestonebefore step 3
Articlerubric hard gates (accuracy, EK alignment, scope); compiler structureat authoring
Item and checkfree prescreens, then the judge; count per article from the course profileat authoring, before banking
Formanswer shape, key balance, option length, no two items from one standardbefore step 4
Videothe video skill's free batterybefore upload
Publish batchcapture, execute with readback, replay with zero writesevery write
Published coursecold course QC at the bar; walk and XPbefore release

The standard: a known-bad fixture proves each gate fires.

R6. Publication contract (publish dark through demo and open)

R7. Installer and onboarding

2b. Target architecture and what remains to rewrite

The owner's stated end state: the entire install is a deterministic script that acts on the inputs it receives toward the same goal every time, getting the course live, and uses a model only where the script cannot decide. Where the package stands against that, and the rewrite still owed:

LayerToday (2026-09-14.10)Remaining rewrite
Step order and closingnext.py orders eleven steps from receipts, refuses to skip, validates receipt shapeValidate receipt truth where a check exists: run the named oracle, judge readback or loader instead of trusting the cited ref
Procedure rowsdiscover, step 1, step 2 and the pilot carry exact run/write rows with expect and on-fail; later steps carry sources and do-listsRows for every step through demo and open, including the publish operator invocations, the cold QC submit and poll, the walk readbacks
Inputsmission.json (guided or file), credential file loaded into the environment, connection referencesRead the platform course id and source repository from the ap-one manifests automatically at discover; no onboarding question for anything the bytes hold
Owner contactmachine-composed owner_message for requests and exceptions; connection states translatedOne next.py --status --plain line for the terminal and dashboard: done, remaining, next, needs-you
Native operatorscourse-specific modules per course in ap-one (HumGeo has eight; APWH has names, not code)A generic native operation base with per-course plan producers (factory PR), so step 4 rows are the same for every course
Drafting and judginglocal drafting with templates, free prescreens, judge in parallel batches via the dispatcherA single draft-batch and judge-batch row shape wired to the dispatcher's slot filler, with the receipt written by the tool, not the agent
Dashboardglance view over the step tableRead-only; no further work until the rows above land

3. Evidence behind the spec

4. Machine summary

{
  "spec_version": "2026-09-14.13",
  "procedure_rule": "rows of run|write with expect and on_fail; exceptions via next.py --exception compose the owner message with why and next step",
  "owner_message_rule": "composed by next.py: what is needed, how to give it; no ids, hashes, codes or paths",
  "drafting_rule": "draft locally, prescreen free, judge in parallel batches; paid calls are judge calls only",
  "ask_rule": "resolve_from sources read at live main and cited per field before any owner request; next.py --request gates it",
  "route": ["content", "p3", "p5", "p6", "p7", "p8"],
  "route_names": {"p12": "align", "content": "content", "p3": "bank gates", "p5": "publish dark", "p6": "cold QC", "p7": "walk and accept", "p8": "demo and open"},
  "steps": ["onboard", "discover", "s1-blueprint", "s2-map", "s3-pilot", "s3-content", "p3-bank-gates", "p5-publish-dark", "p6-cold-qc", "p7-walk", "p8-release"],
  "loop": ["next.py", "do the card", "fill the receipt template", "next.py --close <step> --receipt <file>", "repeat"],
  "intake_bins": ["keep", "modify", "replace", "discard"],
  "write_contract": ["capture", "execute_with_readback", "replay_zero_writes"],
  "triage_classes": ["content", "context", "checker", "provider", "selection"],
  "forbidden_in_package": ["person names", "usernames", "machine paths", "external-drive paths", "credential values", "firewall steps"]
}

Source of this page: SPEC.md in the repository, rendered by bin/build-spec-page.py. Agents read the Markdown; the machine summary at the end is the contract.