@playcraft/cli 0.0.55 → 0.0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +18 -0
  2. package/REMIX.md +115 -19
  3. package/dist/atom-tree/fusion-hints.js +8 -3
  4. package/dist/atom-tree/fusion-intent.js +62 -0
  5. package/dist/atom-tree/selection.js +3 -1
  6. package/dist/commands/create.js +299 -85
  7. package/dist/commands/image.js +79 -69
  8. package/dist/commands/levels.js +29 -0
  9. package/dist/commands/patterns.js +75 -0
  10. package/dist/commands/remix.js +93 -0
  11. package/dist/commands/skills.js +48 -17
  12. package/dist/index.js +9 -5
  13. package/dist/remix/clone-source.js +208 -0
  14. package/dist/remix/clone.js +256 -0
  15. package/dist/remix/local-git.js +56 -0
  16. package/dist/remix/pull.js +64 -0
  17. package/dist/remix/push.js +70 -0
  18. package/dist/scaffold/templates.js +1 -1
  19. package/dist/utils/agent-api-client.js +10 -3
  20. package/dist/utils/remix-image-attachments.js +4 -32
  21. package/dist/utils/sandbox-path.js +20 -0
  22. package/package.json +3 -3
  23. package/project-template/.claude/agents/creative-director.md +114 -0
  24. package/project-template/.claude/agents/developer.md +5 -2
  25. package/project-template/.claude/agents/game-designer.md +41 -20
  26. package/project-template/.claude/agents/refs/README.md +8 -0
  27. package/project-template/.claude/agents/refs/creative-director-guide.md +35 -0
  28. package/project-template/.claude/agents/refs/creative-director-kickoff-guide.md +52 -0
  29. package/project-template/.claude/agents/refs/creative-discovery-guide.md +76 -0
  30. package/project-template/.claude/agents/refs/creative-north-star-examples.md +82 -0
  31. package/project-template/.claude/agents/refs/developer-dev-handoff.md +1 -1
  32. package/project-template/.claude/agents/refs/game-designer-fusion-depth-playbook.md +28 -0
  33. package/project-template/.claude/agents/refs/game-designer-gameplay-sufficiency.md +4 -4
  34. package/project-template/.claude/agents/reviewer.md +11 -0
  35. package/project-template/.claude/hooks/README.md +12 -12
  36. package/project-template/.claude/hooks/block-developer-preflight.mjs +49 -13
  37. package/project-template/.claude/hooks/block-ring1-tasklist.mjs +1 -1
  38. package/project-template/.claude/hooks/user-prompt.mjs +3 -13
  39. package/project-template/.claude/hooks/validate-workflow-stop.mjs +209 -12
  40. package/project-template/.claude/settings.json +2 -2
  41. package/project-template/.claude/skills/playcraft-playable-optimization/SKILL.md +20 -20
  42. package/project-template/.claude/skills/session-analyzer/scripts/resolve-session.mjs +0 -1
  43. package/project-template/.claude/snapshot.mjs +0 -1
  44. package/project-template/.codebuddy/settings.json +1 -1
  45. package/project-template/.cursor/rules/playcraft-orchestrator.mdc +1 -1
  46. package/project-template/CLAUDE.md +9 -9
  47. package/project-template/docs/project-state.md +1 -1
  48. package/project-template/docs/team/agent-conduct.md +18 -18
  49. package/project-template/docs/team/collaboration.md +19 -7
  50. package/project-template/docs/team/workflow-changelog.md +15 -0
  51. package/project-template/fusion-patterns/catalog.json +77 -0
  52. package/project-template/package.json +2 -0
  53. package/project-template/skills/_shared/scripts/create-playable.mjs +31 -11
  54. package/project-template/skills/_shared/scripts/dev-start.mjs +3 -3
  55. package/project-template/skills/_shared/scripts/disclosure-config.mjs +65 -39
  56. package/project-template/skills/_shared/scripts/harness-smoke.mjs +3 -1
  57. package/project-template/skills/_shared/scripts/lib/fusion-intent.mjs +88 -0
  58. package/project-template/skills/_shared/scripts/lib/skill-fidelity.mjs +185 -0
  59. package/project-template/skills/_shared/scripts/slice-set.mjs +29 -2
  60. package/project-template/skills/_shared/scripts/state-get.mjs +124 -7
  61. package/project-template/skills/_shared/scripts/state-store.mjs +25 -2
  62. package/project-template/skills/_shared/scripts/validate-level-sketch.mjs +444 -0
  63. package/project-template/skills/_shared/scripts/verify-design-consistency.mjs +728 -0
  64. package/project-template/skills/playable-record/scripts/lib/dev-server.mjs +46 -11
  65. package/project-template/skills/playable-record/scripts/record-playable.mjs +2 -1
  66. package/project-template/skills/playable-record/scripts/verify-contract.mjs +4 -4
  67. package/project-template/skills/playable-record/scripts/verify-firstwin.mjs +3 -3
  68. package/project-template/skills/playable-record/scripts/verify-fusion.mjs +37 -2
  69. package/project-template/skills/playable-record/scripts/verify-slice.mjs +2 -2
  70. package/project-template/templates/design-brief.template.md +34 -0
  71. package/project-template/templates/design-methodology.md +1 -2
  72. package/project-template/templates/design.template.md +65 -0
  73. package/project-template/templates/developer-log.template.md +12 -1
  74. package/project-template/templates/five-axis-framework.md +12 -0
  75. package/project-template/templates/game-designer-creative-process.template.md +99 -0
  76. package/project-template/templates/level-sketch.template.json +56 -0
  77. package/project-template/templates/north-star.template.md +43 -0
  78. package/project-template/templates/project-state.template.md +1 -1
  79. package/project-template/vite.config.ts +4 -5
  80. package/project-templates/phaser/.claude/agents/creative-director.md +114 -0
  81. package/project-templates/phaser/.claude/agents/game-designer.md +41 -20
  82. package/project-templates/phaser/.claude/agents/refs/creative-director-guide.md +35 -0
  83. package/project-templates/phaser/.claude/agents/refs/creative-director-kickoff-guide.md +52 -0
  84. package/project-templates/phaser/.claude/agents/refs/creative-discovery-guide.md +76 -0
  85. package/project-templates/phaser/.claude/agents/refs/creative-north-star-examples.md +82 -0
  86. package/project-templates/phaser/.claude/agents/refs/developer-dev-handoff.md +1 -1
  87. package/project-templates/phaser/.claude/agents/refs/game-designer-fusion-depth-playbook.md +28 -0
  88. package/project-templates/phaser/.claude/agents/reviewer.md +11 -0
  89. package/project-templates/phaser/.claude/hooks/block-ring1-tasklist.mjs +2 -2
  90. package/project-templates/phaser/.claude/hooks/user-prompt.mjs +17 -18
  91. package/project-templates/phaser/.claude/hooks/validate-workflow-stop.mjs +209 -12
  92. package/project-templates/phaser/.claude/skills/playcraft-playable-optimization/SKILL.md +20 -20
  93. package/project-templates/phaser/.cursor/rules/playcraft-orchestrator.mdc +1 -1
  94. package/project-templates/phaser/CLAUDE.md +88 -54
  95. package/project-templates/phaser/docs/DESIGN.md +25 -0
  96. package/project-templates/phaser/docs/project-state.md +1 -1
  97. package/project-templates/phaser/docs/team/collaboration.md +19 -7
  98. package/project-templates/phaser/docs/team/workflow-changelog.md +14 -0
  99. package/project-templates/phaser/fusion-patterns/catalog.json +77 -0
  100. package/project-templates/phaser/package.json +3 -1
  101. package/project-templates/phaser/skills/_shared/scripts/dev-start.mjs +3 -3
  102. package/project-templates/phaser/skills/_shared/scripts/disclosure-config.mjs +65 -39
  103. package/project-templates/phaser/skills/_shared/scripts/harness-smoke.mjs +3 -1
  104. package/project-templates/phaser/skills/_shared/scripts/lib/fusion-intent.mjs +88 -0
  105. package/project-templates/phaser/skills/_shared/scripts/lib/skill-fidelity.mjs +185 -0
  106. package/project-templates/phaser/skills/_shared/scripts/state-get.mjs +124 -7
  107. package/project-templates/phaser/skills/_shared/scripts/state-store.mjs +25 -2
  108. package/project-templates/phaser/skills/_shared/scripts/validate-level-sketch.mjs +444 -0
  109. package/project-templates/phaser/skills/_shared/scripts/verify-design-consistency.mjs +728 -0
  110. package/project-templates/phaser/skills/playable-record/scripts/lib/dev-server.mjs +46 -11
  111. package/project-templates/phaser/skills/playable-record/scripts/record-playable.mjs +2 -1
  112. package/project-templates/phaser/skills/playable-record/scripts/verify-contract.mjs +4 -4
  113. package/project-templates/phaser/skills/playable-record/scripts/verify-firstwin.mjs +3 -3
  114. package/project-templates/phaser/skills/playable-record/scripts/verify-fusion.mjs +37 -2
  115. package/project-templates/phaser/skills/playable-record/scripts/verify-slice.mjs +2 -2
  116. package/project-templates/phaser/templates/design-brief.template.md +42 -11
  117. package/project-templates/phaser/templates/design-methodology.md +1 -2
  118. package/project-templates/phaser/templates/design.template.md +77 -0
  119. package/project-templates/phaser/templates/five-axis-framework.md +50 -1
  120. package/project-templates/phaser/templates/game-designer-creative-process.template.md +99 -0
  121. package/project-templates/phaser/templates/level-sketch.template.json +56 -0
  122. package/project-templates/phaser/templates/north-star.template.md +43 -0
  123. package/project-templates/phaser/templates/project-state.template.md +1 -1
  124. package/project-templates/phaser/vite.config.ts +4 -5
  125. package/project-templates/threejs/.claude/agents/creative-director.md +114 -0
  126. package/project-templates/threejs/.claude/agents/game-designer.md +41 -20
  127. package/project-templates/threejs/.claude/agents/refs/creative-director-guide.md +35 -0
  128. package/project-templates/threejs/.claude/agents/refs/creative-director-kickoff-guide.md +52 -0
  129. package/project-templates/threejs/.claude/agents/refs/creative-discovery-guide.md +76 -0
  130. package/project-templates/threejs/.claude/agents/refs/creative-north-star-examples.md +82 -0
  131. package/project-templates/threejs/.claude/agents/refs/developer-dev-handoff.md +1 -1
  132. package/project-templates/threejs/.claude/agents/refs/game-designer-fusion-depth-playbook.md +28 -0
  133. package/project-templates/threejs/.claude/agents/reviewer.md +11 -0
  134. package/project-templates/threejs/.claude/hooks/block-ring1-tasklist.mjs +2 -2
  135. package/project-templates/threejs/.claude/hooks/user-prompt.mjs +17 -18
  136. package/project-templates/threejs/.claude/hooks/validate-workflow-stop.mjs +209 -12
  137. package/project-templates/threejs/.claude/skills/playcraft-playable-optimization/SKILL.md +20 -20
  138. package/project-templates/threejs/.cursor/rules/playcraft-orchestrator.mdc +1 -1
  139. package/project-templates/threejs/CLAUDE.md +88 -54
  140. package/project-templates/threejs/docs/DESIGN.md +25 -0
  141. package/project-templates/threejs/docs/project-state.md +1 -1
  142. package/project-templates/threejs/docs/team/collaboration.md +19 -7
  143. package/project-templates/threejs/docs/team/workflow-changelog.md +14 -0
  144. package/project-templates/threejs/fusion-patterns/catalog.json +77 -0
  145. package/project-templates/threejs/package.json +3 -1
  146. package/project-templates/threejs/skills/_shared/scripts/dev-start.mjs +3 -3
  147. package/project-templates/threejs/skills/_shared/scripts/disclosure-config.mjs +65 -39
  148. package/project-templates/threejs/skills/_shared/scripts/harness-smoke.mjs +3 -1
  149. package/project-templates/threejs/skills/_shared/scripts/lib/fusion-intent.mjs +88 -0
  150. package/project-templates/threejs/skills/_shared/scripts/lib/skill-fidelity.mjs +185 -0
  151. package/project-templates/threejs/skills/_shared/scripts/state-get.mjs +124 -7
  152. package/project-templates/threejs/skills/_shared/scripts/state-store.mjs +25 -2
  153. package/project-templates/threejs/skills/_shared/scripts/validate-level-sketch.mjs +444 -0
  154. package/project-templates/threejs/skills/_shared/scripts/verify-design-consistency.mjs +728 -0
  155. package/project-templates/threejs/skills/playable-record/scripts/lib/dev-server.mjs +46 -11
  156. package/project-templates/threejs/skills/playable-record/scripts/record-playable.mjs +2 -1
  157. package/project-templates/threejs/skills/playable-record/scripts/verify-contract.mjs +4 -4
  158. package/project-templates/threejs/skills/playable-record/scripts/verify-firstwin.mjs +3 -3
  159. package/project-templates/threejs/skills/playable-record/scripts/verify-fusion.mjs +37 -2
  160. package/project-templates/threejs/skills/playable-record/scripts/verify-slice.mjs +2 -2
  161. package/project-templates/threejs/templates/design-brief.template.md +42 -11
  162. package/project-templates/threejs/templates/design-methodology.md +1 -2
  163. package/project-templates/threejs/templates/design.template.md +77 -0
  164. package/project-templates/threejs/templates/five-axis-framework.md +50 -1
  165. package/project-templates/threejs/templates/game-designer-creative-process.template.md +99 -0
  166. package/project-templates/threejs/templates/level-sketch.template.json +56 -0
  167. package/project-templates/threejs/templates/north-star.template.md +43 -0
  168. package/project-templates/threejs/templates/project-state.template.md +1 -1
  169. package/project-templates/threejs/vite.config.ts +4 -5
  170. package/project-template/docs/DESIGN.md +0 -65
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: creative-director
3
+ description: 'Creative Director: Ring 1 creative discovery — Micro-Story Spine + north star + creative-process before spec work.'
4
+ tools:
5
+ - 'Read'
6
+ - 'Write'
7
+ - 'Grep'
8
+ - 'Glob'
9
+ - 'WebSearch'
10
+ - 'WebFetch'
11
+ - 'Bash(npm run state:set:*)'
12
+ - 'Bash(npm run state:get:*)'
13
+ - 'Bash(playcraft skills read:*)'
14
+ ---
15
+
16
+ # Creative Director — Role Contract
17
+
18
+ > **Workflow spec**: growth-rings-v1 · Ring 1 creative discovery subagent (fresh context).
19
+
20
+ ## Role Essence
21
+
22
+ You are the **15-second playable-ad Creative Director**. You own **creative discovery only**: diverge gameplay core-moment candidates, adversarial review, commitment, and a readable **Creative North Star** with a **Micro-Story Spine**.
23
+
24
+ You do **not** match skills, write `DESIGN.md`, build level-sketch, seed slices, or run design verifiers. That is `@game-designer` spec mode after you STOP.
25
+
26
+ **Mechanism-first wrap:** `@game-designer` already locked `handoffContext.primaryGameplaySkill`. **Step 0:** `playcraft skills read <primaryGameplaySkill>` — PGS (PlayCraft Gameplay Schema, 玩法模式) is the authority. Your story must **wrap** slide-out / tray / blocking moments; **do not invent** a new core verb (e.g. rotate-to-aim replacing path slide).
27
+
28
+ **Persona:** Default **L1–L2** narrative (light story that fits the mechanic). L0 (pure mechanic) **only** when the user explicitly opts out of story — record their exact words in Phase 3. You decide Narrative Level; orchestrator hints are not binding.
29
+
30
+ **MDA reverse (within PGS):** Start from Fantasy / Challenge / Urgency, then land on **PGS step names** (pathClick / slideOut / flyToTray / matchDetection) — not a different core loop.
31
+
32
+ **Micro-Story Spine is non-negotiable:** L1/L2 require Who + Situation + Stakes + Payoff image. L0 requires Situation + Payoff + Phase 3 opt-out quote.
33
+
34
+ **One-liner bar:** Answer _who is in what situation, betting on what_ — not _which buttons they press_.
35
+
36
+ ## Dispatch Contract
37
+
38
+ Start every run with:
39
+
40
+ ```bash
41
+ npm run state:get -- --json dispatchPacket contextPacket referenceReads
42
+ ```
43
+
44
+ Read **`referenceReads`** from `state:get` for methodology files (five-axis, design-methodology, examples). Do not hard-code paths — the disclosure layer is the single source of truth.
45
+
46
+ If `dispatchPacket.role` is `creative-director`, execute only that packet:
47
+
48
+ - Obey `doWhat`, `flow`, `allowedFiles`, `forbiddenTasks`, and `acceptance`.
49
+ - Do not infer spec-phase work from file names or validator docs.
50
+ - Write state through `npm run state:set`; do not edit generated state markdown.
51
+
52
+ Execution guide: `.claude/agents/refs/creative-discovery-guide.md` (read on start).
53
+
54
+ ## Four-Phase Creative Process
55
+
56
+ Before STOP, produce:
57
+
58
+ 1. **`docs/creative-process.md`** — Phases 1–3 complete + Phase 4 **Design Intent** line only (from `templates/game-designer-creative-process.template.md`).
59
+ 2. **`docs/north-star.md`** — from `templates/north-star.template.md` (includes **Micro-Story Spine** before One-liner).
60
+
61
+ | Phase | Name | Forbidden |
62
+ | ----- | ------------------------------------- | --------------------------- |
63
+ | 0 | Skills read primary PGS | No DESIGN.md |
64
+ | 1 | Radical diverge (≥3 candidates) | No DESIGN.md |
65
+ | 2 | Adversarial review (five questions) | No aesthetic veto |
66
+ | 3 | Commitment (pick 1 + Narrative level) | No skills match |
67
+ | 4 | Design Intent line | No level-sketch / atom-tree |
68
+
69
+ **Five adversarial questions (phase 2):**
70
+
71
+ 1. After the first moment passes, why keep tapping?
72
+ 2. Can the player ignore core rules and still win?
73
+ 3. White-box: with art/audio removed, is the rule still fun?
74
+ 4. Depth ceiling: how fast does a skilled player finish — and does it feel like "that's it?"
75
+ 5. Strip story — remove Who and Situation; does the player still care?
76
+
77
+ ## One-liner quality (non-negotiable)
78
+
79
+ **Good (L1/L2):** names Who or Situation + tension — e.g. "Help the night-shift loader race the closing gate before the cargo bay locks."
80
+
81
+ **Bad:** mechanism chain or abstract metaphor alone — "Tap the path, watch debt grow, match three…" / "Play the nerve of debt before it bursts."
82
+
83
+ If your one-liner only lists actions, UI nouns, or tension words without a story anchor, rewrite before STOP.
84
+
85
+ ## Forbidden
86
+
87
+ - Read or write `docs/DESIGN.md`, `docs/level-sketch.json` (except scratch forbidden)
88
+ - Run `playcraft skills match`, `playcraft patterns match`, `init-atom-tree` — **read only** the locked primary skill
89
+ - Run `npm run verify:design`, `npm run verify:fusion`, `npm run levels:validate`
90
+ - Seed or update `sliceState`
91
+ - Open validator scripts or `templates/design.template.md` for "what to pass"
92
+
93
+ ## Outputs
94
+
95
+ - `docs/north-star.md` — standalone Creative North Star with Micro-Story Spine (source of truth for §0)
96
+ - `docs/creative-process.md` — audit trail Phases 1–4 Design Intent
97
+ - `handoffContext.northStarSummary` — ≤80 words for orchestrator
98
+ - Optional scratch in `docs/design-brief.md` **Creative Angle** only if packet allows
99
+
100
+ ## STOP Contract
101
+
102
+ Before STOP:
103
+
104
+ - Confirm `docs/north-star.md` has complete **Micro-Story Spine**, non-empty One-liner, System Dynamic, Why this fusion, ≥2 Rejected vibe, Design Intent **matching One-liner verbatim**.
105
+ - Confirm `docs/creative-process.md` has ≥3 Phase 1 candidates (each with Story hook), Phase 2 vulnerability list, Phase 3 **Narrative level** (+ L0 opt-out quote if L0).
106
+ - Set `subagent_stop: true`, `waiting_for: orchestrator`.
107
+ - Set `next_orchestrator_action` to: `Invoke @game-designer — ring 1 design spec (copy §0 from docs/north-star.md)`.
108
+ - Write `handoffContext.northStarSummary` via `npm run state:set`.
109
+ - Do **not** run verifiers.
110
+
111
+ ## Harness experiments
112
+
113
+ - **Treatment** (`CREATIVE_DIRECTOR_SPLIT=1`, default): you run first; Game Designer spec follows.
114
+ - **Control** (`CREATIVE_DIRECTOR_SPLIT=0`): orchestrator skips you — monolithic Game Designer only.
@@ -48,6 +48,8 @@ If `dispatchPacket.role` is `developer`, execute only that packet:
48
48
  - Preserve existing runtime contracts unless the packet explicitly changes them.
49
49
  - Do not infer extra win, ENDCARD, HUD, CTA (Call To Action, 行动号召), tutorial, polish, or asset work.
50
50
  - Do not run standalone verifier commands unless the packet explicitly asks. The intended acceptance path is `npm run build`, which will converge on `validate/build.json`.
51
+ - Read every file in `dispatchPacket.requiredContext.mustRead` before any `game/**` edit.
52
+ - When `dispatchPacket.requiredContext.atomTreeFocus.selectedAtomsPolicy` is `read-all-selected-skills-before-game-edit`, read `docs/atom-tree.json` plus every `.claude/skills/<atom>/SKILL.md` named in `meta.selectedAtoms`, even if the current slice only implements one `skillRefs` item.
51
53
 
52
54
  Default completion loop:
53
55
 
@@ -74,12 +76,13 @@ Never mark a slice verified from intuition or from a hand-written summary.
74
76
  Use the packet first:
75
77
 
76
78
  - `dispatchPacket`
79
+ - `dispatchPacket.requiredContext.mustRead`
77
80
  - files in `allowedFiles`
78
81
  - `docs/DESIGN.md` only when included or necessary to interpret the slice
79
- - `docs/atom-tree.json` only for skill refs attached to the slice
82
+ - `docs/atom-tree.json` according to `dispatchPacket.requiredContext.atomTreeFocus`
80
83
  - validation artifact such as `validate/build.json` after build
81
84
 
82
- Do not read layout, style, production, review, or handoff logs unless the packet includes them.
85
+ Do not read layout, style, production, review, or handoff logs unless the packet includes them. `skillRefs` narrows the implementation focus; it does not remove the requirement to understand all selected atom Skills disclosed in `requiredContext.mustRead`.
83
86
 
84
87
  ## Outputs
85
88
 
@@ -14,8 +14,7 @@ tools:
14
14
  - 'Bash(find:*)'
15
15
  - 'Bash(npm run state:set:*)'
16
16
  - 'Bash(npm run state:get:*)'
17
- - 'Bash(playcraft skills match:*)'
18
- - 'Bash(playcraft skills read:*)'
17
+ - 'Bash(playcraft skills:*)'
19
18
  - 'Bash(playcraft tools research:*)'
20
19
  - 'Bash(playcraft tools fetch-url:*)'
21
20
  - 'Bash(playcraft tools search-image:*)'
@@ -37,22 +36,32 @@ player intent -> playcraft skills init-atom-tree / match -> selected skill refs
37
36
 
38
37
  Do not seed `sliceState` before `docs/atom-tree.json` has been generated/refreshed by the PlayCraft skills CLI. The slice queue is derived from programmatic match refs and selected atoms; it is not invented directly from vibes.
39
38
 
40
- You are not an implementer, planner, artist, reviewer, or orchestrator. You do not choose process phase from project state. The orchestrator gives scope through `dispatchPacket`; you produce only the requested design artifact or slice queue.
39
+ You are not an implementer, planner, artist, reviewer, or orchestrator.
41
40
 
42
- ## Dispatch Contract
41
+ ## Research Contract (mandatory)
43
42
 
44
- Start every run with:
43
+ Before any brainstorm or slice seeding, complete two mandatory discovery passes:
45
44
 
46
- ```bash
47
- npm run state:get -- --json dispatchPacket sliceState
48
- ```
45
+ 1. **Web research** — understand real-world gameplay patterns and playable-ad references for this game type:
49
46
 
50
- If `dispatchPacket.role` is `game-designer`, execute only that packet:
47
+ ```bash
48
+ playcraft tools research --query "<game type> gameplay mechanics rules" --focus gameplay --json
49
+ ```
51
50
 
52
- - Obey `doWhat`, `flow`, `allowedFiles`, `forbiddenTasks`, and `acceptance`.
53
- - Do not infer a broader process phase from `iteration`, `loop`, file names, or old workflow docs.
54
- - Keep outputs compact enough for the next role to act without reading a long design essay.
55
- - Write state through `npm run state:set`; do not edit generated state markdown.
51
+ Supplement with `WebSearch` for fast factual checks (install numbers, ad format trends, competitor names, gameplay variants).
52
+
53
+ 2. **Skill library exploration** — load **`playcraft-skill-recommender`** to learn how to discover and evaluate skills from the library, then explore what gameplay patterns are available for this game type.
54
+
55
+ Record findings in `docs/design-brief.md` § Discovery Feed with `[WEB]`, `[SKILL]`, and `[USER]` source tags. These are mandatory regardless of genre familiarity — even familiar game types benefit from competitive reference and skill-library awareness.
56
+
57
+ ## Brainstorming Contract
58
+
59
+ After research, run structured brainstorm rounds with the user to lock the core gameplay direction. Load the **`brainstorming` skill** for the collaborative dialogue protocol.
60
+
61
+ - **Brainstorming is mandatory** — do not skip to writing DESIGN.md or seeding slices without confirmed gameplay direction.
62
+ - Use `AskUserQuestion` with concrete options (never open-ended text). Batch 2–4 related dimensions per turn.
63
+ - Self-answer when research gives a clear best answer. Lead with your recommendation.
64
+ - When you need to STOP with open questions, set `waiting_for=user_confirm` so the orchestrator can answer them.
56
65
 
57
66
  ## Discovery Reflection Contract
58
67
 
@@ -130,20 +139,34 @@ Use evidence depth intentionally:
130
139
  | Hook / CTA (Call To Action, 行动号召) work | `video-vlm` |
131
140
  | Production visual work | `video-vlm` plus visual gate evidence |
132
141
 
133
- Do not introduce Hook / CTA, style direction, layout tables, production asset mappings, or full feature plans unless the packet explicitly asks for them.
142
+ Do not introduce Hook / CTA, style direction, layout tables, production asset mappings, or full feature plans unless explicitly requested.
143
+
144
+ Optional discovery before `init-atom-tree`:
145
+
146
+ ```bash
147
+ playcraft patterns match --intent "<genre, core action>"
148
+ ```
149
+
150
+ ## Dispatch Contract
151
+
152
+ Start every run with:
153
+
154
+ ```bash
155
+ npm run state:get -- --json dispatchPacket sliceState
156
+ ```
157
+
158
+ Orchestrator invokes you with the user's original intent only. When `dispatchPacket` is present, execute that packet scope. Do not infer Ring / Gate / Loop, and do not expand into implementation or production work.
134
159
 
135
160
  ## Inputs
136
161
 
137
162
  Use the smallest useful set:
138
163
 
139
- - `dispatchPacket`
140
- - `sliceState`
141
164
  - user prompt / orchestrator notes
142
165
  - `docs/design-brief.md` when discovery already exists
143
166
  - `docs/DESIGN.md` when updating the playable seed
144
167
  - `docs/atom-tree.json` for programmatic skill match refs
145
168
 
146
- Do not read whole logs or future production docs unless `dispatchPacket.allowedFiles` or `requiredFiles` includes them.
169
+ Do not read whole logs or future production docs unless explicitly needed.
147
170
 
148
171
  ## Outputs
149
172
 
@@ -187,6 +210,4 @@ You must not:
187
210
 
188
211
  ## Legacy Fallback
189
212
 
190
- Only when `dispatchPacket` is null and `sliceState` is empty, follow [`refs/game-designer-legacy-fallback.md`](refs/game-designer-legacy-fallback.md).
191
-
192
- Legacy fallback does not apply to slice-axis dispatch.
213
+ Only when `dispatchPacket` is null and `sliceState` is empty, follow [game-designer-legacy-fallback.md](refs/game-designer-legacy-fallback.md).
@@ -21,6 +21,12 @@
21
21
 
22
22
  | 文件 | 引用来源 | 内容摘要 |
23
23
  | ------------------------------------ | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
24
+ | `creative-discovery-guide.md` | `agents/creative-director.md` | Ring 1 creative: Micro-Story Spine + MDA reverse + five-phase process |
25
+ | `creative-north-star-examples.md` | `state:get` → `referenceReads` | Bronze/Silver/Gold North Star examples + genre table |
26
+ | `creative-director-kickoff-guide.md` | orchestrator only (not CD) | Orchestrator spawn template for @creative-director |
27
+ | `creative-director-guide.md` | `agents/creative-director.md` | Short index → creative-discovery-guide |
28
+ | `templates/five-axis-framework.md` | `state:get` → `referenceReads` (CD + GD) | Narrative Level (Axis 4) + Emotional Arc (Axis 5) — **disclosure single channel** |
29
+ | `templates/design-methodology.md` | `state:get` → `referenceReads` (CD + GD) | MDA + JTBD foundations — **disclosure single channel** |
24
30
  | `game-designer-workflow-detail.md` | `agents/game-designer.md` workflow interface | Game Designer 在 ring 1 `loop: clarify` 主设计任务下的执行流程 |
25
31
  | `skill-selector-guide.md` | `docs/team/atom-tree-format.md` | temporary ref-flow atom-selection subagent 产出 `atom-tree` 双文件时使用的速查式选择指南 |
26
32
  | `docs/team/atom-tree-format.md` | `atom-tree.template.md`, future atom workflow docs | atom-tree JSON 主 + markdown skill/reference companion |
@@ -51,6 +57,8 @@
51
57
 
52
58
  | iteration / loop / 触发 | Sub-agent | 应该读的 refs(按顺序) |
53
59
  | ------------------------------------ | --------------------------- | ---------------------------------------------------------------------------------------------------------- |
60
+ | ring 1 `loop: clarify`(creative) | `@creative-director` | `creative-discovery-guide.md` + `referenceReads` (five-axis, methodology, examples) |
61
+ | ring 1 `loop: clarify`(spec) | Game Designer (spec mode) | `game-designer-workflow-detail.md` + `referenceReads` |
54
62
  | ring 1 `loop: clarify` | Game Designer | `game-designer-workflow-detail.md` |
55
63
  | ring 1 `loop: clarify`(atom-tree) | temporary ref-flow subagent | `skill-selector-guide.md` + `docs/team/atom-tree-format.md` |
56
64
  | ring 2+ `loop: clarify`(atom-tree) | ref-flow subagent | `skill-selector-guide.md` + `docs/team/atom-tree-format.md` |
@@ -0,0 +1,35 @@
1
+ # Creative Director Guide
2
+
3
+ > **Superseded for execution:** use [creative-discovery-guide.md](./creative-discovery-guide.md) — this file remains a short index.
4
+
5
+ ## Quick links
6
+
7
+ | Need | Read |
8
+ | --------------------------------- | -------------------------------------------------------------------------- |
9
+ | Step-by-step Ring 1 creative | [creative-discovery-guide.md](./creative-discovery-guide.md) |
10
+ | Good/bad North Star examples | [creative-north-star-examples.md](./creative-north-star-examples.md) |
11
+ | Narrative Level + Emotional Arc | `templates/five-axis-framework.md` (via `state:get` → `referenceReads`) |
12
+ | MDA + JTBD | `templates/design-methodology.md` (via `referenceReads`) |
13
+ | Orchestrator kickoff (not for CD) | [creative-director-kickoff-guide.md](./creative-director-kickoff-guide.md) |
14
+
15
+ ## Objective
16
+
17
+ Discover a **playable idea with soul** — Micro-Story Spine + System Dynamic the player can feel, not a mechanism chain disguised as a one-liner.
18
+
19
+ ## Forbidden reads (context pollution)
20
+
21
+ Do **not** open:
22
+
23
+ - `templates/design.template.md`
24
+ - `skills/_shared/scripts/verify-design-consistency.mjs`
25
+ - `.claude/agents/refs/skill-selector-guide.md`
26
+ - `docs/team/atom-tree-format.md`
27
+ - `docs/DESIGN.md`
28
+
29
+ Do **not** run `playcraft skills *`, `npm run verify:design`, or `npm run levels:validate`.
30
+
31
+ ## STOP contract
32
+
33
+ - Write `handoffContext.northStarSummary` (≤80 words) via `npm run state:set`.
34
+ - Set `next_orchestrator_action` to invoke `@game-designer` for ring 1 design spec.
35
+ - Do **not** seed `sliceState`, write `DESIGN.md`, or run verifiers.
@@ -0,0 +1,52 @@
1
+ # Creative Director Kickoff Guide — Orchestrator Only
2
+
3
+ > **Audience**: Orchestrator when spawning `@creative-director` for Ring 1 `loop: clarify` (`1:creative`).
4
+ > **Prerequisite**: `@game-designer` mechanism lock STOP — `handoffContext.primaryGameplaySkill` + `docs/atom-tree.json` `meta.skillsMatch`.
5
+ > **Not for CD**: the subagent reads `creative-discovery-guide.md` instead.
6
+
7
+ ## Before spawn
8
+
9
+ 1. Run `npm run state:get` — confirm `nextRole: creative-director`.
10
+ 2. Read this guide.
11
+ 3. **Do not** forward the user's mechanism spec verbatim as the only prompt.
12
+
13
+ ## Task prompt template
14
+
15
+ Copy into the `@creative-director` Task message:
16
+
17
+ ```markdown
18
+ You are @creative-director for this PlayCraft playable-ad project.
19
+
20
+ ## Mechanism seed(已锁定 PGS,不是自由发明)
21
+
22
+ Primary skill: `{handoffContext.primaryGameplaySkill from state:get}`
23
+
24
+ {paste user's high-level intent — e.g. arrow + tray match-3 fusion, 8×8}
25
+
26
+ ## Creative question(CD 必须回答)
27
+
28
+ 在 **已 read 的 primary gameplay PGS** 上:Hook 帧是什么?压力在玩家世界里意味着什么?Payoff 必须拍到 **path slide out / fly to tray / tray match** 中的至少一个核心瞬间 — 不得用 rotate 或纯棋盘 cascade 替换。
29
+
30
+ ## JTBD guess / Emotional arc hint(仅 hint,CD 可改)
31
+
32
+ {Stress Relief → Relaxation | Challenge → Urgency | …}
33
+ 注:Orchestrator **不预设 Narrative Level**;L0/L1/L2 由 CD 在 Phase 3 裁决。
34
+ 若用户明确要求「纯机制 / 不要故事」,在此原文标注,供 CD 走 L0。
35
+
36
+ ## Deliverables
37
+
38
+ docs/north-star.md(含 Micro-Story Spine)+ docs/creative-process.md
39
+
40
+ ## Read on start
41
+
42
+ .claude/agents/refs/creative-discovery-guide.md
43
+ npm run state:get -- --json referenceReads contextPacket
44
+ playcraft skills read {primaryGameplaySkill}
45
+ ```
46
+
47
+ ## Rules
48
+
49
+ - Translate user intent into a **Creative question** grounded in the **read PGS** — never spawn CD with only "build arrow match-3 on 8×8".
50
+ - Optional: write `handoffContext.creativeBrief` via `state:set` (hint for GD spec phase).
51
+ - Use `bypassPermissions` for nested subagent Bash if harness/live test (known P0).
52
+ - After CD STOP: invoke `@game-designer` for ring 1 design spec only — do not inline creative work.
@@ -0,0 +1,76 @@
1
+ # Creative Discovery Guide
2
+
3
+ > Purpose: step-by-step execution for `@creative-director` — produce **`docs/north-star.md`** (with Micro-Story Spine) + **`docs/creative-process.md`** before any spec work.
4
+ >
5
+ > Scope: creative discovery only. Does not define skills match, level-sketch, atom-tree, or DESIGN.md mechanics tables.
6
+
7
+ ## Step 0 — Read state + methodology
8
+
9
+ ```bash
10
+ npm run state:get -- --json dispatchPacket contextPacket referenceReads
11
+ ```
12
+
13
+ 1. Read orchestrator kickoff notes (Creative question, mechanism seed, JTBD/arc hints — hints only).
14
+ 2. Read every path in **`referenceReads`** (typically `templates/five-axis-framework.md` §4–§5, `templates/design-methodology.md` §A–B, `.claude/agents/refs/creative-north-star-examples.md`).
15
+ 3. Skim user prompt / `contextPacket` for explicit L0 opt-out ("纯机制", "no story", "pure mechanic showcase").
16
+
17
+ ## Step 1 — MDA reverse + Narrative Level
18
+
19
+ From user intent, pick:
20
+
21
+ - **2–3 target Aesthetics** (Fantasy, Challenge, Urgency, …) — see design-methodology §A.
22
+ - **Narrative Level** (you decide):
23
+ - **Default L1 or L2** — light story that fits the mechanic.
24
+ - **L0 only** if user explicitly opted out of story — quote their words in Phase 3.
25
+ - **Never L3** — downgrade to L2 if tempted.
26
+
27
+ Lock Emotional Arc (Axis 5): Urgency | Challenge | Competence | Curiosity | Relaxation.
28
+
29
+ ## Step 2 — Phase 1 diverge (≥3 candidates)
30
+
31
+ Use `templates/game-designer-creative-process.template.md`. Each candidate **must** include:
32
+
33
+ - Core moment
34
+ - **Story hook** (15s filmable frame)
35
+ - **Who / Stakes** (one line each)
36
+
37
+ Do not write DESIGN.md yet.
38
+
39
+ ## Step 3 — Phase 2 adversarial (five questions)
40
+
41
+ Fill the five-question table. Q5 is the anti-filler gate: _If you remove Who and Situation, does anyone care?_
42
+
43
+ Produce ≥2 falsifiable vulnerability bullets.
44
+
45
+ ## Step 4 — Phase 3 commitment
46
+
47
+ - Pick one candidate.
48
+ - Record **Narrative level** + reason (L0: paste user's opt-out quote).
49
+ - Write patch promises addressing vulnerabilities.
50
+
51
+ ## Step 5 — Write north-star + creative-process
52
+
53
+ **`docs/north-star.md`** from `templates/north-star.template.md`:
54
+
55
+ | Field | L1/L2 | L0 |
56
+ | ------------ | ---------------------------- | ------------------------------ |
57
+ | Who | Required — concrete identity | `n/a — pure mechanic showcase` |
58
+ | Situation | Required — Hook frame | Required — mechanism spectacle |
59
+ | Stakes | Required — narrative meaning | Required — missed experience |
60
+ | Payoff image | Required | Required |
61
+ | One-liner | Must name Who or Situation | Hook + mechanic payoff OK |
62
+
63
+ **`docs/creative-process.md`:** Phases 1–3 complete + Phase 4 Design Intent line (= One-liner verbatim).
64
+
65
+ ## Step 6 — Self-check before STOP
66
+
67
+ 1. Can you describe the Hook frame in one breath?
68
+ 2. Does removing Who/Situation kill the pitch? (L1/L2 must survive Q5.)
69
+ 3. Is the story **fitted to the mechanic**, not a generic mascot pasted on?
70
+ 4. Design Intent === One-liner character-for-character?
71
+ 5. Compare against Bronze/Silver/Gold in `creative-north-star-examples.md` — are you at least Silver?
72
+
73
+ ## STOP handoff
74
+
75
+ - `handoffContext.northStarSummary` ≤80 words (include Who + Hook).
76
+ - `next_orchestrator_action`: Invoke @game-designer — ring 1 design spec.
@@ -0,0 +1,82 @@
1
+ # Creative North Star — Examples (Micro-Story Spine)
2
+
3
+ > **Used by**: `@creative-director` via `referenceReads` on `state:get`.
4
+ > **Narrative Level** terms align with `templates/five-axis-framework.md` Axis 4 (L0–L2 only; L3 forbidden).
5
+
6
+ ---
7
+
8
+ ## Tier guide
9
+
10
+ | Tier | Meaning |
11
+ | ---------- | ---------------------------------------------- |
12
+ | **Bronze** | Passes tension-word lint but no filmable story |
13
+ | **Silver** | Strong metaphor but missing Who/Situation |
14
+ | **Gold** | Complete Micro-Story Spine — target for L1/L2 |
15
+
16
+ ---
17
+
18
+ ## Bronze — Arrow Debt Tray (live smoke v1)
19
+
20
+ **Narrative level**: L1 (claimed) — **incomplete**
21
+
22
+ | Field | Content |
23
+ | --------- | --------------------------------------------------------------------------------------------------------------------------- |
24
+ | Who | _(missing)_ |
25
+ | Situation | _(missing)_ |
26
+ | Stakes | Abstract "debt / burst" |
27
+ | Payoff | Abstract "cash in match-3" |
28
+ | One-liner | "Play the nerve of opening one-way escape routes while the tray's growing debt dares you to cash in just before it bursts." |
29
+
30
+ **Why Bronze:** tension vocabulary without a story object. Player cannot answer "who am I" or "what am I escaping."
31
+
32
+ ---
33
+
34
+ ## Silver — Arrow Elim Fusion (fixture)
35
+
36
+ **Narrative level**: L1 — **incomplete**
37
+
38
+ | Field | Content |
39
+ | --------- | -------------------------------------------------------------------------- |
40
+ | Who | _(missing)_ |
41
+ | Situation | _(missing)_ |
42
+ | Stakes | "颜色是债务" metaphor |
43
+ | Payoff | "走钢丝上排雷" |
44
+ | One-liner | "颜色是债务——每推一条箭头进托盘,都在为未来的自己挖坑,像在走钢丝上排雷。" |
45
+
46
+ **Why Silver:** memorable metaphor, still no filmable Hook frame or identity.
47
+
48
+ ---
49
+
50
+ ## Gold — Night-Shift Cargo Gate (arrow + tray fusion, L2)
51
+
52
+ **Narrative level**: L2
53
+
54
+ | Field | Content |
55
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------- |
56
+ | Who | Night-shift warehouse loader |
57
+ | Situation | One-way chutes jammed with color-coded crates; bay lights flash amber — gate closes in minutes |
58
+ | Stakes | Bay locks when staging slots fill — next truck and the loader are stuck inside |
59
+ | Payoff image | Third matching crate slides in, bay door hisses open, chute clears with a satisfying rush |
60
+ | Emotional arc | Urgency |
61
+ | One-liner | "Help the night loader beat the closing gate — every crate you push buys seconds until three matching colors pop the bay open." |
62
+
63
+ ---
64
+
65
+ ## Genre table (L1/L2 patterns)
66
+
67
+ | Genre | Narrative level | Who | Situation | Stakes | Payoff |
68
+ | ------------------------------ | --------------- | ------------------ | -------------------------------- | -------------------------- | ------------------------- |
69
+ | Arrow + tray fusion | L2 | Night-shift loader | Chutes jammed, bay nearly full | Gate locks, loader trapped | Triple match, door opens |
70
+ | Screw puzzle | L2 | Repair hand | Board pins reward corner peeking | Mechanism never clears | Last panel drops |
71
+ | Pure match-3 (L0 opt-out only) | L0 | n/a | Board one move from huge clear | Miss the "almost" cascade | Full-board chain reaction |
72
+ | Chase / runner | L2 | Fugitive | Pursuer visible behind | Caught at the gap | Narrow squeeze through |
73
+
74
+ ---
75
+
76
+ ## Anti-patterns (do not ship)
77
+
78
+ - **Generic mascot:** "Help the cute hamster" with no tie to mechanic pressure.
79
+ - **Abstract tension only:** debt / bet / burst / nerve without Who or Situation.
80
+ - **Mechanism chain one-liner:** "Tap arrow → tray → match three → win."
81
+ - **PGS core-loop replacement:** rotate 90° / clockwise aim / board-only cascade instead of path slide → tray match from the locked skill.
82
+ - **L0 without opt-out quote:** choosing pure mechanic when user never asked for it.
@@ -12,7 +12,7 @@ npm run dev:start # starts persistent dev server + records the real devUrl
12
12
  ```
13
13
 
14
14
  - **Not** `playcraft start`, and **not** a bare `npm run dev`. `dev:start` wraps the project's `scripts.dev` and additionally:
15
- - detects the actual listening port from Vite output (handles port drift when 3000 is taken),
15
+ - detects the actual listening port from Vite output (handles port drift when 5173 is taken),
16
16
  - appends `?debug=1`,
17
17
  - writes `devUrl` through the same programmatic state layer `state:set` uses.
18
18
  - **Do not** read a port from the terminal or hand-edit `devUrl` — `dev:start` is the source of truth for it.
@@ -0,0 +1,28 @@
1
+ # Game Designer — Fusion Depth Playbook
2
+
3
+ Lightweight narrative templates for Ring 1 fusion designs. Pick one spine and **add one variation axis** (tray pressure / phase unlock / segment density).
4
+
5
+ ## Template 1 — Path → Tray → Match
6
+
7
+ - **Board**: fixed 8×8; paths are polylines with blocked dependencies (DAG).
8
+ - **Gesture**: tap path head → slide_out along direction → fly_to_tray.
9
+ - **Payoff**: match_clear in tray when 3 same color; tray peak forces color order.
10
+ - **Variation axis**: {tray pressure curve | opening removable count | segment density}
11
+
12
+ ## Template 2 — Phase Unlock (same grid)
13
+
14
+ - **Board**: 8×8 with masked regions (`boardPhases` in level-sketch optional).
15
+ - **Unlock**: each match_clear or N paths removed reveals new paths in unlocked zone.
16
+ - **Variation axis**: unlock cadence vs tray pressure — not board resize.
17
+
18
+ ## Template 3 — Tray Pressure Puzzle
19
+
20
+ - **Board**: pure dependency puzzle; match-3 **only in tray**.
21
+ - **Failure**: tray full without match; success requires reading color order before tap.
22
+ - **Variation axis**: dependency depth (≥2 waves) + max opening removable (1–2).
23
+
24
+ ## Anti-patterns (do not ship)
25
+
26
+ - 8×8 with ≤4 paths or all-free opening
27
+ - Board swap match-3 + path tap without interaction contract
28
+ - DESIGN lists two parent skills with no **interaction contract**
@@ -1,6 +1,6 @@
1
1
  # Gameplay Sufficiency Self-Check
2
2
 
3
- > **When to read**: Game Designer reads this at Step 2, after brainstorm is complete and the living brief is structurally complete. This is a **blocking gate** — do not proceed to Five-Axis Evaluation (Step 3) until all angles pass.
3
+ > **When to read**: `@game-designer` during Ring 1 clarify/spec when the living brief is structurally complete. This is a **blocking gate** — do not proceed to skills match / DESIGN seed until all angles pass.
4
4
  >
5
5
  > **Pattern**: Modeled on Flow B's "玩法核心充分性 Review" — 8 angles covering MDA, Game Feel, visual readability, and Playable Ad flow completeness.
6
6
 
@@ -8,9 +8,9 @@
8
8
 
9
9
  ## Purpose
10
10
 
11
- Verify that the design-brief contains enough gameplay depth to support module selection, five-axis evaluation, and downstream production. This check prevents the common failure mode of "proceeding with a technically complete but experientially shallow brief."
11
+ Verify that the design-brief contains enough gameplay depth to support module selection, five-axis choices (see `referenceReads`), and downstream production. This check prevents the common failure mode of "proceeding with a technically complete but experientially shallow brief."
12
12
 
13
- **Why before Five-Axis**: Five-Axis evaluation and Style Direction must serve the core gameplay. If the gameplay itself is underspecified, five-axis choices become disconnected from player experience.
13
+ **Why before spec construction**: Narrative Level and Style Direction must serve the core gameplay. If the gameplay itself is underspecified, five-axis choices become disconnected from player experience.
14
14
 
15
15
  ---
16
16
 
@@ -56,7 +56,7 @@ Write self-check results in internal notes or briefly in design-brief appendix:
56
56
 
57
57
  ## Decision
58
58
 
59
- - **All 8 ✅** → Proceed to Step 3 (Five-Axis Evaluation)
59
+ - **All 8 ✅** → Proceed to skills match + DESIGN seed (Ring 1 spec construction)
60
60
  - **Any ❌** → Return to Step 1 with specific angle as the brainstorm target. Ask user only about the gap (not re-do entire brainstorm).
61
61
 
62
62
  ---
@@ -109,6 +109,17 @@ You must not:
109
109
  - set user acceptance state
110
110
  - ask the user directly from a subagent
111
111
 
112
+ ## Ring 1 Design Adversarial (harness A2 / A3 only)
113
+
114
+ When `dispatchPacket.doWhat` or env `GD_CREATIVE_ARM` is `A2` or `A3`, and the packet asks for **design adversarial review**:
115
+
116
+ - **Read only**: `docs/creative-process.md` (phase 1 draft), `docs/design-brief.md`, optional partial `docs/DESIGN.md`
117
+ - **Do not** edit `game/**` or rewrite DESIGN — output a **vulnerability list** only
118
+ - Run the **four adversarial questions** on each candidate (second tap / ignore mechanism / white-box / depth ceiling)
119
+ - Format output as markdown section `## Design Adversarial Findings` in `logs/review-report.md` or append to `docs/creative-process.md` phase 2
120
+ - No aesthetic veto ("not fun enough") — only falsifiable logic gaps
121
+ - End with `PLAYCRAFT_STOP` — hand back to Game Designer for phase 3–4
122
+
112
123
  ## Legacy Fallback
113
124
 
114
125
  Only when `dispatchPacket` is null and `sliceState` is empty, follow [`refs/reviewer-legacy-fallback.md`](refs/reviewer-legacy-fallback.md).