# Operation Laws — A (Chapter) `R-CHP-*` · B (Blueprint) `R-BLU-*`

The invariants for the two generation operations. Grounding/identity laws are in `provenance.md` (`R-GND-*`) and referenced by id here, never restated. Numbers are `lever:*` (see `levers.json`); named primitives are defined in `vocabulary.md`. Citation keys resolve in `references.md`. Read the entry format and seam meanings in `README.md`.

`[HARD]` = breach blocks the artifact. `[SOFT]` = breach is flagged for author judgment.
Each law carries a **Grounding** line: `literature:<keys>` (rests on a verified research finding — DOIs in `references.md`), `convention` (a house delivery rule — **no theory claim**), or `content-grounded` (the content it pulls is KG-cited per row). `F§` = ACRLDS foundation section.

---

# A — Chapter Research + Sequence (`R-CHP-*`)

Covers: textbook grounding, LO brief, KG synthesis, and the chapter → journey sequence. The sequence's locked fields (`R-CHP-13`) are the contract every Operation-B run inherits.

### R-CHP-01 · Textbook is the floor, from the KG source layer &nbsp;`[HARD]`
**Law.** The chapter's textbook is resolved from the KG source-doc layer (`kg_list_source_docs` → `kg_get_source_outline` → `kg_get_source_pages`) — the **only** admissible source of the textbook. Every textbook section maps to ≥1 journey; KG-driven additions *beyond* the textbook must each cite a KG source; textbook content deliberately omitted must be explained.
**Detect.** A section with no journey in the `textbook_to_journey_map`; an addition with no KG citation; an omission with no note.
**Relax.** None. If the KG lacks the book for this curriculum, fail loud (`gap::kg_source_absent`) — the remedy is to **ingest the book into the KG source layer first** (a KG-write candidate), never a local paste. Input provenance is KG-only.
**KG.** `kg_get_source_pages`, `kg_search_sources`.
**Seam.** `prompt` + `compile` (section→journey coverage) + `kg` (textbook must exist as KG source nodes).
**Grounding.** convention (coverage discipline) · F§ (textbook-floor principle).
**Why.** "Floor, not ceiling": the textbook guarantees baseline coverage; research adds above it. Sourcing it from the KG brings the textbook under the same provenance contract as every other claim (`R-GND-05`) — so *every* input to a chapter, textbook included, is KG-grounded and auditable.

### R-CHP-02 · Terminal LO quality &nbsp;`[HARD]`
**Law.** The chapter LO is one terminal, testable student action naming the capability at chapter end. Journey LOs likewise: one testable action, achievable within `lever:time.journey_budget_minutes`, no vague verbs (understand/appreciate/know). Language formalizes progressively: informal → visual → formal term → symbol.
**Detect.** Non-behavioural verb; an LO not achievable in budget (→ split, `R-CHP-07`); an LO not decidable by observation.
**Seam.** `prompt` + `compile` (banned-verb lint).
**Grounding.** literature:`Fyfe2014` (concreteness fading — informal/concrete before formal/symbolic) · F§8.1.

### R-CHP-03 · ≥5-curriculum alignment &nbsp;`[HARD]`
**Law.** The chapter aligns to ≥ `lever:kg_retrieval.curriculum_alignment_min_count` curricula, each `{curriculum, standard_code, description}` drawn **only** from KG curriculum nodes / bridges (`R-GND-01`). If fewer have relevant standards, document the gap.
**KG.** `kg_list_los`(by curriculum), curriculum/bridge nodes.
**Seam.** `prompt` + `compile` (count + real-code check).
**Grounding.** convention (grounding breadth — defensibility beyond one syllabus).

### R-CHP-04 · Semantic, not keyword, LO binding &nbsp;`[HARD]`
**Law.** Bind a journey to a KG `lo_code` by **intent match**, not shared keywords. If the connection needs a stretch of interpretation, it is not a match → `lo_code: null` + `gap` (`R-GND-02`).
**Detect.** A binding justified only by a term collision (e.g. "table" the furniture vs "table" the data structure).
**Seam.** `prompt`.
**Grounding.** grounding-discipline (prevents the model's easiest false-positive).

### R-CHP-05 · Misconception discipline &nbsp;`[HARD]`
**Law.** Prefer KG misconception nodes (`kg_list_misconceptions`, FK-expanded from surfaced LOs). Synthesise only when the KG is thin, with a `synth_misc_*` id and `kg_write_candidate: true` (`R-GND-01/03`). Always include misconceptions the textbook itself flags (Teacher's-Note callouts), tagged with the source page.
**KG.** `kg_list_misconceptions`, `kg_lo_neighborhood`.
**Seam.** `prompt` + `compile` (id-shape + provenance).
**Grounding.** literature:`Posner1982` (conceptual change — anticipate, then accommodate) · content-grounded (KG misconception rows carry citations) · F§9.

### R-CHP-06 · Cultural / context anchors &nbsp;`[SOFT]`
**Law.** Where the curriculum mandates cultural rootedness (e.g. NCERT/NCF-SE Indian anchors — Virahanka, Brahmagupta, Ashoka Chakra, local names, native vocabulary), extract and honour those anchors. If the chapter genuinely has none, say so explicitly and why.
**Seam.** `prompt`.
**Grounding.** convention (curriculum mandate).
**Why.** A house/curriculum-specific delta the model won't reliably supply unprompted; soft because presence depends on the source.

### R-CHP-07 · Content-driven journey count &nbsp;`[HARD]`
**Law.** Journey count is derived from content, not a target: section count + page span + exercise density + the time budget. Heavy sections (> `lever:sequence.heavy_section_split_pages` pages **or** > `lever:sequence.heavy_section_split_exercises` exercises) split; light sections (≤ `lever:sequence.light_section_merge_pages` pages) merge. Total teach-time within `lever:sequence.textbook_time_tolerance_fraction` of the textbook estimate.
**Detect.** A fixed journey count independent of section metrics.
**Seam.** `prompt` + `compile` (arithmetic).
**Grounding.** convention (content-driven, not target-driven).

### R-CHP-08 · Journey atomicity &nbsp;`[HARD]`
**Law.** One clear LO per journey. A tight cluster of ≤ `lever:sequence.max_los_per_journey` atomic LOs is allowed **only** when immediately dependent (teaching one makes the next immediate). If they can be sequenced separately, they must be.
**Seam.** `prompt`.
**Grounding.** literature:`Sweller1988` (limit element interactivity — one idea at a time) · F§2.1.

### R-CHP-09 · Prerequisite ordering &nbsp;`[HARD]`
**Law.** Use KG prerequisite edges (`kg_lo_neighborhood`) to order journeys. A journey never precedes its prerequisites; a required-but-unassigned prerequisite is flagged (`no_orphan_prerequisites`), either assigned an earlier journey or explicitly marked assumed-prior-knowledge.
**KG.** `kg_lo_neighborhood`, prerequisite edges.
**Seam.** `prompt` + `compile` (topological check).
**Grounding.** convention (dependency ordering) · F§5.5.

### R-CHP-10 · Content-type rhythm + practice threading &nbsp;`[HARD]`
**Law.** A new concept always gets a **Learn** journey before a **Practice** journey; Practice is never a concept's first encounter. Practice is **threaded** through the chapter (Learn→Learn→Practice→…), not bottom-loaded. Sequence follows `lever:sequence.content_type_sequence`; distribution respects `lever:sequence.content_type_distribution_targets` (targets soft, floors/caps hard).
**Seam.** `prompt` + `compile` (ordering + distribution).
**Grounding.** literature:`Cepeda2006` (distributed practice), `Rohrer2007` (interleaving), `Roediger2006` (retrieval practice) · F§5.2.
**Why.** Practice before first teaching, and end-loaded practice, are the two recurring sequencing errors; threading follows the spacing/interleaving evidence.

### R-CHP-11 · Strand coherence &nbsp;`[HARD]`
**Law.** All journeys address the chapter's strand and scope. No adjacent-strand concept is pulled in unless a KG prerequisite edge justifies it.
**Seam.** `prompt`.
**Grounding.** convention (scope discipline).

### R-CHP-12 · Constraint conjunction &nbsp;`[HARD]`
**Law.** The time budget (`R-CHP-07`), practice threading (`R-CHP-10`), and type distribution must all hold **together**. If satisfying one breaks another, iterate the sequence until all hold — do not ship a sequence that trades one off.
**Seam.** `prompt` + `compile`.
**Grounding.** convention (multi-constraint satisfaction).

### R-CHP-13 · Locked-field discipline &nbsp;`[HARD]`
**Law.** After the sequence gate, these fields are **locked** and no Operation-B run may change them: `position`, `journey_title`, `content_type`, the journey's `lo_codes`, `cpa_phase`. Get them right here.
**Detect.** A blueprint whose journey header differs from the sequence record.
**Seam.** `compile` (diff against the sequence).
**Grounding.** convention (pipeline contract — prevents downstream desync).

### R-CHP-14 · Journey annotation completeness &nbsp;`[HARD]`
**Law.** Every journey in the sequence carries all nine annotation fields: `vocabulary_to_introduce`, `notation_to_introduce`, `misconceptions_to_address`, `false_friends_to_watch`, `tropes_expected` (⊇ the `lever:blueprint.trope_minimum_requirements` set), `cpa_phase`, `curriculum_standards`, **`textbook_examples`** (the A1 worked examples whose LO this journey owns, by page cite), **`exemplar_questions`** (likewise the A1 exercise/"Figure it Out" prompts). Empty arrays are valid; **missing fields are not**. Practice/Challenge journeys additionally carry the matching pedagogy-structure template (see `vocabulary.md §5`).
**KG.** false-friends and misconceptions via `kg_list_ai_tags` / neighbourhood.
**Seam.** `compile` (presence check).
**Grounding.** convention (data-contract completeness).

### R-CHP-15 · Formalization ceiling (scope discipline) &nbsp;`[HARD]`
**Law.** The journey LO sets the **ceiling of formalization**. The journey must not introduce content deeper than its LO on the CPA or quantitative axis — a qualitative LO must not introduce quantitative values; a "recognise" LO must not demand "construct".
**Test.** For every screen: can I justify this content from the journey LO **alone**, without a deeper formalization?
**Relax.** Content owned by a sibling journey is in-scope only when this journey is genuinely *deeper* on CPA/content-type (legitimate scaffolding vs duplication).
**Seam.** `prompt`.
**Grounding.** literature:`SweEtal1998` (over-formalization = extraneous load) · F§2.1.
**Why.** Prevents scope creep and cross-journey duplication — the model, left free, over-teaches toward the concept's full formalization.

### R-CHP-16 · Coverage closes at zero &nbsp;`[HARD]`
**Law.** Every surfaced LO code ends either **covered** by a journey or **explicitly acknowledged** (`prerequisite_assumed` / `acknowledged_extension` / `acknowledged_adjacent` / `external_curriculum_anchor`). `genuinely_uncovered` must be `0`; a non-zero count means something is wrong — investigate, don't ship.
**Seam.** `compile` (coverage audit).
**Grounding.** convention (coverage discipline).
**Note.** Coverage is a *flag-and-investigate* gate, never a *fill-to-satisfy* one — it must not reward padding (contrast the KG's own scope-completeness stubs). It closes by honest acknowledgement, not by manufacturing journeys.

### R-CHP-17 · Reconciliation vocabulary &nbsp;`[HARD]`
**Law.** When an existing journey set is present, changes are expressed **only** as `KEEP / MERGE / SPLIT / RELOCATE / INSERT / DELETE / EDIT`, each citing the KG `lo_code`(s) that justify it (`R-GND-01`). No opinion-based recommendation.
**Seam.** `prompt` + `compile` (op-enum + citation).
**Grounding.** convention (auditable edit operations).

### R-CHP-18 · TGAR cascades across the journey cluster &nbsp;`[HARD]`
**Law.** The Teach → Get → Ask → Review rhythm is realized across the **cluster of journeys** that teach a concept in the chapter — it is **not** required to complete inside a single journey. Each journey carries a `tgar_role` and typically occupies one or two phases (a Learn journey = Teach + Get; a Practice / Challenge journey = Ask + Review). The sequence must guarantee that every concept's full T → G → A → R arc completes, in order, across its journey cluster.
**Detect.** A concept whose journeys never reach Ask/Review; TGAR phases out of order across the cluster; a single 15–20 min journey forced to cram all four phases for a concept that spans several.
**Relax.** A short concept may legitimately complete TGAR within one journey — the law forbids *requiring* it, not *allowing* it.
**Seam.** `prompt` + `compile` (per-concept TGAR-arc completeness + ordering across its cluster).
**Grounding.** literature:`Cepeda2006`, `Rohrer2007` (distributing Get/Ask/Review across journeys is spacing + interleaving) · convention (the `tgar_role`↔`content_type` mapping) · F§5.2.
**Why.** Cramming T→G→A→R into every short journey fights both the time budget (`R-CHP-07`) and the spacing effect; letting the rhythm cascade lets each journey do one thing well and spaces retrieval across the chapter.

---

# B — Journey + Applet Blueprint (`R-BLU-*`)

Covers construction of one journey's screens + its applets/videos, from the locked sequence record and the KG synthesis. Consumes the `vocabulary.md` primitives; enforces conformance to them.

### R-BLU-01 · Section arc &nbsp;`[HARD]`
**Law.** The journey traverses the six sections in order (`vocabulary.md §2`, Activate→Consolidate); the arc is complete — no section silently dropped.
**Seam.** `compile`.
**Grounding.** convention (TGAR delivery structure) · F§5.2.

### R-BLU-02 · Trope conformance &nbsp;`[HARD]`
**Law.** Every trope instance conforms to its registry record (`vocabulary.md §3`): it appears where its `required-when` fires, at its `position_rule`, and — where `setup_reveal: yes` (Math_Trap, Math_Twist) — as a **setup→reveal pair**; setup and resolution never share one screen. Minimum counts per `lever:blueprint.trope_minimum_requirements`. Math_Twist is at most one per journey and never merged with Math_Trap.
**Detect.** A confrontation/anchoring trope collapsed onto a single screen; a missing required trope; a Twist merged into a Trap.
**Seam.** `compile` (via `compile_key` tags) + `prompt`.
**Grounding.** literature:`Posner1982` (Math_Trap = elicit dissatisfaction, then accommodate), `Kapur2008` (Math_Twist = productive surprise) · F§5.3, F§9.
**Why.** Collapsing setup+reveal destroys the pedagogical moment (the commitment→disconfirmation beat); the registry is the single definition, this law the single enforcer.

### R-BLU-03 · CPA sequencing &nbsp;`[HARD]`
**Law.** Concrete before Pictorial before Abstract; **never start Abstract**. Transition screens bridge phases.
**Relax.** Per content-type (`vocabulary.md §1` / `lever:blueprint.cpa_strictness`): Learn = full C→P→A; Practice may begin Pictorial but must reach Abstract; Challenge abbreviated.
**Seam.** `prompt` + `compile` (phase order).
**Grounding.** literature:`Bruner1966` (enactive→iconic→symbolic), `Fyfe2014` (concreteness fading), `Ainsworth2006` (translating across representations) · F§2.2.

### R-BLU-04 · Scaffolding arc is monotonic &nbsp;`[HARD]`
**Law.** Scaffolding follows `lever:blueprint.scaffolding_ladder` (full→partial→guided→independent) and **never increases** after being reduced; transitions are smooth at section boundaries.
**Test.** Read the `scaffolding_level` column top to bottom: a jump from `full` to `independent` signals missing intermediate screens; still `full` past Teach = hand-holding; `independent` before Review = abandoning.
**Relax.** Applet stages have their own arc under this same law.
**Seam.** `compile` (monotonicity) + `prompt`.
**Grounding.** literature:`WBR1976` (scaffolding + fading), `Vygotsky1978` (ZPD) · F§2.6.

### R-BLU-05 · Concept-prerequisite ordering &nbsp;`[HARD]`
**Law.** Introduce vocabulary and relational concepts **before** the tool or representation that uses them. Students need the language before the instrument.
**Test.** For each screen: does the student already have ALL the vocabulary/concepts needed to engage it? If not, a prerequisite screen is missing.
**Seam.** `prompt`.
**Grounding.** literature:`SweEtal1998` (unmet prerequisites spike element interactivity/load) · F§2.3.
**Why.** e.g. teach "numerator/denominator" before showing fraction bars; "variable = unknown" before algebraic notation.

### R-BLU-06 · Context coherence &nbsp;`[HARD]`
**Law.** A Learn journey uses at most `lever:blueprint.max_contexts_per_learn_journey` concrete contexts: one **primary** context runs Activate→Ask (the learning spine); at most one **transfer** context appears in Consolidate. The applet uses the primary context or a context-free representation (number line, area model) — never a brand-new scenario.
**Detect.** Different concrete contexts across sections (dice→marbles→coins→cards); a worked example that switches context before consolidation; an Exit Question in a novel context needing new domain knowledge.
**Seam.** `prompt` + `compile` (context tag count).
**Grounding.** literature:`MartonPang2006` (vary one thing, hold the background invariant), `Mayer2001` (coherence — extraneous material harms) · F§2.4.

### R-BLU-07 · Screen density ceiling &nbsp;`[HARD]`
**Law.** One major idea, one visual context, one student action per screen. If describing the screen needs more than `lever:blueprint.screen_density_max_describe_sentences` sentences, it is too dense.
**Detect.** ≥2 worked examples on one screen; teacher-mediated interactive flow in prose (an applet pretending to be a screen); setup AND reveal together; ≥2 visual models on one screen.
**Test.** Untrained first-year teacher presents it in 3 minutes?
**Relax.** Placeholder screens exempt (`vocabulary.md §6`).
**Seam.** `compile` (density signals) + `prompt`.
**Grounding.** literature:`Sweller1988` (intrinsic+extraneous load), `Chandler1991` (split-attention), `Mayer2001` (redundancy/coherence), `Mayer2009` · F§2.3.

### R-BLU-08 · Media escalation &nbsp;`[HARD]`
**Law.** Any one of these means the content **must** become an applet sandwich, not a screen: interaction language (drag/place/sort/build); ≥ `lever:blueprint.media_escalation_example_count` examples of the same reasoning; teacher-mediated interactivity; predict-then-reveal; a dense procedural flow. Multi-step procedures (≥ `lever:blueprint.procedure_to_applet_step_threshold` steps) belong in applets.
**Seam.** `prompt` + `compile` (signal scan).
**Grounding.** convention (delivery-medium routing) + literature:`Sweller1988` (offload high element-interactivity to interaction).
**Why.** These signals mark content that only *lands* through interaction; leaving it on a screen produces the "screen pretending to be an applet" failure.

### R-BLU-09 · Media sandwich &nbsp;`[HARD]`
**Law.** Every applet **and** every video is a three-screen sandwich: **context** (why, what to explore/watch-for) → **placeholder** (where it runs, duration) → **consolidation** (reconnect to the journey LO). The Snapshot trope lands on the consolidation screen. Per-medium specifics are in `vocabulary.md §6` (screen roles).
**Detect.** A placeholder without its flanking context/consolidation screens.
**Seam.** `compile` (sandwich presence).
**Grounding.** convention (integration structure) · F§7.3, F§7.4.

### R-BLU-10 · Applet purpose bound &nbsp;`[HARD]`
**Law.** An applet is placed only when **all** hold: (1) the synthesis names a specific IAS archetype, (2) a misconception needs surfacing *through interaction* (not mere statement), and (3) sufficient conceptual groundwork precedes it. Applets serve Explore / Consolidation / Practice / Assessment — **never** exposition, definition, worked examples, or trope moments (those are screens).
**Seam.** `prompt`.
**Grounding.** convention (interaction-must-encode-concept) · F§3.1.
**Why.** Applets are expensive attention; spending them on exposition wastes the interactive budget and pacing (`lever:blueprint.applets_per_journey_soft_cap`).

### R-BLU-11 · Applet stage arc &nbsp;`[HARD]`
**Law.** An applet follows the six stages (`vocabulary.md §4`, Launch→Consolidate), with its own scaffolding arc (`R-BLU-04`).
**Relax.** Content-type/node kind: an `exit_question` applet may compress to Application only; a `misconception` applet leads with the wrong intuition (see `R-BLU-19`).
**Seam.** `prompt` + `compile` (stage presence).
**Grounding.** literature:`Kapur2008` (explore/struggle before articulation), `Chi1989` (Explain stage = self-explanation) · F§6.2.

### R-BLU-12 · Construction-grade screens &nbsp;`[HARD]`
**Law.** Every applet screen carries the enrichment fields that make it buildable: `student_sees_does_thinks`, `intermediate_states` (trigger→resulting_state→visual_change), `affordances` (element + visual_cue), `variants_and_invariants` (the IAS archetype in action — what changes vs the principle that stays), `feedback` (on_correct / on_incorrect / on_partial / **on_misconception**, with exact text + timing), `time_estimate`, `transition_from_previous`. A builder implements the screen from these alone.
**Detect.** A generic `thinks: "thinks about fractions"`; missing `on_misconception` where the applet targets one; an interactive element with no discoverable affordance cue.
**Seam.** `compile` (field presence) + `prompt` (specificity).
**Grounding.** convention (buildability spec) + literature:`Hattie2007` (feedback that redirects; `on_misconception` targets the specific error) · F§3.2, F§6.4.
**Why.** This is the delta between a storyboard and a spec; it is what makes `R-BLU-20` (buildable from storyboard alone) achievable.

### R-BLU-13 · Difficulty cap by content-type &nbsp;`[HARD]`
**Law.** Difficulty progresses along `lever:blueprint.difficulty_ladder` but stays within the content-type's cap (`vocabulary.md §1` / `lever:blueprint.difficulty_cap_by_content_type`): Learn caps at `variation`; Practice/Challenge reach `transfer`. Worked examples precede independent practice.
**Seam.** `prompt` + `compile` (max-level check).
**Grounding.** literature:`SweCoop1985` (worked-example effect → fade to practice), `Chi1989` (self-explanation between) · F§5.4.

### R-BLU-14 · Screen tagging contract &nbsp;`[HARD]`
**Law.** Each screen's commitment tags — `concepts_introduced`, `concepts_reinforced`, `misconceptions_targeted`, `prerequisites_activated` — are the contract the compile pass verifies. A concept appears in `concepts_introduced` on **exactly one** screen.
**Seam.** `compile` (uniqueness + presence).
**Grounding.** convention (verification contract; single-introduction is the screen-level DRY rule).

### R-BLU-15 · Dev-note anchoring &nbsp;`[HARD]`
**Law.** Every dev-note recommendation is anchored to specific content — a screen/screen reference, or journey-wide *with enumeration*. Vague advice is forbidden.
**Detect.** A dev note with no screen/screen reference → flagged `UNANCHORED`. **GOOD:** "Screens 4 & 7: touch targets ≥ 44×44px." **BAD:** "Ensure touch targets meet accessibility guidelines."
**Seam.** `compile` (anchor scan) + `prompt`.
**Grounding.** convention (actionability).

### R-BLU-16 · Convention / false-friend materialization &nbsp;`[HARD]`
**Law.** Every KG convention flag or false-friend on the journey's LOs (`kg_list_ai_tags` / neighbourhood over the ported nodes) becomes a structured entry `{term_or_aspect, risk, mitigation, addressed_at_screen}`. The mitigation is a **concrete instructional action**, not "be careful"; a false-friend entry names the register shift explicitly (math meaning vs everyday meaning).
**KG.** ported `false_friends` + `convention_differences` nodes, FK'd to LOs.
**Seam.** `prompt` + `compile` (shape + non-vague mitigation).
**Grounding.** content-grounded (KG false-friend/convention nodes carry evidence) + convention (materialization shape).

### R-BLU-17 · Substitute-teacher self-sufficiency &nbsp;`[HARD]`
**Law.** A substitute teacher can run the whole journey using only on-screen content — every concept used is prerequisite-activated, taught here, or flagged as first encounter; no external guidance required.
**Test.** Read only the on-screen content end-to-end: any concept that appears un-activated and un-taught is a gap.
**Seam.** `prompt` + `compile` (concept-provenance sweep, ties to `R-BLU-14`).
**Grounding.** convention (facilitation model) · F§7.1.
_(De-scored from the ACRLDS module gate G4/G5 — invariant only, no score.)_

### R-BLU-18 · No robot-completable interaction &nbsp;`[HARD]`
**Law.** No applet interaction is completable without concept-linked thought — a purely mechanical tap-sequence that a robot could finish is a design failure.
**Seam.** `prompt`.
**Grounding.** convention (interaction-encodes-concept — the "razor") · F§3.1.
_(De-scored from applet gate G3.)_

### R-BLU-19 · WHY before HOW &nbsp;`[HARD]`
**Law.** The learner understands *why* before learning *how* — motivation/meaning precedes procedure.
**Relax.** A `misconception`-type applet **inverts** this by design: it exposes the wrong intuition first, then resolves it. The inversion is declared, not accidental.
**Seam.** `prompt`.
**Grounding.** literature:`Kapur2008` (explore/struggle before instruction) · F§2.5.
_(De-scored from applet gate G4 + its `applet_types` relaxation.)_

### R-BLU-20 · Buildable from storyboard alone &nbsp;`[HARD]`
**Law.** A developer can build the applet from the storyboard without calling a designer — satisfied by `R-BLU-12`'s field completeness.
**Seam.** `compile` (delegates to `R-BLU-12`) + `prompt`.
**Grounding.** convention (storyboard = state machine, dev handoff) · F§6.3.
_(De-scored from applet gate G5.)_

### R-BLU-21 · Three layers on every interactive screen &nbsp;`[HARD]`
**Law.** Every interactive screen carries all three content zones: `action_instruction` (what to do), `scaffolding_text` (hints/supports), `dev_notes` (implementation). Visible content carries the interaction without external guidance.
**Detect.** An interactive screen missing any of the three zones.
**Relax.** Placeholder screens with `<TO BE REPLACED>` markers are deployment injection points — validate the surrounding sandwich, not the marker.
**Seam.** `compile` (zone presence).
**Grounding.** convention (screen-zone separation) · F§6.4.
_(De-scored from applet gates G6/G7.)_

### R-BLU-22 · Reuse extracted assets before authoring &nbsp;`[HARD]`
**Law.** Before authoring a net-new asset of *any* kind — **lesson slide, image, applet, mcp-simulation, video** — query the KG for an existing extracted asset that already teaches the target LO (`kg_lesson_full`, `kg_list_ai_tags`). If one exists and fits, **reuse or adapt** it: cite it (`kg_tag::<asset>::<lo>` + the CMS asset id) and resolve its runnable bytes from the CMS at build time. Author net-new only when the KG has no fit, marking it `kg_write_candidate: true`. This is `R-GND-04` instantiated for the blueprint.
**Detect.** A newly-authored screen/image/applet/mcp-sim/video whose intent matches an extracted KG asset on the same LO, carrying no `kg_tag::` reuse provenance.
**KG.** `kg_lesson_full`, `kg_list_ai_tags`; **CMS** for the bytes.
**Seam.** `prompt` (search instructed) + `kg` (match check) + `compile` (new asset without a checked-and-recorded no-match is flagged).
**Grounding.** grounding-discipline (reuse-first → corpus convergence, no duplicate builds). See `R-GND-04`.

### R-BLU-23 · Carry the textbook's examples &amp; questions into the journey &nbsp;`[HARD]`
**Law.** The journey's worked examples (the **Get** section) are drawn from the textbook's own `worked_examples` for this journey's LO, and its practice + **Exit** questions (the **Ask** / **Consolidate** sections) from the textbook's `exemplar_questions` — both captured in A1 and assigned to the journey by `R-CHP-14`. Each carries its `kg_source::<doc>::p<page>` cite; adapt wording only as needed (delivery-language per `R-GND-06`). Author a net-new example or question **only** to fill a beat the textbook does not cover, and flag it (`gap::textbook_no_example`).
**Detect.** A Get worked example or an Ask/Exit question with no `kg_source` cite where the journey's `textbook_examples`/`exemplar_questions` hold a fit; fabricated exercise content presented as the textbook's.
**KG.** the A1 `textbook_extract` (sourced via `kg_get_source_pages`); no new read.
**Seam.** `prompt` + `compile` (every Get example / Exit question resolves to a page cite or a flagged gap).
**Grounding.** literature:`SweCoop1985` (worked-example effect — study examples before solving), `Chi1989` (self-explanation over worked examples) · convention (textbook fidelity) · F§5.4.
**Why.** A journey that invents its own examples drifts from the book the class actually uses; the textbook's exemplars are the shared, vetted ground truth — reuse them like any other extracted asset, cite the page, and only author to fill real gaps.
