@playcraft/cli 0.0.41 → 0.0.43

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 (69) hide show
  1. package/dist/atom-plan/validate-asr-coverage.js +317 -0
  2. package/dist/commands/prad.js +61 -0
  3. package/dist/commands/remix.js +4 -2
  4. package/dist/commands/skills.js +24 -0
  5. package/dist/commands/tools-generation.js +2 -4
  6. package/dist/commands/tools-utils.js +19 -0
  7. package/dist/prad/atom-ref.js +23 -0
  8. package/dist/prad/check.js +377 -0
  9. package/dist/prad/check.test.js +27 -0
  10. package/dist/prad/explain.js +109 -0
  11. package/dist/prad/load-spec.js +23 -0
  12. package/dist/prad/paths.js +83 -0
  13. package/dist/prad/skills-index.js +60 -0
  14. package/dist/utils/version-checker.js +8 -11
  15. package/package.json +3 -3
  16. package/project-template/.claude/agents/designer.md +34 -26
  17. package/project-template/.claude/agents/developer.md +55 -62
  18. package/project-template/.claude/agents/pm.md +3 -1
  19. package/project-template/.claude/agents/refs/README.md +21 -15
  20. package/project-template/.claude/agents/refs/designer-deliverable-spec.md +70 -7
  21. package/project-template/.claude/agents/refs/designer-handoff-v2-checklist.md +21 -13
  22. package/project-template/.claude/agents/refs/designer-master-composite-recipes.md +20 -28
  23. package/project-template/.claude/agents/refs/designer-style-exploration-flow.md +39 -9
  24. package/project-template/.claude/agents/refs/developer-dev-handoff.md +1 -1
  25. package/project-template/.claude/agents/refs/developer-phase1-flow.md +81 -156
  26. package/project-template/.claude/agents/refs/pm-workflow-detail.md +24 -2
  27. package/project-template/.claude/agents/refs/reviewer-convergence-eval.md +142 -0
  28. package/project-template/.claude/agents/refs/reviewer-six-dimension-eval.md +4 -284
  29. package/project-template/.claude/agents/refs/ta-atlas-deliverable-standard.md +27 -6
  30. package/project-template/.claude/agents/refs/ta-pipeline-cookbook.md +474 -29
  31. package/project-template/.claude/agents/reviewer.md +65 -38
  32. package/project-template/.claude/agents/technical-artist.md +38 -25
  33. package/project-template/.claude/hooks/README.md +40 -4
  34. package/project-template/.claude/hooks/asr-coverage-validate.mjs +381 -0
  35. package/project-template/.claude/hooks/validate-workflow-stop.mjs +196 -5
  36. package/project-template/.claude/settings.json +4 -0
  37. package/project-template/.claude/skills/playcraft-asset-state-sheet/SKILL.md +76 -22
  38. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +84 -15
  39. package/project-template/.claude/skills/playcraft-storyboard/SKILL.md +26 -7
  40. package/project-template/.claude/skills/playcraft-workflow/SKILL.md +104 -15
  41. package/project-template/.claude/skills/playwright-cli/SKILL.md +390 -0
  42. package/project-template/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
  43. package/project-template/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
  44. package/project-template/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
  45. package/project-template/.claude/skills/playwright-cli/references/running-code.md +240 -0
  46. package/project-template/.claude/skills/playwright-cli/references/session-management.md +226 -0
  47. package/project-template/.claude/skills/playwright-cli/references/spec-driven-testing.md +312 -0
  48. package/project-template/.claude/skills/playwright-cli/references/storage-state.md +275 -0
  49. package/project-template/.claude/skills/playwright-cli/references/test-generation.md +138 -0
  50. package/project-template/.claude/skills/playwright-cli/references/tracing.md +142 -0
  51. package/project-template/.claude/skills/playwright-cli/references/video-recording.md +157 -0
  52. package/project-template/.cursor/rules/playcraft-orchestrator.mdc +74 -24
  53. package/project-template/.cursor/rules/playcraft-subagent-boundary.mdc +1 -1
  54. package/project-template/CLAUDE.md +99 -59
  55. package/project-template/docs/team/agent-conduct.md +42 -26
  56. package/project-template/docs/team/agent-runtime-matrix.md +71 -39
  57. package/project-template/docs/team/atom-plan-format.md +101 -2
  58. package/project-template/docs/team/collaboration.md +57 -48
  59. package/project-template/docs/team/core-model.md +20 -19
  60. package/project-template/docs/team/workflow-changelog.md +28 -14
  61. package/project-template/docs/team/workflow-consistency-checklist.md +64 -0
  62. package/project-template/templates/atom-plan.template.json +18 -0
  63. package/project-template/templates/atom-plan.template.md +35 -3
  64. package/project-template/templates/designer-log.template.md +94 -5
  65. package/project-template/templates/developer-log.template.md +95 -101
  66. package/project-template/templates/layout-spec.template.md +62 -8
  67. package/project-template/templates/project-state.template.md +51 -33
  68. package/project-template/templates/review-report.template.md +76 -151
  69. package/project-template/templates/ta-log.template.md +180 -14
@@ -48,19 +48,67 @@ Repeat this section for each atom.
48
48
  Fill in details as you complete each one.
49
49
  -->
50
50
 
51
+ ## Image Production Preflight (Phase 1 — Gate #2b)
52
+
53
+ > **Mandatory before MC/ASR generation and before `#2b` STOP.** Read all three Skills; record key decisions.
54
+
55
+ | Skill / Check | 已读 | 关键决策摘要 |
56
+ | --------------------------- | ---- | -------------------------------------------------------- |
57
+ | playcraft-storyboard | ☐ | MC 45:16 · model whitelist · Panel 1 all element types |
58
+ | playcraft-asset-state-sheet | ☐ | ASR grid · isolated cells · sheet #808080 · cell chroma |
59
+ | playcraft-image-generation | ☐ | §3 chroma matrix · §3.1 ASR branch · no remove-bg on ASR |
60
+
61
+ <!--
62
+ MUST be filled before generating ASR (Step 4) and before Gate #2b STOP.
63
+ Hook validate-workflow-stop enforces this section in style_exploration stage.
64
+ -->
65
+
51
66
  ## ASR Coverage Matrix (designer-handoff-v2 — 100% contract rows)
52
67
 
53
68
  > UI: `assets/images/reference/ui_state_sheet_{{option}}.png`
54
69
  > Element: `assets/images/reference/element_state_sheet_{{option}}.png`
55
70
 
56
- | Contract id | Type | ASR sheet | Grid (row,col) | State(s) | TA extends? |
57
- | -------------------------------- | ------ | ------------ | -------------- | ----------- | ----------- |
58
- | {{element_id_from_assetMapping}} | visual | ui / element | {{1,1}} | {{default}} | {{yes/no}} |
59
- | {{static_text_id}} | text | ui / MC-crop | | baked | {{yes/no}} |
71
+ ### Sheet grid metadata ( TA crop 计算)
72
+
73
+ | Sheet | Total rows | Total cols | Cell W×H (px) | Cell padding (px) | Origin |
74
+ | -------------------------------------- | ------------- | ---------- | ------------- | ----------------- | ----------------- |
75
+ | `ui_state_sheet_{{option}}.png` | 2 | 4 | 800×800 | 80 | top-left (R1, C1) |
76
+ | `element_state_sheet_{{option}}.png` | 2 | 4 | 800×800 | 80 | top-left (R1, C1) |
77
+ | `element_state_sheet_{{option}}_2.png` | (if overflow) | | | | |
78
+
79
+ <!--
80
+ Grid coordinates use 1-based indexing, row-major.
81
+ Cell W×H = visible cell area (without padding). Padding = margin between cells AND outer margin.
82
+ Pixel coordinates of cell (R, C):
83
+ x = (C - 1) × (cellW + padding) + padding
84
+ y = (R - 1) × (cellH + padding) + padding
85
+ TA uses these for `playcraft image crop --x ... --y ... --width cellW --height cellH`.
86
+ -->
87
+
88
+ ### Coverage
89
+
90
+ | Contract id | elementType | Type | CoverageLayer | ASR sheet | Grid (row,col) | State(s) | TA extends? |
91
+ | -------------------------------- | ----------- | ------ | ----------------------------- | ------------ | -------------- | ----------- | ----------- |
92
+ | {{element_id_from_assetMapping}} | {{type}} | visual | on-asr / mc-crop / ta-extends | ui / element | {{R1C1}} | {{default}} | {{yes/no}} |
93
+ | {{static_text_id}} | — | text | mc-crop or on-asr | ui / MC-crop | — | baked | {{yes/no}} |
60
94
 
61
95
  <!--
62
96
  One row per layout-spec assetMapping elementId and per static text id.
63
- TA crop index + Phase 2 VisualAtom actualOutput: ASR:sheet:R#C#
97
+ CoverageLayer:
98
+ on-asr — physical slot on ASR PNG; Grid required; mirror atoms[].asrSlot
99
+ mc-crop — MC Panel 1 only; ASR sheet = MC-crop
100
+ ta-extends — variant/extra states; TA extends? = yes + Style Intent note
101
+
102
+ Type rule: each distinct elementType must have ≥1 row with on-asr OR mc-crop.
103
+ Grid syntax: R{row}C{col}, e.g. R1C2, 1-based, row-major.
104
+ TA crop + Phase 2 VisualAtom actualOutput: ASR:<sheet>:R#C#
105
+
106
+ After filling this table, MIRROR each visual row into atom-plan.json:
107
+ atoms[].asrSlot = { "sheet": "ui" | "element", "row": <n>, "col": <n> }
108
+
109
+ This lets TA batch-crop from atom-plan.json directly (see ta-pipeline-cookbook.md
110
+ § ASR 提取方法 "优先路径") instead of manually re-reading this Coverage table.
111
+ See docs/team/atom-plan-format.md § `asrSlot` for full schema + crop formula.
64
112
  -->
65
113
 
66
114
  ## Palette Locked (from MC option {{option}})
@@ -74,6 +122,47 @@ TA crop index + Phase 2 VisualAtom actualOutput: ASR:sheet:R#C#
74
122
 
75
123
  **Delta vs layout-spec Color Palette**: {{match | PM update: one line}}
76
124
 
125
+ ## Skill Preflight (Phase 2)
126
+
127
+ > **Mandatory before audio/digit production.** Read relevant Skills + check mediaGroups.
128
+
129
+ | Skill / Check | 已读 | 关键决策摘要 |
130
+ | -------------------------- | ---- | --------------------------------------------- |
131
+ | playcraft-audio-generation | ☐ | {{BGM mood, SFX prompt pattern, loop config}} |
132
+ | playcraft-text-rendering | ☐ | {{digit strip chroma strategy, font style}} |
133
+ | playcraft-image-generation | ☐ | {{background decision for digit strip}} |
134
+ | mediaGroups (.aiaudio) | ☐ | {{linked: X, skipped: Y, reason: Z}} |
135
+
136
+ <!--
137
+ MUST be filled before generating any audio or digit strip in Phase 2.
138
+ mediaGroups: list each .aiaudio match disposition (linked/skipped + reason).
139
+ -->
140
+
141
+ ## mediaGroups Reuse (Phase 2)
142
+
143
+ > **Mandatory before any audio generation.** Filter `atom-plan.json` → `skillsMatch.mediaGroups` by `extension`; Designer is responsible for **`.aiaudio` only** (TA handles `.aiimage` / `.aisprite`).
144
+
145
+ | mediaGroup atomId | extension | Matches Designer atom? | Disposition | Reason (if skipped) | Output path (if linked) |
146
+ | ----------------- | --------- | ---------------------- | ------------- | ---------------------------------- | ----------------------- |
147
+ | {{mg_atomId}} | .aiaudio | {{atom_id / —}} | linked / skip | {{mood mismatch / wrong loop / —}} | {{path / —}} |
148
+
149
+ <!--
150
+ Designer scope (this table):
151
+ .aiaudio — BGM / SFX bundles → link or skip (with reason)
152
+
153
+ Out of Designer scope (do NOT fill rows for these — TA owns them):
154
+ .aiimage — single-shot image atoms
155
+ .aisprite — sprite-sheet atoms (multi-frame)
156
+ .aigameplay / .aiconfig — Developer reads via skillRef
157
+
158
+ Filter command:
159
+ cat docs/atom-plan.json | jq '.skillsMatch.mediaGroups[] | select(.extension == ".aiaudio")'
160
+
161
+ Disposition rules:
162
+ linked → playcraft skills link → verify mood matches MC → status: done
163
+ skip → quality / mood / loop mismatch → document reason → generate from scratch
164
+ -->
165
+
77
166
  ## Style Consistency Self-Check
78
167
 
79
168
  - [ ] All visual assets share the same art style?
@@ -2,116 +2,119 @@
2
2
 
3
3
  ## Upstream Intake
4
4
 
5
- > **Step 0 — mandatory before Spec Quick-Check or any `game/` edit.** Summarize what PM/Designer/TA already decided so implementation matches intent.
5
+ > **Step 0 — mandatory before Spec Quick-Check or any `game/` edit.**
6
+
7
+ | Doc | Read ✓ | One-line takeaway |
8
+ | --------------------------- | ------ | ----------------------------------------- |
9
+ | `docs/project-state.md` | ☐ | {{e.g. ui_pass, Wave 2 done}} |
10
+ | `docs/design-brief.md` | ☐ | {{e.g. flow scenes for navigation}} |
11
+ | `docs/layout-spec.md` | ☐ | {{e.g. zones, assetMapping, atlas paths}} |
12
+ | `docs/atom-plan.json` | ☐ | {{e.g. Developer atoms + skillRefs}} |
13
+ | `docs/atom-plan.md` | ☐ | Impl Skill Context + acceptance |
14
+ | `docs/style-exploration.md` | ☐ | {{e.g. MC panel layout per scene}} |
15
+ | `logs/designer-log.md` | ☐ | {{e.g. palette locked, motion notes}} |
16
+ | `logs/ta-log.md` | ☐ | {{e.g. compliance green, atlas params}} |
6
17
 
7
- | Doc | Read ✓ | One-line takeaway (what you will implement from it) |
8
- | --------------------------- | ------ | ------------------------------------------------------ |
9
- | `docs/project-state.md` | ☐ | {{e.g. integration, Wave 2 done, no spec-gap}} |
10
- | `docs/design-brief.md` | ☐ | {{e.g. PGS=match-3, tutorial 2 taps, first level win}} |
11
- | `docs/layout-spec.md` | ☐ | {{e.g. board zone, tile atlas path + frameIds}} |
12
- | `docs/atom-plan.json` | ☐ | {{e.g. 6 Developer atoms, skillRef memory_match}} |
13
- | `docs/atom-plan.md` | ☐ | Impl Skill Context + acceptance criteria |
14
- | `docs/style-exploration.md` | ☐ | {{e.g. MC panel1 UI layout, Hook frame contrast}} |
15
- | `logs/designer-log.md` | ☐ | {{e.g. motion: slow-mo near-win}} |
16
- | `logs/ta-log.md` | ☐ | {{e.g. Compliance green, tile atlas 8 frames}} |
18
+ ---
19
+
20
+ ## Skill Preflight
21
+
22
+ > **Before any `game/` edits (ui_pass).** See `refs/developer-phase1-flow.md` Step 3.
17
23
 
18
- **MUST NOT** start Skill Preflight until every row is checked with a non-empty takeaway.
24
+ | skillRef | access | `ref/` files read (paths) | `scaffold` included |
25
+ | ------------ | --------------------- | ------------------------- | ------------------- |
26
+ | {{skillRef}} | linked / cli-fallback | {{paths}} | yes / no |
19
27
 
20
28
  ---
21
29
 
22
- ## Skill Preflight
30
+ ## UI Pass Plan
23
31
 
24
- > **Ph.1 gate — before any `game/` edits.** Per `docs/atom-plan.json` `atoms[]` (`assignTo: Developer`, non-null `skillRef`). See `refs/developer-phase1-flow.md` Step 3.
32
+ > **ui_pass onlymandatory before UI implementation.** Hook enforces on STOP.
25
33
 
26
- | skillRef | access | `ref/` files read (paths) | `scaffold` included |
27
- | ------------ | --------------------- | ----------------------------------------------- | ------------------- |
28
- | {{skillRef}} | linked / cli-fallback | {{e.g. .claude/skills/.../ref/pgs-schema.json}} | yes / no |
34
+ ### Architecture
29
35
 
30
- ```bash
31
- # Paste actual CLI output snippets (or summary) below — empty section = Ph.1 incomplete
32
- {{skills_read_and_scaffold_output}}
33
- ```
36
+ - **Engine**: {{engine}}
37
+ - **Entry**: `game/index.html`
38
+ - **Scene flow**: Hook → Tutorial → EndCard → CTA (navigation only in ui_pass)
34
39
 
35
- <!--
36
- Rules:
37
- - One row per non-dash skillRef from atom-plan
38
- - access: `linked` = read `.claude/skills/<skillRef>/`; `cli-fallback` = soft link missing, used `playcraft skills read` + Package Skills Root
39
- - If skillRef = — for an atom, note "skills match" or playcraft-research in Impl Skill Context instead
40
- - Do NOT mark GameplayAtom/ConfigAtom done in atom-plan until this table is filled
41
- -->
40
+ ### Scene-Asset Binding Plan
42
41
 
43
- ## Delivery Summary
42
+ | Scene | Assets (assetMapping) | Atlas/Frame | On disk? |
43
+ | -------- | --------------------- | ----------- | -------- |
44
+ | hook | {{paths}} | {{json}} | {{y/n}} |
45
+ | tutorial | {{paths}} | {{json}} | {{y/n}} |
46
+ | endcard | {{paths}} | {{json}} | {{y/n}} |
44
47
 
45
- - **Assigned**: {{total_assigned}}
46
- - **Completed**: {{total_completed}}
47
- - **Bindings resolved**: {{resolved}}/{{total_bindings}}
48
+ ### Scene navigation (for Reviewer ui_diff)
48
49
 
49
- ## Experience Flow Code Mapping
50
+ | MC panel | Scene key | How to reach (URL param / button) |
51
+ | ---------- | ----------- | ---------------------------------- |
52
+ | Concept | {{initial}} | {{e.g. ?scene=main or default}} |
53
+ | Hook | hook | {{e.g. ?scene=hook}} |
54
+ | Onboarding | tutorial | {{e.g. button or ?scene=tutorial}} |
55
+ | EndCard | endcard | {{...}} |
56
+ | CTA | cta | {{...}} |
50
57
 
51
- > **Step 0c — Mandatory. Map each storyboard frame to code scene.**
52
- > Read `docs/style-exploration.md` concept mockup + storyboard composite image before implementing.
53
- > The storyboard is a single composite image with 4 frames in a grid — study each frame's position.
54
-
55
- | Storyboard Frame | Scene/State | Code Location | Visual Intent |
56
- | ------------------------- | ---------------- | ------------------------- | ----------------------------- |
57
- | Hook (0-3s) | `scene.hook` | `game/scenes/hook.ts` | {{visual_intent_description}} |
58
- | Tutorial (3-10s) | `scene.tutorial` | `game/scenes/tutorial.ts` | {{visual_intent_description}} |
59
- | Gameplay+NearWin (10-25s) | `scene.gameplay` | `game/scenes/gameplay.ts` | {{visual_intent_description}} |
60
- | EndCard (25-30s) | `scene.endcard` | `game/scenes/endcard.ts` | {{visual_intent_description}} |
61
-
62
- <!--
63
- Rules:
64
- - Every scene code file MUST have a top comment referencing the storyboard:
65
- // Visual reference: assets/images/storyboard/storyboard_confirmed.png (frame: top-left=Hook)
66
- - If storyboard frame visuals conflict with layout-spec zones coordinates:
67
- → storyboard takes precedence, ask PM in intent-clarifications.md
68
- - Visual Intent column should capture the EMOTION and ATTENTION FLOW, not just mechanics
69
- -->
58
+ ### Risk Checklist (ui_pass)
70
59
 
71
- ## Per-Atom Delivery
60
+ - [ ] Every assetMapping path verified on disk
61
+ - [ ] Scene navigation documented for all 5 MC panels
62
+ - [ ] No core gameplay rules in ui_pass scope
63
+ - [ ] No external network dependencies
72
64
 
73
- ### {{atom_id}} — {{slot_name}}
65
+ ---
74
66
 
75
- - **Status**: {{status}}
76
- - **Reference Skill**: {{skillRef}} (Skill Preflight: linked or cli-fallback + ref/)
77
- - **Output path**: {{file_path}}
78
- - **Test results**: {{passed}}/{{total}} passed
79
- - **Notes**: {{implementation_notes}}
67
+ ## Gameplay Pass Plan
68
+
69
+ > **gameplay_pass only — mandatory before PGS / rules implementation.**
80
70
 
81
- <!--
82
- Repeat for each atom.
83
- For GameplayAtom: include PGS path + test results
84
- For ConfigAtom: include config path + parameter summary
85
- -->
71
+ ### PGS Strategy
86
72
 
87
- ## Binding Status
73
+ - **Gameplay type**: {{from design-brief}}
74
+ - **Core rules**: {{from Skill recipe}}
75
+ - **First level guarantee**: {{how tutorial ensures win}}
76
+ - **State machine**: {{states and transitions}}
88
77
 
89
- | Binding Target | Source Atom | File | Status |
90
- | ---------------------------- | ------------------ | ------------------- | -------------------------- |
91
- | {{scene_path_or_config_key}} | {{source_atom_id}} | {{asset_file_path}} | {{bound/missing/mismatch}} |
78
+ ### Risk Checklist (gameplay_pass)
92
79
 
93
- <!--
94
- List every asset reference in your code:
95
- - Every image loaded from assets/images/
96
- - Every audio file referenced from assets/audio/
97
- - Every config value from layout-spec
80
+ - [ ] UI shell unchanged unless open UI Diff items
81
+ - [ ] testCases written before rule implementation
82
+ - [ ] First level guarantees player success
83
+ - [ ] CTA handler with platform fallbacks
84
+ - [ ] Zero external network requests
85
+
86
+ ---
87
+
88
+ ## Experience Flow → Code Mapping
98
89
 
99
- Status values:
100
- bound — File exists and is correctly referenced
101
- missing — File not found at expected path
102
- mismatch File exists but wrong dimensions/format
103
- -->
90
+ | Storyboard Frame | Scene/State | Code Location | Visual Intent |
91
+ | ---------------- | ---------------- | ------------------------- | ------------- |
92
+ | Hook | `scene.hook` | `game/scenes/hook.ts` | {{intent}} |
93
+ | Tutorial | `scene.tutorial` | `game/scenes/tutorial.ts` | {{intent}} |
94
+ | Gameplay | `scene.gameplay` | `game/scenes/gameplay.ts` | {{intent}} |
95
+ | EndCard | `scene.endcard` | `game/scenes/endcard.ts` | {{intent}} |
96
+
97
+ ---
104
98
 
105
99
  ## Dev self-check
106
100
 
107
- > After `npm run dev` — record each integration pass. See `refs/developer-dev-handoff.md`.
101
+ ### ui_pass completion
108
102
 
109
103
  - **devUrl**: {{http://localhost:...}}
110
- - **devLastChecked**: {{ISO timestamp}}
104
+ - **devStatus**: ui_ready
111
105
  - **UI vs MC + layout-spec**: {{pass/fail — notes}}
106
+ - **Scene navigation works**: {{yes/no}}
107
+ - **Ready for Reviewer ui_diff**: {{yes/no}}
108
+
109
+ ### gameplay_pass completion
110
+
111
+ - **devUrl**: {{http://localhost:...}}
112
+ - **devStatus**: ready
112
113
  - **Gameplay vs design-brief + PGS**: {{pass/fail — notes}}
113
- - **Runtime** (no white screen, CTA, audio, state machine): {{pass/fail — notes}}
114
- - **Ready for Reviewer**: {{yes/no}}
114
+ - **Runtime** (CTA, audio, state machine): {{pass/fail — notes}}
115
+ - **Ready for Reviewer load_check**: {{yes/no}}
116
+
117
+ ---
115
118
 
116
119
  ## Upstream blockers
117
120
 
@@ -119,22 +122,13 @@ Status values:
119
122
  | -------- | --------- | -------------- | ------------------ | --------------- |
120
123
  | {{path}} | {{issue}} | {{acceptance}} | TA / Designer / PM | open / resolved |
121
124
 
122
- <!--
123
- When any row is open:
124
- - Set project-state devStatus: blocked_upstream
125
- - Write intent-clarifications.md with acceptance criteria
126
- - STOPwait for orchestrator rework invoke
127
- -->
128
-
129
- ## Technical Self-Check (static)
130
-
131
- - [ ] Board dimensions match layout-spec `zones["board"].rect`?
132
- - [ ] Element IDs match layout-spec `colorPalette.tileColors[].id`?
133
- - [ ] All asset paths match layout-spec `assetMapping`?
134
- - [ ] Zero external network requests (no fetch/XHR/external scripts)?
135
- - [ ] CTA handler implemented with multi-platform fallback?
136
- - [ ] `game/index.html` has viewport meta with user-scalable=no?
137
- - [ ] All CSS/JS inline (no external resources)?
138
- - [ ] First level guarantees player success?
139
-
140
- > **Not required for integration complete**: `playcraft build` (future delivery path only).
125
+ ---
126
+
127
+ ## Per-Atom Delivery
128
+
129
+ ### {{atom_id}}{{slot_name}}
130
+
131
+ - **Status**: {{status}}
132
+ - **Phase**: ui_pass / gameplay_pass
133
+ - **Output path**: {{file_path}}
134
+ - **Notes**: {{notes}}
@@ -82,12 +82,33 @@ Single large assets (full-screen bg) → one webp path only. Digit strip → sep
82
82
  Each elementId in assetMapping uses atlasPath + frameId OR single visualAsset path.
83
83
  -->
84
84
 
85
+ Single-element groups stay as single-file paths; do not invent atlases for one texture.
86
+
87
+ ---
88
+
89
+ ## Element Type Registry (ASR capacity budget)
90
+
91
+ Group `assetMapping` elementIds by **visual type** before Gate #1 lock. Designer needs **one representative per type** on ASR or MC Panel 1; color variants are `ta-extends`.
92
+
93
+ | typeId | elementIds (variants) | Notes |
94
+ | -------- | ---------------------------- | ------------------------------- |
95
+ | {{type}} | {{id_a}}, {{id_b}}, {{id_c}} | e.g. tile colors share one type |
96
+
97
+ **Budget**: aim for **≤ 20 unique types** and **≤ ~24 ASR physical slots** (ui board ~12 + element board ~12). If types > 12, plan `element_state_sheet_[X]_2.png` or extra `mc-crop` + `ta-extends` rows.
98
+
99
+ Designer Coverage Matrix **elementType** column should match `typeId` here.
100
+
101
+ ---
102
+
85
103
  ## Asset Mapping
86
104
 
87
105
  | elementId | visualAsset / atlas | frameId | sfx |
88
106
  | -------------- | ------------------------------------- | ------- | ------------------------------------- |
89
107
  | {{element_id}} | assets/images/tiles/tiles_atlas.webp | tile_01 | {{sfx_path_or_dash}} |
90
108
  | — | assets/images/bg/{{bg_filename}}.webp | — | — |
109
+ | — | assets/images/ui/{{ui_element}}.webp | — | — |
110
+ | — | assets/images/txt/{{text}}.webp | — | — |
111
+ | — | assets/images/vfx/{{vfx}}.webp | — | — |
91
112
  | — | — | — | assets/audio/sfx/{{sfx_filename}}.mp3 |
92
113
  | — | — | — | assets/audio/bgm/{{bgm_filename}}.mp3 |
93
114
 
@@ -97,6 +118,17 @@ CRITICAL: This mapping is the integration contract!
97
118
  - Developer references EXACTLY these paths in code
98
119
  - Path mismatch = integration failure
99
120
  - Use "—" for cells that don't apply
121
+
122
+ Transparency convention (TA auto-derives from path — PM does NOT define):
123
+ assets/images/bg/ → opaque, full-screen background (TA verifies edge-to-edge)
124
+ assets/images/ui/ → needs alpha (TA applies chroma key + remove-background)
125
+ assets/images/txt/ → needs alpha (TA applies chroma key + remove-background)
126
+ assets/images/vfx/ → needs alpha (TA applies chroma key + remove-background)
127
+ assets/images/tiles/ → needs alpha by default (except card faces / board pieces)
128
+ assets/audio/ → N/A (not image)
129
+
130
+ TA determines chroma key color (green/blue/magenta) based on element color palette
131
+ and color conflict rules — see ta-pipeline-cookbook.md Step 0e.
100
132
  -->
101
133
 
102
134
  ## Text Assets
@@ -117,16 +149,38 @@ TA extracts each text element using segment and saves to the specified path.
117
149
 
118
150
  ### Digit Sprite Strip (for dynamic numbers)
119
151
 
120
- - **Characters**: `{{digit_characters}}`
152
+ - **Characters**: `{{digit_characters}}` _(typical "0123456789" — frameCount = 10)_
121
153
  - **Cell size**: {{cell_w}}x{{cell_h}}
122
- - **Asset path**: `assets/images/ui/digits.webp`
154
+ - **Asset path**: `assets/images/txt/digits.webp` _(recommended: text-class lives under `images/txt/` per Transparency Classification)_
155
+ - **Sidecar path (optional)**: `assets/images/txt/digits.json` _(only when laid out as multi-row grid; single-row strip can omit)_
156
+ - **Layout**: single-row horizontal strip (default) — total width = `cell_w × frameCount`, height = `cell_h`
157
+ - **Alpha**: required (channels = 4); TA uses **bluescreen** chroma (text typically gold/white — avoid green key)
123
158
 
124
159
  <!--
125
160
  PM defines the character set based on what dynamic text the game needs.
126
- Common sets:
127
- - Score only: "0123456789"
128
- - Score + timer: "0123456789:."
129
- - Score + multiplier: "0123456789x+,."
130
- Designer generates a single horizontal strip image with all characters in order.
131
- Developer slices by character index at runtime (char_x = index * cell_w).
161
+
162
+ Common sets (always include digits 0–9 first, then any symbols):
163
+ - Score only: "0123456789" (frameCount = 10)
164
+ - Score + timer: "0123456789:." (frameCount = 12)
165
+ - Score + multiplier: "0123456789x+,." (frameCount = 14)
166
+
167
+ Path convention (TA Transparency Classification + Compliance Gate):
168
+ - `assets/images/txt/digits.webp` — preferred (text class → bluescreen, channels=4)
169
+ - `assets/images/txt/digits_{{label}}.webp` — when multiple digit styles exist (score / countdown / level)
170
+ - Legacy `assets/images/ui/digits.webp` works but TA must still classify it as text (bluescreen, not greenscreen).
171
+
172
+ Layout (default single horizontal row):
173
+ - Total width = cell_w × frameCount
174
+ - Total height = cell_h
175
+ - Cell origin (0-based, row-major): x = index × cell_w, y = 0
176
+ - Developer slices at runtime: char_x = index × cell_w
177
+
178
+ Multi-row digit grid (rare — e.g. small + large digits in one sheet) MUST supply a `.json` sidecar
179
+ describing each frame; Compliance Gate then checks dimensions against that sidecar.
180
+
181
+ Compliance Gate (TA verifies before STOP):
182
+ - frameCount = character count above
183
+ - total width × height matches the layout (single-row or sidecar)
184
+ - channels = 4 (alpha)
185
+ - dark-bg verify: no chroma residue around digit edges
132
186
  -->
@@ -4,11 +4,11 @@
4
4
 
5
5
  | Field | Value |
6
6
  | ----------------------- | --------------------------------------------------------------------- |
7
- | **workflowSpecVersion** | `production-serial-v1` |
7
+ | **workflowSpecVersion** | `convergence-v1` |
8
8
  | **Changelog** | [docs/team/workflow-changelog.md](../docs/team/workflow-changelog.md) |
9
9
 
10
10
  <!--
11
- production-serial-v1: Gate #2b production Wave 1 Designer Ph.2Wave 2 TA integration Developer.
11
+ convergence-v1: Three convergence loops design_check (Gate #1/#2b) ui_pass/ui_review/ui_reworkgameplay_pass/load_checkGate #3.
12
12
  Visual baseline (designer-handoff-v2): Phase 1 = MC + ASR; Phase 2 Designer = audio + digit strip + VisualAtom status only.
13
13
  -->
14
14
 
@@ -32,7 +32,7 @@
32
32
 
33
33
  **{{current_stage}}** — {{stage_description}}
34
34
 
35
- `pm` → `style_exploration` → `production` → `integration` → `review` ⇄ `rework` → `done`
35
+ `pm` → `style_exploration` → `production` → `ui_pass` → `ui_review` ⇄ `ui_rework` → `gameplay_pass` → `done`
36
36
 
37
37
  <!-- Stage definitions: see CLAUDE.md § Stage Model -->
38
38
 
@@ -40,12 +40,12 @@
40
40
 
41
41
  > Only the **orchestrator** runs `AskUserQuestion` toward the user. Sub-agents set `pending` and STOP.
42
42
 
43
- | Gate | Status | Notes |
44
- | ------------------ | ------------------ | ------------------------------------------------------------------------------- |
45
- | #1 Direction | {{passed/pending}} | Orchestrator confirms after PM four docs + STOP |
46
- | #2a MC selection | {{passed/pending}} | Orchestrator picks A/B/C → sets `selectedMcOption` below |
47
- | #2b MC + ASR final | {{passed/pending}} | Orchestrator confirms MC + ASR sheets (UI + element) then `stage: production` |
48
- | #3 Dev acceptance | {{passed/pending}} | User opens devUrl (orchestrator link only) |
43
+ | Gate | Status | Notes |
44
+ | ------------------ | ------------------ | ---------------------------------------------------------------------------- |
45
+ | #1 Direction | {{passed/pending}} | Orchestrator confirms after PM four docs + Reviewer design_check + STOP |
46
+ | #2a MC selection | {{passed/pending}} | Orchestrator picks A/B/C → sets `selectedMcOption` below |
47
+ | #2b MC + ASR final | {{passed/pending}} | Reviewer design_check → Orchestrator confirms MC + ASR → `stage: production` |
48
+ | #3 Dev acceptance | {{passed/pending}} | Reviewer load_check pass → user opens devUrl (orchestrator link only) |
49
49
 
50
50
  ## Agent handoff
51
51
 
@@ -82,13 +82,21 @@ Designer Gate #2a STOP:
82
82
  next_orchestrator_action: "Run Gate #2a"
83
83
  last_completed_by: designer
84
84
 
85
- Developer integration STOP:
85
+ Developer ui_pass STOP:
86
86
  subagent: developer
87
87
  subagent_stop: true
88
88
  waiting_for: orchestrator
89
89
  gate_pending: null
90
- next_orchestrator_action: "Invoke @reviewer"
90
+ next_orchestrator_action: "Invoke @reviewer ui_diff"
91
91
  last_completed_by: developer
92
+
93
+ Reviewer ui_diff pass STOP:
94
+ subagent: reviewer
95
+ subagent_stop: true
96
+ waiting_for: orchestrator
97
+ gate_pending: null
98
+ next_orchestrator_action: "Set stage=gameplay_pass, invoke @developer"
99
+ last_completed_by: reviewer
92
100
  -->
93
101
 
94
102
  ## Gate resume fields
@@ -96,30 +104,40 @@ Developer integration STOP:
96
104
  | Field | Value |
97
105
  | ---------------- | -------------------------------------------------- |
98
106
  | selectedMcOption | {{A / B / C — set by orchestrator after Gate #2a}} |
99
- | reworkRound | {{0 / 1 / 2 — incremented by Reviewer on fail}} |
107
+ | uiReworkRound | {{0–5 — incremented by Reviewer on ui_diff fail}} |
100
108
 
101
109
  ## Dev Preview
102
110
 
103
- | Field | Value |
104
- | ---------------- | ---------------------------------------------------------------------------- |
105
- | devCommand | npm run dev |
106
- | devScript | {{from package.json scripts.dev}} |
107
- | devUrl | {{http://... — Developer records when ready; orchestrator uses for Gate #3}} |
108
- | devStatus | pending / ready / blocked_upstream / failed |
109
- | devBlockers | {{list: assetPath, issue, routeTo (TA/Designer/PM), status}} |
110
- | devStartedBy | developer / reviewer / orchestrator |
111
- | devLastChecked | {{ISO timestamp}} |
112
- | reviewerDevCheck | pending / passed / failed |
113
- | reviewerDevNotes | {{UI + gameplay check summary}} |
111
+ | Field | Value |
112
+ | -------------- | ---------------------------------------------------------------------------- |
113
+ | devCommand | npm run dev |
114
+ | devScript | {{from package.json scripts.dev}} |
115
+ | devUrl | {{http://... — Developer records when ready; orchestrator uses for Gate #3}} |
116
+ | devStatus | pending / ui_ready / ready / blocked_upstream / failed |
117
+ | devBlockers | {{list: assetPath, issue, routeTo (TA/Designer/PM), status}} |
118
+ | devStartedBy | developer / reviewer / orchestrator |
119
+ | devLastChecked | {{ISO timestamp}} |
120
+ | loadCheck | pending / passed / failed |
121
+ | loadCheckNotes | {{console errors, white screen, load time}} |
122
+
123
+ ## UI Review
124
+
125
+ | Field | Value |
126
+ | ---------------- | ------------------------------------------ |
127
+ | uiReviewStatus | pending / passed / failed |
128
+ | uiReworkRound | {{0–5}} |
129
+ | uiDiffReportPath | logs/review-report.md |
130
+ | uiDiffNotes | {{summary of MC vs screenshot comparison}} |
114
131
 
115
132
  <!--
116
133
  devStatus:
117
- pending — integration not finished
118
- ready Developer self-check passed, no open blockers; safe to invoke Reviewer
134
+ pending — ui_pass or gameplay_pass not finished
135
+ ui_ready UI shell complete (scene switch, layout, simple states); safe to invoke Reviewer ui_diff
136
+ ready — gameplay_pass complete; safe to invoke Reviewer load_check
119
137
  blocked_upstream — Developer waiting on TA/Designer rework (orchestrator re-invokes)
120
138
  failed — dev server could not start; document error
121
139
 
122
- Developer MUST NOT set ready while devBlockers has open items.
140
+ Developer MUST NOT set ui_ready/ready while devBlockers has open items.
123
141
  -->
124
142
 
125
143
  ## File Index
@@ -164,21 +182,21 @@ Developer MUST NOT set ready while devBlockers has open items.
164
182
 
165
183
  ### Reviewer Output
166
184
 
167
- | File | Description | Status |
168
- | --------------------------------------------------------- | ------------------------------------------------ | ---------- |
169
- | [review-report.md](logs/review-report.md) | Six-dimension evaluation + Dev walkthrough notes | {{status}} |
170
- | [intent-clarifications.md](docs/intent-clarifications.md) | Agent-to-agent Q&A (ICP) | {{status}} |
185
+ | File | Description | Status |
186
+ | --------------------------------------------------------- | ------------------------------------------- | ---------- |
187
+ | [review-report.md](logs/review-report.md) | design_check / ui_diff / load_check reports | {{status}} |
188
+ | [intent-clarifications.md](docs/intent-clarifications.md) | Agent-to-agent Q&A (ICP) | {{status}} |
171
189
 
172
190
  ## Production Pipeline (Serial)
173
191
 
174
- <!-- Only relevant when stage = production or transitioning to integration -->
192
+ <!-- Only relevant when stage = production or transitioning to ui_pass -->
175
193
 
176
194
  | Wave | Agent | Status | Notes |
177
195
  | ---- | ---------------- | ---------- | ------------------------------------------ |
178
196
  | 1 | Designer | {{status}} | Ph.2: audio + digit + VisualAtom status |
179
197
  | 2 | Technical Artist | {{status}} | Spec Quick-Check → bulk → Compliance green |
180
198
 
181
- <!-- Wave 3 Developer runs in stage = integration only — not tracked here -->
199
+ <!-- Wave 3 Developer runs in stage = ui_pass — not tracked here -->
182
200
 
183
201
  ## Intent Clarification Tracking
184
202
 
@@ -203,7 +221,7 @@ PM monitors this table:
203
221
  Orchestrator serial rules:
204
222
  - Gate #2b passed → invoke @designer only (Wave 1)
205
223
  - Wave 1 = done → invoke @technical-artist (Wave 2)
206
- - Wave 2 = done → stage: integration → invoke @developer
224
+ - Wave 2 = done → stage: ui_pass → invoke @developer
207
225
  - Optional: 30s spot-check ta-log Compliance + contract paths exist before @developer
208
226
  -->
209
227