--- phase: 01 plan: 06 type: execute wave: 2 depends_on: [01-01] files_modified: - .planning/anti-fomo-doctrine.md - .planning/season-7-end-state.md - scripts/doctrine.test.ts autonomous: true requirements: [PIPE-05, UX-13, STRY-09] must_haves: truths: - "`.planning/anti-fomo-doctrine.md` exists and consolidates banned-pattern enumeration from PROJECT.md, REQUIREMENTS.md UX-13, CLAUDE.md Hard Thematic Constraints, RESEARCH PITFALLS.md #9 (PIPE-05 + UX-13)" - "`.planning/season-7-end-state.md` exists and answers principle-level the three questions per CONTEXT D-08: (a) what *rest state* means, (b) what the finite Roothold ceiling is tied to, (c) the coda's tonal register (PIPE-05)" - "Both docs are principle-level consolidations (not new design and not treatment-level) per CONTEXT D-07 + D-08" - "A Vitest doc-lint test asserts both docs exist with their required H2 sections (per RESEARCH § Validation Architecture PIPE-05 row)" - "Neither doc adds a lint rule on UX strings (per CONTEXT D-07 — explicitly rejected)" artifacts: - path: .planning/anti-fomo-doctrine.md provides: "Banned-pattern enumeration + allowed-engagement list + 3-question review checklist + source-document citations (per RESEARCH outline)" contains: "## Banned Mechanics" - path: .planning/season-7-end-state.md provides: "Principle-level answers to (a) rest state, (b) finite Roothold ceiling tie, (c) tonal register; explicit list of what this doc is NOT (per RESEARCH outline + CONTEXT D-08)" contains: "## What does *rest state* mean?" - path: scripts/doctrine.test.ts provides: "Vitest test asserting both docs exist and contain their required H2 sections" key_links: - from: .planning/anti-fomo-doctrine.md to: ["PROJECT.md Out of Scope", "REQUIREMENTS.md UX-13", "CLAUDE.md Hard Thematic Constraints", ".planning/research/PITFALLS.md #9"] via: "Source Documents section enumerates the 4 references explicitly" pattern: "PROJECT.md.*REQUIREMENTS.md.*CLAUDE.md.*PITFALLS.md" - from: .planning/season-7-end-state.md to: ["PROJECT.md core value", "REQUIREMENTS.md SEAS-04, SEAS-09, SEAS-10, STRY-08", "ROADMAP.md Phase 7", ".planning/research/PITFALLS.md #1"] via: "Source Documents section enumerates the 4 references explicitly" pattern: "SEAS-04.*SEAS-09.*SEAS-10.*STRY-08" --- Author the two Phase-1 doctrine documents per CONTEXT D-07 + D-08 + D-09. Both live under `.planning/` (not `docs/` per D-09). Both are *consolidation documents* of constraints already scattered across project artifacts — the planner is **not** doing new design work, only collecting and organizing what's already locked elsewhere. Per CONTEXT D-07, anti-FOMO is enforced by review (not lint); per D-08, Season 7 end-state is principle-level (not treatment text). RESEARCH § "Doctrine doc outline — anti-fomo-doctrine.md" and § "Doctrine doc outline — season-7-end-state.md" provide concrete templates that this plan ships verbatim with project-specific details filled in. Ship a single Vitest doc-lint test (`scripts/doctrine.test.ts`) that asserts both files exist and each contains its required H2 sections — proving PIPE-05 is automatable and giving Plan 07's CI workflow something to verify. Per CONTEXT D-07: NO lint rule on UX strings. Purpose: PROJECT.md commits to the 7-Season scope; PITFALLS.md #1 names "the story ends but the loop doesn't" as the single most dangerous pitfall; CONTEXT D-08 demands the answer ship before any economy code (Phase 2) lands. PIPE-05 + UX-13 require these docs in the repo before Phase 2 begins. The docs become referenced artifacts at every UX/monetization/economy review going forward. Output: Two principle-level doctrine markdown files in `.planning/` plus one Vitest doc-lint test enforcing their structural integrity. @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/REQUIREMENTS.md @.planning/STATE.md @.planning/phases/01-foundations-and-doctrine/01-CONTEXT.md @.planning/phases/01-foundations-and-doctrine/01-RESEARCH.md @.planning/phases/01-foundations-and-doctrine/01-01-SUMMARY.md @.planning/research/PITFALLS.md @CLAUDE.md Task 1: Author `.planning/anti-fomo-doctrine.md` (consolidation per CONTEXT D-07 + RESEARCH outline) .planning/anti-fomo-doctrine.md - .planning/phases/01-foundations-and-doctrine/01-RESEARCH.md § "Doctrine doc outline — anti-fomo-doctrine.md" (the verbatim template structure) - .planning/phases/01-foundations-and-doctrine/01-CONTEXT.md (D-07 — consolidation document, no lint rule on UX strings, enforced by review) - .planning/PROJECT.md § "Out of Scope" (gacha, lootboxes, daily login bonuses, streaks, etc. — the source list of banned patterns) - .planning/REQUIREMENTS.md UX-13 + § "Out of Scope" table (rows: gacha, lootboxes, narrative gating, Season skipping, daily login, streaks, limited-time, energy/stamina, rewarded ads, push spam, lore codex, generic flora, combat, multiplayer, voiced dialogue, always-online, named Keeper, hint system, time-skip purchases, Unity engines, generic cosmetics, random-drop cosmetics, mobile-style nag UX) - CLAUDE.md "Hard Thematic Constraints (Out of Scope by Design)" — the 13 enumerated exclusions - .planning/research/PITFALLS.md § "Pitfall 9: FOMO/Nag Mechanics Violate Cozy Tone" (the rationale + warning signs + how-to-avoid) Write `.planning/anti-fomo-doctrine.md` using the Write tool. Follow the RESEARCH § "Doctrine doc outline — anti-fomo-doctrine.md" template verbatim, but populate every banned-pattern row from the four source documents (PROJECT.md, REQUIREMENTS.md, CLAUDE.md, PITFALLS.md #9). Per CONTEXT D-07, this is a *consolidation* — do not invent new constraints, do not relitigate existing ones. **The document must contain these EXACT H2 sections** (the doc-lint test in Task 2 will assert each one exists): 1. `## Banned Mechanics` 2. `## Allowed Engagement` 3. `## Review Checklist` 4. `## Source Documents` **Document content:** ```markdown # Anti-FOMO Doctrine *Phase 1 deliverable per PIPE-05 + UX-13. Consolidated from PROJECT.md, REQUIREMENTS.md, CLAUDE.md, and .planning/research/PITFALLS.md #9.* This document is referenced at every UX, monetization, and copy review going forward. It enumerates mechanics this game does not use, with the reason for each, so the answer to a "should we add X?" question is in writing rather than relitigated. Per CONTEXT D-07: this doctrine is enforced by **review**, not by lint rules on UX strings. The reviewer (you, at every UX/monetization/copy decision) consults this list and rejects or rewrites any change that violates it. ## Banned Mechanics | Mechanic | Why Banned | |----------|------------| | Gacha mechanics | Directly contradicts the game's thematic argument that complex things cannot be reduced to simple transactions. (PROJECT.md, REQUIREMENTS.md Out of Scope, CLAUDE.md) | | Lootboxes | Same reason as gacha — undermines the story's monetization-as-meaning argument. | | Narrative gating behind purchase | The story IS the product; story content is never paid. | | Random-drop monetization | All cosmetics must be deterministic catalog purchases. | | Daily login bonuses | Presence is not a debt the game collects. | | Login streaks | Skipping a day is allowed, even encouraged. | | Limited-time / time-limited content | The game's premise is *what persists*. | | Energy / stamina systems | Anti-cozy gating that interrupts contemplative play. | | Rewarded ads | Anti-cozy; tonally incoherent with a contemplative grief-narrative. | | Re-engagement push notifications | Memory Storm opt-in is the **only** allowed notification class. | | Loss-aversion copy ("you'll lose your X") | Tonally incompatible with cozy/contemplative. | | Visible countdown timers in core UI | The cello is the timer. The seasons are the timer. Not a digit. | | "Don't miss out" / "limited time" / "only X hours left" copy | Bannable phrases at copy review. | | Season *skipping* (vs. Season *acceleration*) | Players must never miss authored story beats; acceleration is allowed, skipping is forbidden. | | Time-skip purchases that bypass real-time | Real-time IS the metaphor for memory; skip-time would violate mechanic-as-metaphor doctrine. | | Hint system / objective tracker | Discovery-driven progression (A Dark Room rule); explicit objectives violate the tone. | | Mobile-style nag UX | Cozy audience expects respect; nag patterns will tank reviews. | ## Allowed Engagement The following engagement affordances are explicitly **allowed** because they respect presence rather than demand it: - **Memory Storm opt-in notifications** — the single allowed notification class. Player must explicitly opt in. Never daily, never marketing, never streak-based. - **"While you were away" letter on return** — written in Lura's voice, never a stat dump (UX-02). Describes what bloomed, what the wind brought; never "fragments per hour." - **Tab-title bloom indicator** when a fragment is ready (UX-09, Phase 8) — passive surfacing, no notification. - **Save-export reminder after Season transitions** — relationship-saving, not nag. ## Review Checklist When reviewing any UX, copy, monetization, or feature change, ask three questions: 1. **Does this create urgency around presence rather than around content?** If yes → reject. 2. **Does this frame absence as loss?** If yes → rewrite or reject. 3. **Would removing this from the game make it less *cozy*?** If no → reconsider whether the change belongs. Additional sanity checks for monetization specifically: - Does this mechanic gate any story content? → reject (PROJECT.md hard constraint). - Is this random-drop / gacha / lootbox shaped? → reject. - Is this a "limited-time" anything? → reject. ## Source Documents This doctrine consolidates constraints already locked in: - **PROJECT.md** § "Out of Scope" — anti-features (gacha, lootboxes, narrative gating, Season skipping, generic flora, combat, multiplayer, voiced dialogue, named Keeper, generic cosmetics) - **REQUIREMENTS.md** UX-13 + § "Out of Scope" table — 24 explicit exclusions - **CLAUDE.md** § "Hard Thematic Constraints (Out of Scope by Design)" — 13 thematic exclusions, no FOMO push notifications, no daily login bonuses, no streaks, no limited-time, no energy/stamina - **.planning/research/PITFALLS.md** § "Pitfall 9: FOMO/Nag Mechanics Violate Cozy Tone" — rationale + warning signs --- *Authored: Phase 1 deliverable. Updates: append-only — entries can be added (new banned patterns identified) but never removed without surfacing the change for review.* ``` Per CONTEXT D-07: do NOT add a lint rule for UX strings; do NOT add CI enforcement; the document is enforced by human review at the listed decision points. The doctrine doc length is appropriate (~70 lines markdown including tables) — principle-level, not exhaustive prose. Commit `docs(01-06): author anti-FOMO doctrine consolidating PROJECT/REQUIREMENTS/CLAUDE/PITFALLS constraints (PIPE-05, UX-13)`. test -f .planning/anti-fomo-doctrine.md && grep -q "## Banned Mechanics" .planning/anti-fomo-doctrine.md && grep -q "## Allowed Engagement" .planning/anti-fomo-doctrine.md && grep -q "## Review Checklist" .planning/anti-fomo-doctrine.md && grep -q "## Source Documents" .planning/anti-fomo-doctrine.md - File exists at `.planning/anti-fomo-doctrine.md` (NOT `docs/`, per CONTEXT D-09) — verify with `test -f .planning/anti-fomo-doctrine.md && ! test -f docs/anti-fomo-doctrine.md`. - Contains all 4 required H2 sections — verify with `grep -cE "^## (Banned Mechanics|Allowed Engagement|Review Checklist|Source Documents)" .planning/anti-fomo-doctrine.md` returns 4. - The Banned Mechanics table contains at least 15 banned-pattern rows — verify with `awk '/^## Banned Mechanics/,/^## /{print}' .planning/anti-fomo-doctrine.md | grep -cE "^\\| (Gacha|Lootboxes|Narrative gating|Daily login|Login streaks|Limited-time|Energy|Rewarded ads|Re-engagement|Loss-aversion|Visible countdown|Season skipping|Time-skip|Hint system|Mobile-style)" | wc -l` returns at least 15. (Tolerate count-by-row variation; the test file in Task 2 will assert exact patterns.) - The Source Documents section enumerates all 4 sources — verify with `grep -cE "(PROJECT\\.md|REQUIREMENTS\\.md|CLAUDE\\.md|PITFALLS\\.md)" .planning/anti-fomo-doctrine.md` returns at least 4. - The Review Checklist section asks 3 questions — verify with `awk '/^## Review Checklist/,/^## /{print}' .planning/anti-fomo-doctrine.md | grep -cE "^[0-9]\\." | head -1` returns at least 3. - No lint rule is mentioned (per CONTEXT D-07 explicit rejection) — verify with `! grep -qE "lint rule|eslint rule" .planning/anti-fomo-doctrine.md`. `.planning/anti-fomo-doctrine.md` authored as a principle-level consolidation of constraints from PROJECT/REQUIREMENTS/CLAUDE/PITFALLS; contains the 4 required H2 sections; enumerates ≥15 banned patterns + 3 review-checklist questions + 4 source documents; no lint-rule reference (per CONTEXT D-07); commit landed. Task 2: Author `.planning/season-7-end-state.md` (principle-level per CONTEXT D-08 + RESEARCH outline) + Vitest doc-lint test .planning/season-7-end-state.md, scripts/doctrine.test.ts - .planning/phases/01-foundations-and-doctrine/01-RESEARCH.md § "Doctrine doc outline — season-7-end-state.md" (the verbatim template, including the explicit "What this document is NOT" section) - .planning/phases/01-foundations-and-doctrine/01-CONTEXT.md (D-08 — principle-level NOT treatment-level; answers (a) rest state, (b) Roothold ceiling, (c) tonal register; D-09 — lives in `.planning/`) - .planning/PROJECT.md § "Core Value" — "what survives is what you understood"; § "Out of Scope" — Season skipping forbidden, no New Game+ - .planning/REQUIREMENTS.md SEAS-04 (finite ceiling), SEAS-09 (Season 7 long late-game), SEAS-10 (rest state, not infinite tiers), STRY-08 (binary choice + "The garden persists.") - .planning/ROADMAP.md § "Phase 7: Season 7 (Return) & Final Choice" — the 4 success criteria - .planning/research/PITFALLS.md § "Pitfall 1: The Story Ends but the Idle Loop Doesn't" — the rationale this doc directly addresses **Step 1 — Write `.planning/season-7-end-state.md`** using the Write tool, following RESEARCH § "Doctrine doc outline — season-7-end-state.md" verbatim, with content adapted to The Last Garden specifically. **The document must contain these EXACT H2 sections** (the doc-lint test will assert each): 1. `## What does *rest state* mean?` 2. `## What is the finite Roothold ceiling tied to?` 3. `## What tonal register does the coda live in?` 4. `## What this document is NOT` 5. `## Source Documents` **Document content:** ```markdown # Season 7 End-State Design (Principle-Level) *Phase 1 deliverable per PIPE-05 + CONTEXT D-08. Principle-level only — treatment text is authored in Phase 7.* This document answers the question that ends ROADMAP.md Phase 7's success criterion #4: > *"the finite Roothold ceiling from Phase 4 has held the line, and the game has ended > the way A Dark Room and Universal Paperclips ended."* Per .planning/research/PITFALLS.md #1, "the story ends but the idle loop doesn't" is the single most dangerous structural pitfall for this project. This document is the canonical answer the project has *before* any economy code lands in Phase 2. Per CONTEXT D-08: this is **principle-level**, not treatment-level. It defines the contract Phase 7's authoring obeys, not the text of any final scene. ## What does *rest state* mean? The rest state is the post-credits configuration the player can return to indefinitely without grinding. Concretely: - **No new fragments are added to the pool.** All authored content has been delivered. Harvests after the final binary choice yield re-readable previously-collected fragments — nothing new. - **No new currency tiers unlock.** Roothold has reached its finite ceiling (see below) and stays there. There is no "Season 8" hidden behind a number. - **The garden continues to render and respond to clicks.** Plants can still be planted. Seasons (now in Return register) continue to crossfade. The world is not frozen — it is *finished*. - **The Pale has receded.** The Heartsoil expands beyond the garden walls. Lura's arc has resolved. The Archivist's question has been answered (in the player's Season 7 binary choice — STRY-08). - **The cello and ambient layers continue.** The audio is *quiet*, *finite*, *understood* — never crescendos again, never hard-cuts. This is not "endgame content." It is **rest**. Lineage: *A Dark Room* fades to its ending screen and the player returns to it for the same reason they return to a finished album — not because there is more, but because there was *enough*. ## What is the finite Roothold ceiling tied to? Roothold's ceiling is anchored in the **count of authored fragments and the count of Seasons** — not in an arbitrary number, not in a designer's intuition. The principle: > *One cannot accumulate more Roothold than the player has actually understood, > and what the player can understand is bounded by what the writer has actually written.* Concrete tie: - Roothold gain per Season is gated to a hard cap proportional to the fragment count of that Season + a small contribution from Roothold-relevant story beats (Lura conversations, the Nameless Man's arc, the Archivist's question, etc.). - Total Roothold ceiling = Σ(per-Season caps). - **Phase 4 enforces this cap** when it implements `migrate_v1_to_v2` and the prestige state machine (SEAS-04). Phase 7 verifies the ceiling holds through full play. - When Roothold reaches the ceiling, the UI displays "Roothold (full)" — never a hidden multiplier or "go again to overflow." Implication for designers: when adding fragments in Phase 5+, the Roothold ceiling *moves* — adding 5 new Season-3 fragments adds proportional headroom. This is intentional. Roothold is bounded by content; content is bounded by the writer. ## What tonal register does the coda live in? - **Warm**, not pyrrhic. The garden persists *because* you tended it; this is earned redemption, not survival. Lineage: the closing minutes of *Spiritfarer*, not the closing minutes of *A Dark Room* (which earned its bitterness; we earn our warmth). - **Quiet**, not climactic. The cello does not crescendo at the binary choice. It rests. The chosen ending paragraph displays softly; "The garden persists." lands without underscore. - **Specific**, not abstract. The final visible state is a *real* garden — the one this player built, with their actual planted ecosystems, their actual Roothold value, their actual collected fragments — viewed in soft dawn-silver light per AEST-06's Season-7 palette anchor. - **Final**, not infinite. There is no Season 8. There is no New Game+. The Pale receded **here**, in **this** garden. Future patches may add cosmetic items or additional fragments per CONT-01 (post-launch additive content), but they slot *between* authored beats; they never extend the arc. ## What this document is NOT This document defines principles. It does **not** define: - The text of the Season 7 binary-choice scene — *authored Phase 7*. - The text of either ending paragraph (`"They help us remember"` / `"They help us grow"`) — *authored Phase 7*. - The exact line "The garden persists." appears in both endings, but its surrounding paragraph and Lura's final line are *authored Phase 7*, not Phase 1. - The credits / coda screen visual treatment — *designed Phase 7*. - The exact tonal register or shape of individual final-Season fragments — *authored Phase 7*. - The numeric value of the Roothold ceiling — *computed Phase 4* from the content count at that point + ROADMAP-locked principle. This document is **the principle the economy obeys, the writer obeys, and the Phase 7 designer obeys** — not the implementation of any of those. ## Source Documents This doctrine consolidates constraints already locked in: - **PROJECT.md** § "Core Value" — "every idle mechanic must function as a metaphor"; "what survives is what you understood" - **REQUIREMENTS.md** SEAS-04 (finite Roothold ceiling), SEAS-09 (Season 7 late-game shape), SEAS-10 (rest state, not infinite prestige tiers), STRY-08 (binary choice + "The garden persists.") - **ROADMAP.md** § "Phase 7: Season 7 (Return) & Final Choice" — the 4 success criteria - **.planning/research/PITFALLS.md** § "Pitfall 1: The Story Ends but the Idle Loop Doesn't" — the rationale this document directly addresses --- *Authored: Phase 1 deliverable. Phase 4 enforces the Roothold ceiling. Phase 7 authors the treatment-level final scenes against the principles above.* ``` Per CONTEXT D-08: this is principle-level only. Do NOT include the binary-choice scene text, either ending paragraph, Lura's final line, or the credits screen treatment — those are explicitly Phase 7's authoring scope. **Step 2 — Write `scripts/doctrine.test.ts`** — the doc-lint Vitest test (per RESEARCH § Validation Architecture PIPE-05 row): ```typescript import { describe, it, expect } from 'vitest'; import { readFileSync, existsSync } from 'node:fs'; describe('PIPE-05: doctrine documents exist with required H2 sections', () => { describe('.planning/anti-fomo-doctrine.md', () => { const PATH = '.planning/anti-fomo-doctrine.md'; it('exists', () => { expect(existsSync(PATH)).toBe(true); }); it('contains all 4 required H2 sections', () => { const md = readFileSync(PATH, 'utf8'); expect(md).toMatch(/^## Banned Mechanics$/m); expect(md).toMatch(/^## Allowed Engagement$/m); expect(md).toMatch(/^## Review Checklist$/m); expect(md).toMatch(/^## Source Documents$/m); }); it('cites all 4 source documents (PROJECT, REQUIREMENTS, CLAUDE, PITFALLS)', () => { const md = readFileSync(PATH, 'utf8'); expect(md).toMatch(/PROJECT\.md/); expect(md).toMatch(/REQUIREMENTS\.md/); expect(md).toMatch(/CLAUDE\.md/); expect(md).toMatch(/PITFALLS\.md/); }); it('does NOT propose a lint rule on UX strings (CONTEXT D-07 explicit rejection)', () => { const md = readFileSync(PATH, 'utf8'); // The doc may *mention* that lint rules were rejected, but it must not // propose adding one. Allow "no lint rule" but reject "add a lint rule". expect(md).not.toMatch(/\b(add|implement|propose).{0,40}lint rule/i); }); }); describe('.planning/season-7-end-state.md', () => { const PATH = '.planning/season-7-end-state.md'; it('exists', () => { expect(existsSync(PATH)).toBe(true); }); it('contains all 5 required H2 sections (CONTEXT D-08)', () => { const md = readFileSync(PATH, 'utf8'); expect(md).toMatch(/^## What does \*rest state\* mean\?$/m); expect(md).toMatch(/^## What is the finite Roothold ceiling tied to\?$/m); expect(md).toMatch(/^## What tonal register does the coda live in\?$/m); expect(md).toMatch(/^## What this document is NOT$/m); expect(md).toMatch(/^## Source Documents$/m); }); it('cites SEAS-04, SEAS-09, SEAS-10, STRY-08', () => { const md = readFileSync(PATH, 'utf8'); expect(md).toMatch(/SEAS-04/); expect(md).toMatch(/SEAS-09/); expect(md).toMatch(/SEAS-10/); expect(md).toMatch(/STRY-08/); }); it('does NOT include treatment-level details forbidden by CONTEXT D-08', () => { const md = readFileSync(PATH, 'utf8'); // Check the "What this document is NOT" section is present — this is the // structural guarantee against treatment-level scope creep. expect(md).toMatch(/## What this document is NOT/); // The doc must explicitly disclaim authoring the ending paragraphs. expect(md).toMatch(/authored Phase 7/); }); }); }); ``` **Step 3 — Run `npx vitest run scripts/doctrine.test.ts`** and confirm all assertions pass (~10 assertions across 2 files). **Step 4 — Run `npm test`** and confirm the entire Phase-1 suite (sentinel + lint-firewall + save layer + content loader + asset validator + doctrine) is green. **Step 5 — Commit `docs(01-06): author Season 7 end-state principle doctrine + Vitest doc-lint test (PIPE-05)`.** npx vitest run scripts/doctrine.test.ts && test -f .planning/season-7-end-state.md && ! test -f docs/season-7-end-state.md - File exists at `.planning/season-7-end-state.md` (NOT `docs/`, per CONTEXT D-09) — verify with `test -f .planning/season-7-end-state.md && ! test -f docs/season-7-end-state.md`. - Contains all 5 required H2 sections — verify with `grep -cE "^## (What does \\*rest state\\* mean|What is the finite Roothold ceiling tied to|What tonal register does the coda live in|What this document is NOT|Source Documents)" .planning/season-7-end-state.md` returns 5. - Cites SEAS-04, SEAS-09, SEAS-10, STRY-08 — verify with `grep -cE "(SEAS-04|SEAS-09|SEAS-10|STRY-08)" .planning/season-7-end-state.md` returns at least 4. - Includes the "What this document is NOT" section to prevent treatment-level scope creep — verify with `grep -q "## What this document is NOT" .planning/season-7-end-state.md`. - Does NOT include the binary-choice scene text — verify with `! grep -qE '"They help us remember"' .planning/season-7-end-state.md` (the QUOTED phrase is referenced as a citation but the scene text itself is not authored here; the test allows mention of the phrase as a reference but checks it does not appear inside a code block or as flowing prose intended to be the final-scene text). **Note:** The doc DOES quote `"They help us remember"` and `"They help us grow"` as reference labels (in the "What this document is NOT" section, naming what is NOT being authored here). This is acceptable per CONTEXT D-08 — the rule is "do not author the *scene*", not "do not name the choice." Verify with `grep -E '"They help us remember"' .planning/season-7-end-state.md` returns at most one match (the disclaimer reference), and the matching line contains the words "Phase 7" or "authored": ```bash grep -E '"They help us remember"' .planning/season-7-end-state.md | grep -qE "(Phase 7|authored)" ``` - `scripts/doctrine.test.ts` exists and passes — verify with `npx vitest run scripts/doctrine.test.ts 2>&1 | grep -E "passed"` exits 0. - The doctrine test asserts existence + H2 sections + source citations for both docs — verify with `grep -cE "existsSync|toMatch.*##" scripts/doctrine.test.ts` returns at least 10. `.planning/season-7-end-state.md` authored at principle level with the 5 required H2 sections, Roothold-ceiling-tied-to-content principle, the explicit "What this document is NOT" boundary against treatment scope creep; `scripts/doctrine.test.ts` enforces structural integrity of both doctrine docs via Vitest; `npm test` green; commit landed. No security-relevant code in this plan; doctrine docs and a doc-lint test only. No runtime code; no untrusted inputs; no I/O beyond reading committed Markdown files at test time. - Both doctrine docs exist under `.planning/` (per CONTEXT D-09). - `scripts/doctrine.test.ts` passes — both docs have all required H2 sections and cite all required source documents. - `npm test` green for the entire Phase-1 suite. - Phase 7 has a principle contract to author against; Phase 4 has the Roothold-ceiling tie-to-content principle to implement against. - No new design work was done — both docs are consolidations of existing PROJECT/REQUIREMENTS/CLAUDE/ROADMAP/PITFALLS constraints (per CONTEXT D-07 + D-08). - `.planning/anti-fomo-doctrine.md` consolidates banned-pattern enumeration with 4 required H2 sections (Banned Mechanics, Allowed Engagement, Review Checklist, Source Documents) and ≥15 banned patterns. - `.planning/season-7-end-state.md` answers principle-level the 3 questions per CONTEXT D-08 + has the explicit "What this document is NOT" boundary section. - `scripts/doctrine.test.ts` enforces structural integrity automatically (PIPE-05). - No lint rule on UX strings (per CONTEXT D-07 explicit rejection). - Both docs live under `.planning/`, not `docs/` (per CONTEXT D-09). After completion, create `.planning/phases/01-foundations-and-doctrine/01-06-SUMMARY.md` documenting: - Both docs' final paths and brief contents summary. - Confirmation that the doc-lint test (`scripts/doctrine.test.ts`) passes. - Note for Phase 4: the Roothold ceiling enforcement task should reference `.planning/season-7-end-state.md` § "What is the finite Roothold ceiling tied to?" for the principle. - Note for Phase 7: the binary choice scene authoring should reference `.planning/season-7-end-state.md` § "What this document is NOT" for the boundary of what's authored when. - Note for ongoing UX/monetization reviews: `.planning/anti-fomo-doctrine.md` is the canonical reference; consult before any UX change.