Status: Canonical. Supersedes and merges three prior sources:
What changed in v2.0–2.1: added filename-as-ground-truth and serial/continuity handling (Phase 4); added Validation & QA (Phase 4.5) and Versioning & Rollback (Phase 4.6); added data contracts, a reusable curation toolkit, an explicit division of labor between human / Claude / agents, and an enrichment-layer module. Restructured every phase into a fixed shape (Purpose / Inputs / Work / Owner / Exit criteria / Failure modes) so it can be executed rather than only read. v2.1 separated required-when-triggered modules from optional enhancements, softened the source-permanence claim, reframed Phase 9 as a gate with a measurable pass threshold, and renumbered sections to Parts A–K to end the Phase-N / section-N collision.
What changed in v2.2: closed the overdue maintenance-rule gap from the update-10 catalog-rebuild session. Added durable-storage discipline for in-progress curation artifacts, not just versioned documents (Phase 4.6). Extended filename-as-ground-truth to grouping and matching, not only parsing (F.5). Added explicit scope-recording for bounded repairs that touch records with other parseable-but-untouched fields (Phase 4.5). G.6 effort estimates, the single-domain intake-profile gap, and the Chandu the Magician untagged episodes remain open (Part K).
What changed in v2.3: corrected two internal contradictions surfaced while extracting an execution runbook from this document. (1) The of rule (E.1, F.5) previously authorized of = chapter count whenever held chapters were gap-free and cadence-continuous — but gap-free holdings are not evidence of a complete arc, only of contiguous holdings. of now requires an authoritative total from a source outside the filenames. F.6 entry-point selection is corrected as the direct consequence. (2) Show-identity provenance and episode-title/date provenance were conflated: Phase 4 declares filenames ground truth while F.2 selected canonical names from the published title field. These are now separated explicitly — show identity comes from authoritative program metadata, episode title and date come from filenames.
What changed in v3.0: four radios are finished (Radio Box, Plant Radio, The Baseball Box, KFOG Radio), and KFOG Radio was built in two days by reusing the Plant Radio engine with only data, labels, and copy changed. v3.0 adds Part L, the Radio Kit: a radio is now treated as engine plus catalog plus skin, the Part B charter gives way to a short Radio Brief for Internet Archive audio radios, and the build becomes an eight-step pipeline with a standard Airtable shape, a rights posture for archive-hosted audio, an acceptance test, the KFOG data traps, Lovable delivery rules, and the next structural step (a config-driven deck). G.6 effort is recalibrated in L.9.
What changed in v2.4: added two rules to Phase 7 from a Radio Box interaction and link-sharing session. (1) State integrity. Surfaces must derive from one canonical status value rather than a correlated proxy. A per-listing badge reading a paused boolean displayed PAUSED throughout the connect window while the bezel, reading the status value, correctly displayed TUNING. Adds the state table as an extension of the Phase 2 state-color map, the requirement to name the transitional wait in the device's voice, and aria-live on status regions. (2) Distribution. Route-level social preview metadata is now a Box requirement. A Box route inherits its parent domain's default social card unless it declares its own with absolute URLs, and third-party preview caches are keyed per URL and outlive a deploy.
This is a template, not a narrative. It has three kinds of content:
| Marker | Meaning |
|---|---|
| Plain text | Fixed. Applies to every Box. Don't re-derive it. |
| ⟨angle brackets⟩ | Fill in per project. Copy the charter in Part B and complete it. |
| Module | Choose per project. Part H optional enhancements are opt-in; skip freely. |
The rule that makes it durable: when a build teaches you something, decide whether it is fixed, per-project, or a module — then write it into the right place here. A lesson that stays in a chat transcript is a lesson you will pay for twice.
Provenance discipline. Every numeric threshold in this document came from a real build. Where a number is a starting default rather than a measured result, it says so. Don't treat defaults as findings.
Copy this block per Box. If you cannot complete it in one sitting, you are not ready to build.
For an audio radio sourced from the Internet Archive, use the Radio Brief in L.1 instead. This charter remains the tool for a new medium or a new kind of Box.
BOX NAME: ⟨e.g. Radio Box, Rockbox, Newsreel Box⟩
SUBJECT: ⟨concrete, not categorical⟩
AUDIENCE: ⟨who the raw archive fails, and why⟩
PRIMARY SOURCE(S): ⟨institution + collection identifier⟩
KILL QUESTION: ⟨the one technical unknown that ends the project if the answer is no⟩
KILL ANSWER: ⟨answer + the actual API call/URL that produced it⟩
SCALE CHECK: ⟨how many candidate items exist; how counted⟩
MEDIUM: ⟨audio / video / image / text / mixed⟩
DEVICE METAPHOR: ⟨the period object the interface embodies, if any⟩
SUCCESS CRITERION: ⟨one target user completes the core loop uncoached, with
zero critical failures — see Phase 9⟩
MODULES IN SCOPE: ⟨from Part H⟩
OUT OF SCOPE (v1): ⟨written down so it stops being relitigated⟩