docs(phase-02): add validation strategy
Nyquist VALIDATION.md scaffold for Phase 2. Defines test infrastructure (Vitest + Playwright already wired by Phase 1), sampling rates (npm test after each commit, npm run ci after each wave), Wave-0 dependency surface (BigQty + scheduler + Zustand store + V1Payload extension), and three manual-only verifications (AudioContext cross-browser, letter voice review, cozy-pace playtest). The per-task verification map is intentionally empty — the planner fills it during plan generation; nyquist_compliant flips to true once it's complete. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
phase: 2
|
||||||
|
slug: season-1-vertical-slice-soil
|
||||||
|
status: draft
|
||||||
|
nyquist_compliant: false
|
||||||
|
wave_0_complete: false
|
||||||
|
created: 2026-05-09
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 2 — Validation Strategy
|
||||||
|
|
||||||
|
> Per-phase validation contract for feedback sampling during execution.
|
||||||
|
> Populated by the planner during plan generation. Each plan's tasks must declare automated verification commands or a Wave 0 dependency.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Test Infrastructure
|
||||||
|
|
||||||
|
| Property | Value |
|
||||||
|
|----------|-------|
|
||||||
|
| **Framework** | Vitest 4.x (sim + unit + integration) + Playwright 1.x (e2e smoke, PIPE-07) |
|
||||||
|
| **Config files** | `vitest.config.ts`, `playwright.config.ts` (Phase 1 already shipped both) |
|
||||||
|
| **Quick run command** | `npm test` (Vitest only — happy-dom env; ~1–2s on warm cache) |
|
||||||
|
| **Full suite command** | `npm run ci` (lint + Vitest + validate:assets + build) |
|
||||||
|
| **Playwright command** | `npx playwright test` (Phase 2 ships the first real e2e) |
|
||||||
|
| **Estimated runtime** | Vitest ≤5s · Playwright ≤30s · `npm run ci` ≤60s |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sampling Rate
|
||||||
|
|
||||||
|
- **After every task commit:** Run `npm test` (Vitest)
|
||||||
|
- **After every plan wave:** Run `npm run ci` (full)
|
||||||
|
- **Before `/gsd-verify-work`:** `npm run ci` AND `npx playwright test` must be green
|
||||||
|
- **Max feedback latency:** ≤5 seconds for Vitest; ≤30s for Playwright
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Per-Task Verification Map
|
||||||
|
|
||||||
|
> Populated by the planner during plan generation. One row per `<task>` block in every PLAN.md.
|
||||||
|
|
||||||
|
| Task ID | Plan | Wave | Requirement | Threat Ref | Secure Behavior | Test Type | Automated Command | File Exists | Status |
|
||||||
|
|---------|------|------|-------------|------------|-----------------|-----------|-------------------|-------------|--------|
|
||||||
|
| _(planner fills this section after PLAN.md generation)_ | | | | | | | | | ⬜ pending |
|
||||||
|
|
||||||
|
*Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Wave 0 Requirements
|
||||||
|
|
||||||
|
Wave 0 (the foundations plan, expected as Plan 02-01) lands `BigQty`, the Zustand 5 store, the tick scheduler, and the Phase-2 V1Payload schema extension before any vertical slice can run. Until Wave 0 lands, every Wave-1 task carries a Wave-0 dependency.
|
||||||
|
|
||||||
|
- [ ] `src/sim/numbers/big-qty.ts` + `big-qty.test.ts` — BigQty wrapper unit tests
|
||||||
|
- [ ] `src/sim/scheduler/scheduler.ts` + `scheduler.test.ts` — tick scheduler with negative-delta refusal + 24h clamp
|
||||||
|
- [ ] `src/store/index.ts` + slice tests — Zustand 5 vanilla createStore + slim sim adapter
|
||||||
|
- [ ] `src/save/migrations.ts` — extended V1Payload (Phase-2 schema extension, NOT v1→v2)
|
||||||
|
- [ ] `eslint.config.js` — additional sim-purity rule banning `Date.now`/`setInterval` in `src/sim/**`
|
||||||
|
|
||||||
|
*Filled in by Plan 02-01. All other plans declare a Wave-0 dependency in frontmatter (`depends_on: [02-01]`).*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Manual-Only Verifications
|
||||||
|
|
||||||
|
| Behavior | Requirement | Why Manual | Test Instructions |
|
||||||
|
|----------|-------------|------------|-------------------|
|
||||||
|
| AudioContext.resume() actually unlocks audio across Chrome / Firefox / Safari / Edge | AEST-07 | Browser autoplay policies vary; Vitest happy-dom does not exercise real audio context. | After Wave 1, manually load the dev build in Chrome / Firefox / Safari (last 2 stable). Click Begin. Confirm a console-logged `AudioContext.state === 'running'`. |
|
||||||
|
| Letter prose reads in voice (not as a stat dump) | UX-02 | Tonal verification is a human review; CONTEXT D-17 explicitly calls this out. | Author reviews `/content/dialogue/season1/letter.ink` against the bible voice; reviewer signs off in plan SUMMARY.md. |
|
||||||
|
| Cozy 2–5min growth feels right at playtest | CONTEXT D-08 / D-09 | Subjective pacing — only verifiable by playing. | Solo playtest after Wave 2 lands. Adjust per-plant durations if either pace is off; record final values in SUMMARY.md. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Validation Sign-Off
|
||||||
|
|
||||||
|
- [ ] All tasks have `<automated>` verify or Wave 0 dependencies
|
||||||
|
- [ ] Sampling continuity: no 3 consecutive tasks without automated verify
|
||||||
|
- [ ] Wave 0 covers all MISSING references
|
||||||
|
- [ ] No watch-mode flags (`vitest run`, not `vitest`)
|
||||||
|
- [ ] Feedback latency < 5s for Vitest, < 30s for Playwright
|
||||||
|
- [ ] `nyquist_compliant: true` set in frontmatter (set by the planner after the per-task map is filled)
|
||||||
|
|
||||||
|
**Approval:** pending
|
||||||
Reference in New Issue
Block a user