docs(02): cite D-12, D-16, D-32 in plan must_haves + record planning complete
ci / lint + test + validate-assets + build (push) Successful in 9m39s
ci / lint + test + validate-assets + build (push) Successful in 9m39s
Decision-coverage gate found three CONTEXT.md decisions structurally implemented but not literally cited by their D-NN tags. Added one-line must_haves entries citing each: - D-12 (Lura as discrete gate visits, 3 beats this Season) → 02-04 - D-16 (all Lura dialogue authored in Ink, runtime via inkjs) → 02-04 - D-32 (Zustand 5 store as the Phaser↔React bridge; sim never imports store, CORE-10 enforced) → 02-01 STATE.md flipped from in_progress (context gathered) to ready_to_execute with the planning summary in stopped_at. All 24 REQ-IDs + 34 D-XX decisions now covered. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -50,8 +50,8 @@ must_haves:
|
||||
- "drainTicks(state, accumulatorMs<0) returns the original state with ticksApplied=0 (CORE-11 negative-delta refusal)"
|
||||
- "drainTicks(state, 25*3600*1000) clamps to floor(MAX_OFFLINE_MS / TICK_MS) ticks (CORE-03 24h cap)"
|
||||
- "drainTicks at TICK_MS=200ms over 24h completes ≤500ms on a modern machine (Vitest benchmark)"
|
||||
- "Zustand 5 vanilla createStore composes 4 slices (garden / memory / narrative / session); useAppStore hook re-renders on selector changes; getState() works without React"
|
||||
- "simAdapter (in src/store/) exposes applySimResult(next, events) and drainCommands(); src/sim/ never imports src/store/"
|
||||
- "Zustand 5 vanilla createStore composes 4 slices (garden / memory / narrative / session); useAppStore hook re-renders on selector changes; getState() works without React. This store is the Phaser↔React bridge (D-32) — sim writes via the slim sim-adapter; React reads via selectors; sim never imports the store directly (CORE-10 enforced)"
|
||||
- "simAdapter (in src/store/) exposes applySimResult(next, events) and drainCommands(); src/sim/ never imports src/store/ (D-32 / CORE-10)"
|
||||
- "V1Payload extension adds unlockedPlantTypes, luraBeatProgress, offlineEvents, settings.persistenceToastShown, AND tickCount (BLOCKER 3 — sim-internal monotonic counter, separate from lastTickAt) — CURRENT_SCHEMA_VERSION stays at 1; no migrations[2] entry exists"
|
||||
- "migrations[1] (the v0→v1 demo) returns a fully-populated V1Payload including all new fields (tickCount: 0) with sensible defaults"
|
||||
- "BLOCKER 3 invariant: SimState.lastTickAt is wall-clock milliseconds (written ONLY at saveSync time by the application layer); SimState.tickCount is the sim-internal monotonic counter (incremented inside simulateOneTick). The sim never writes lastTickAt."
|
||||
|
||||
@@ -39,7 +39,8 @@ tags: [vertical-slice, lura, ink, dialogue-overlay, narrative-gating, mvp]
|
||||
|
||||
must_haves:
|
||||
truths:
|
||||
- "All Lura dialogue is authored in Ink (.ink) under /content/dialogue/season1/; compiled at build time to JSON via `npm run compile:ink` invoking inklecate (STRY-06)"
|
||||
- "Lura is present as discrete gate visits — not a persistent chat thread (D-12). 3 beats this Season: arrival, mid, farewell."
|
||||
- "All Lura dialogue is authored in Ink (.ink) under /content/dialogue/season1/; compiled at build time to JSON via `npm run compile:ink` invoking inklecate; runtime-loaded via inkjs (STRY-06, D-16)"
|
||||
- "Beat 1 (arrival) fires when state.harvestedFragmentIds.length transitions from 0 to 1 (1st harvest); beat 2 (mid) at 4th harvest; beat 3 (farewell) at 8th harvest. Counts come from sim state — STRY-10."
|
||||
- "STRY-10: FakeClock advance alone (without harvest events) does NOT advance Lura beats. Tested in lura-gate.test.ts."
|
||||
- "When a beat fires, sim sets state.luraBeatProgress.pending = beatId; the gate visual (in Phaser) shows a soft glow indicator (D-15). Player clicks the gate → React DOM dialogue overlay opens (D-15)."
|
||||
|
||||
Reference in New Issue
Block a user