c1_cinematic_title_revealc1_listening_postc1_mission_coverc1_secret_journalc1_animated_title_pulsec2_wide_shotc2_the_roomc2_night_fallsc2_crowd_scenec2_once_upon_a_timec2_the_stranger_arrivesc2_uh_ohthe_goalhere_s_the_planthe_big_questionc3_character_cardc3_narrated_introc3_monologuec3_voice_intropublic_announcementvoicemailthe_storytellercaptain_s_logwarning_messagec7_diary_entryc7_a_letter_arrivesc7_postcardc7_news_reportc7_mission_briefingc7_clue_notec7_evidence_cardc7_poem_versec7_the_sign_saysc7_wanted_posterc7_the_mapsocial_media_profilewiki_articlescreenthe_searchc5_two_shotc5_the_interviewc5_text_messagesc17_overheardemergency_dispatchcourtroom_testimonycampfire_conversationthe_argumentthe_warningc14_the_radio_callc14_the_phone_callbut_external_obstructionthe_calm_beforethe_ticking_clockthe_setbackthe_discoverythe_call_for_helpc2_the_chasec2_running_entrancec2_sneak_pastc2_the_leapc2_crashc2_action_burstc2_the_big_revealc2_face_offc2_it_opensset_it_in_motionthe_aftermaththe_pricec14_fork_in_the_roadc14_plan_a_plan_bc14_pick_onec14_should_theyc14_two_doorsc16_locked_doorc16_collect_gatec16_crack_the_codec16_type_the_answerc19_quiz_pickc6_thought_bubblec6_close_upc18_the_endc18_cliffhangerc18_you_escapedc18_game_overc18_try_againc18_moral_of_the_storytransition_through_the_doorc12_word_wallc12_control_panelc13_journey_mapcase_closedthe_debriefthe_letter_backfinal_journal_entryproblem_solvedwhere_are_they_nowthe_answer_iswhat_you_choses4_type_your_names4_mad_liblearner_say_your_linelearner_call_and_responselearner_name_the_picturelearner_write_what_you_hearreveal_eligible — 44 cards) has an OBJECT spot and a TEXT spot; at most one occupant per page (written-unit ledger + grade interaction cap). Preview with the toolbar Overlay selector. A cover object sits ON the revealed write; tap (or drag, per loop) removes it. The revealed write is the page's ONE extra written unit.
evidence path — _build_evidence_path_instances / _recast_search_pages
LAWwritten-unit ledger: max 1 revealed written unit per page
addTextbox(clue, "the hidden clue"); writeText(clue, "[the revealed write]") addImage(cover, "the cover") // declared AFTER → renders on top addOnClick(cover, trigger=once) -> then(addFade(cover, "out"), addFade(clue))
An object the player picks up (drag/tap) — the key_picked_up boolean flips; later the story text changes or a gate opens.
state machinery — key_picked_up (boolean, drag_reveal default)
LAWgrade interaction cap (1/page typical; one sanctioned heavy page); never shares the object spot with a teaser
addImage(key, "the key/object")
addOnDragOver(key, satchel, trigger=once) ->
then(addFade(key, "out"), addBooleanVarEqualsValue(key_found, true))
// the READ, later: addBooleanVarBlock({{key_found}}) -> addFade(openedWay)Every artifact page is FOUND: the PREVIOUS page carries a small teaser image — click it (no one on stage) or drag the character onto it → the artifact page.
_ensure_artifact_entrances (host = route-less linear page, no interactions)
LAWone object spot: an interaction-carrying page (key/reveal/drag) never also hosts the teaser (guard wired 2026-07-22)
addImage(artifactTeaser, "the sealed letter, small") // no one on stage: addOnClick(artifactTeaser) -> addGoToPage(artifactPage) // character on stage (walk-to-it staging): addOnDragOver(entranceActor, artifactTeaser) -> addGoToPage(artifactPage)
NOT a one-page flourish: 2 clue acquisitions spread one-per-page (each rides the obstruction reveal + a counter increment), then the gate opens at the threshold. CAP = 2 (user ruling, clarity). Kind-specific counter: evidence_found vs collectibles_found. G4+; declare via the collect_gate face (GOT THEM ALL?), or the overclaim repair upgrades boolean over-claims.
collect_required_items machinery (one clue per page — the interaction cap can never strand the threshold)
LAWthe gate must be REAL: full coupling (gate_unlock/hub topology + locked_final + counter) or clues downgrade to optional
// per clue page (×N):
addOnClick(cover, trigger=once) ->
then(addFade(cover, "out"), addFade(clue), addIncrement(evidence_found))
// the gate page:
addOnClick(gateBtn) -> addCompareNumbers({{evidence_found}}, N,
If_greater_or_equal: addGoToPage(final))The personalization NAME capture rides the CHARACTER-intro card (c3): the hero portrait is already cast, and a name field overlays low on it — the student names the character they just met, and the {{name}} weaves into later scenes. It is an OVERLAY, not the standalone TYPE YOUR NAME card. Capture, never checked.
identity_token_capture — routed to the character page (brainstorm_v2_graph, 2026-07-23)
LAWnames the UNNAMED-by-design protagonist (also the Dim-4 in-role identity fix); a mad-lib WORD capture does NOT ride here — it is a character + speech-bubble ask on its own beat
// on the character card: addTextfield(nameField, "name your hero") addOnTextInput(nameField) -> addTextVarEqualsTextObj(name, nameField)
Name the Picture · Say Your Line · Call and Response · Write What You Hear — spoken/typed vocabulary moments riding a claimed host page (see the Learner band's OVERLAY-chipped cards for their full designs + DSL).
learner composables (is_language_learner gate)
LAWshared claim ledger: each claims a DISTINCT clean 1-write page