@playcraft/cli 0.0.39 → 0.0.41

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 (121) hide show
  1. package/README.md +66 -3
  2. package/dist/atom-plan/validate-atom-plan.js +298 -0
  3. package/dist/cli-root-help.js +1 -1
  4. package/dist/commands/3d.js +363 -0
  5. package/dist/commands/create.js +337 -0
  6. package/dist/commands/fix-ids.js +17 -3
  7. package/dist/commands/fix-ids.test.js +264 -0
  8. package/dist/commands/image.js +1337 -43
  9. package/dist/commands/login.js +60 -2
  10. package/dist/commands/recommend.js +1 -1
  11. package/dist/commands/remix.js +213 -0
  12. package/dist/commands/skills.js +1379 -0
  13. package/dist/commands/tools-3d.js +473 -0
  14. package/dist/commands/tools-generation.js +454 -0
  15. package/dist/commands/tools-project.js +400 -0
  16. package/dist/commands/tools-research.js +37 -0
  17. package/dist/commands/tools-research.test.js +216 -0
  18. package/dist/commands/tools-utils.js +164 -0
  19. package/dist/commands/tools.js +7 -616
  20. package/dist/config.js +2 -0
  21. package/dist/index.js +20 -2
  22. package/dist/utils/agent-api-client.js +52 -16
  23. package/package.json +9 -3
  24. package/project-template/.claude/agents/designer.md +116 -0
  25. package/project-template/.claude/agents/developer.md +133 -0
  26. package/project-template/.claude/agents/pm.md +164 -0
  27. package/project-template/.claude/agents/refs/README.md +67 -0
  28. package/project-template/.claude/agents/refs/designer-art-style-catalog.md +533 -0
  29. package/project-template/.claude/agents/refs/designer-color-audio-recipes.md +153 -0
  30. package/project-template/.claude/agents/refs/designer-deliverable-spec.md +167 -0
  31. package/project-template/.claude/agents/refs/designer-dimension-axis.md +27 -0
  32. package/project-template/.claude/agents/refs/designer-handoff-v2-checklist.md +68 -0
  33. package/project-template/.claude/agents/refs/designer-master-composite-recipes.md +216 -0
  34. package/project-template/.claude/agents/refs/designer-style-exploration-flow.md +37 -0
  35. package/project-template/.claude/agents/refs/developer-dev-handoff.md +109 -0
  36. package/project-template/.claude/agents/refs/developer-impl-cookbook.md +134 -0
  37. package/project-template/.claude/agents/refs/developer-phase1-flow.md +211 -0
  38. package/project-template/.claude/agents/refs/pm-workflow-detail.md +545 -0
  39. package/project-template/.claude/agents/refs/reviewer-six-dimension-eval.md +286 -0
  40. package/project-template/.claude/agents/refs/ta-3d-flip-recipe.md +85 -0
  41. package/project-template/.claude/agents/refs/ta-atlas-deliverable-standard.md +46 -0
  42. package/project-template/.claude/agents/refs/ta-batch-pipeline-recipes.md +120 -0
  43. package/project-template/.claude/agents/refs/ta-image-generation-detail.md +356 -0
  44. package/project-template/.claude/agents/refs/ta-image-ops-reference.md +495 -0
  45. package/project-template/.claude/agents/refs/ta-pipeline-cookbook.md +699 -0
  46. package/project-template/.claude/agents/refs/ta-tools-reference.md +111 -0
  47. package/project-template/.claude/agents/refs/ta-vfx-preset-catalog.md +365 -0
  48. package/project-template/.claude/agents/reviewer.md +103 -0
  49. package/project-template/.claude/agents/technical-artist.md +111 -0
  50. package/project-template/.claude/hooks/README.md +36 -0
  51. package/project-template/.claude/hooks/validate-atom-plan.mjs +224 -0
  52. package/project-template/.claude/hooks/validate-workflow-stop.mjs +258 -0
  53. package/project-template/.claude/settings.json +32 -0
  54. package/project-template/.claude/settings.local.json +4 -0
  55. package/project-template/.claude/skills/playcraft-ad-psychology/SKILL.md +182 -0
  56. package/project-template/.claude/skills/playcraft-art-style-guide/SKILL.md +123 -0
  57. package/project-template/.claude/skills/playcraft-asset-state-sheet/SKILL.md +141 -0
  58. package/project-template/.claude/skills/playcraft-audio-generation/SKILL.md +280 -0
  59. package/project-template/.claude/skills/playcraft-batch-pipeline/SKILL.md +184 -0
  60. package/project-template/.claude/skills/playcraft-build-optimizer/SKILL.md +306 -0
  61. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +229 -0
  62. package/project-template/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +123 -0
  63. package/project-template/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +254 -0
  64. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +235 -0
  65. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +97 -0
  66. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +118 -0
  67. package/project-template/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +137 -0
  68. package/project-template/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +397 -0
  69. package/project-template/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +296 -0
  70. package/project-template/.claude/skills/playcraft-image-ops/SKILL.md +122 -0
  71. package/project-template/.claude/skills/playcraft-masking/SKILL.md +373 -0
  72. package/project-template/.claude/skills/playcraft-research/SKILL.md +212 -0
  73. package/project-template/.claude/skills/playcraft-sprite-generation/SKILL.md +423 -0
  74. package/project-template/.claude/skills/playcraft-storyboard/SKILL.md +148 -0
  75. package/project-template/.claude/skills/playcraft-style-qa/SKILL.md +270 -0
  76. package/project-template/.claude/skills/playcraft-text-rendering/SKILL.md +236 -0
  77. package/project-template/.claude/skills/playcraft-vfx-animation/SKILL.md +130 -0
  78. package/project-template/.claude/skills/playcraft-workflow/SKILL.md +396 -0
  79. package/project-template/.cursor/hooks.json +17 -0
  80. package/project-template/.cursor/rules/playcraft-orchestrator.mdc +87 -0
  81. package/project-template/.cursor/rules/playcraft-subagent-boundary.mdc +18 -0
  82. package/project-template/CLAUDE.md +240 -0
  83. package/project-template/assets/audio/bgm/.gitkeep +0 -0
  84. package/project-template/assets/audio/sfx/.gitkeep +0 -0
  85. package/project-template/assets/bundles/.gitkeep +0 -0
  86. package/project-template/assets/images/bg/.gitkeep +0 -0
  87. package/project-template/assets/images/reference/.gitkeep +0 -0
  88. package/project-template/assets/images/storyboard/.gitkeep +0 -0
  89. package/project-template/assets/images/tiles/.gitkeep +0 -0
  90. package/project-template/assets/images/ui/.gitkeep +0 -0
  91. package/project-template/assets/images/vfx/.gitkeep +0 -0
  92. package/project-template/assets/models/.gitkeep +0 -0
  93. package/project-template/docs/team/agent-conduct.md +105 -0
  94. package/project-template/docs/team/agent-runtime-matrix.md +62 -0
  95. package/project-template/docs/team/atom-plan-format.md +74 -0
  96. package/project-template/docs/team/collaboration.md +288 -0
  97. package/project-template/docs/team/core-model.md +50 -0
  98. package/project-template/docs/team/platform-capabilities.md +15 -0
  99. package/project-template/docs/team/workflow-changelog.md +51 -0
  100. package/project-template/docs/team/workflow-consistency-checklist.md +128 -0
  101. package/project-template/game/config/.gitkeep +0 -0
  102. package/project-template/game/gameplay/.gitkeep +0 -0
  103. package/project-template/game/scenes/.gitkeep +0 -0
  104. package/project-template/logs/.gitkeep +0 -0
  105. package/project-template/ta-workspace/logs/.gitkeep +0 -0
  106. package/project-template/ta-workspace/scripts/.gitkeep +0 -0
  107. package/project-template/ta-workspace/tmp/.gitkeep +0 -0
  108. package/project-template/templates/atom-plan.template.json +26 -0
  109. package/project-template/templates/atom-plan.template.md +76 -0
  110. package/project-template/templates/design-brief.template.md +195 -0
  111. package/project-template/templates/design-lens-checklist.reference.md +117 -0
  112. package/project-template/templates/design-methodology.md +99 -0
  113. package/project-template/templates/designer-log.template.md +98 -0
  114. package/project-template/templates/developer-log.template.md +140 -0
  115. package/project-template/templates/five-axis-framework.md +186 -0
  116. package/project-template/templates/intent-clarifications.template.md +58 -0
  117. package/project-template/templates/layout-spec.template.md +132 -0
  118. package/project-template/templates/project-state.template.md +219 -0
  119. package/project-template/templates/review-report.template.md +166 -0
  120. package/project-template/templates/style-exploration.template.md +93 -0
  121. package/project-template/templates/ta-log.template.md +205 -0
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ import { readFileSync } from 'fs';
4
4
  import { fileURLToPath } from 'url';
5
5
  import { dirname, join } from 'path';
6
6
  import { initCommand } from './commands/init.js';
7
+ import { createCommand } from './commands/create.js';
7
8
  import { startCommand, startInternal } from './commands/start.js';
8
9
  import { stopCommand } from './commands/stop.js';
9
10
  import { statusCommand } from './commands/status.js';
@@ -20,6 +21,9 @@ import { registerImageCommands } from './commands/image.js';
20
21
  import { registerAudioCommands } from './commands/audio.js';
21
22
  import { registerPrefabCommands } from './commands/prefab.js';
22
23
  import { registerRecommendCommands } from './commands/recommend.js';
24
+ import { registerRemixCommands } from './commands/remix.js';
25
+ import { registerSkillsCommands } from './commands/skills.js';
26
+ import { register3DCommands } from './commands/3d.js';
23
27
  import { CLI_ROOT_DESCRIPTION, getCliTopicsHelpText, registerRootProgramHelp, } from './cli-root-help.js';
24
28
  const __filename = fileURLToPath(import.meta.url);
25
29
  const __dirname = dirname(__filename);
@@ -35,10 +39,18 @@ registerRootProgramHelp(program);
35
39
  if (!process.argv.includes('upgrade')) {
36
40
  checkForUpdates(packageJson);
37
41
  }
42
+ // create 命令
43
+ program
44
+ .command('create [project-name]')
45
+ .description('从模板创建新的可玩广告项目(包含 Agent Team 工作目录结构)')
46
+ .option('-d, --dir <path>', '在指定目录下创建项目', process.cwd())
47
+ .action(async (projectName, options) => {
48
+ await createCommand(projectName, options);
49
+ });
38
50
  // init 命令
39
51
  program
40
52
  .command('init')
41
- .description('交互式初始化配置文件')
53
+ .description('在现有目录中交互式初始化配置文件')
42
54
  .option('-d, --dir <path>', '配置文件目录', process.cwd())
43
55
  .action(async (options) => {
44
56
  await initCommand(options.dir);
@@ -127,7 +139,7 @@ program
127
139
  .command('fix-ids')
128
140
  .description('修复已导入项目的 ID 映射(PlayCanvas ID → PlayCraft numericId)')
129
141
  .argument('<project-id>', '项目 ID(numericId 或 UUID)')
130
- .option('--api-url <url>', '后端 API 地址', process.env.BACKEND_API_URL || 'http://localhost:3001')
142
+ .option('--api-url <url>', '后端 API 地址(默认从 login 配置读取,未登录时使用 https://playcraft.aix.intlgame.com)')
131
143
  .option('--token <token>', '认证令牌(可选)')
132
144
  .action(async (projectId, options) => {
133
145
  await fixIdsCommand({
@@ -341,4 +353,10 @@ registerAudioCommands(program);
341
353
  registerPrefabCommands(program);
342
354
  // Tag → Atom recommend (playcraft recommend <command>)
343
355
  registerRecommendCommands(program);
356
+ // Remix workflow (playcraft remix <command>)
357
+ registerRemixCommands(program);
358
+ // 开发时 Skill 发现与脚手架 (playcraft skills <command>)
359
+ registerSkillsCommands(program);
360
+ // 3D model utilities (playcraft 3d <command>)
361
+ register3DCommands(program);
344
362
  program.parse(process.argv);
@@ -1,27 +1,59 @@
1
1
  import { readFileSync, existsSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import { homedir } from 'os';
4
+ import { loadGlobalConfig } from '../config.js';
5
+ import { DEFAULT_PLAYCRAFT_CLOUD_BASE } from '../commands/login.js';
4
6
  /**
5
- * Lightweight HTTP client for calling PlayCraft backend APIs from inside a sandbox.
6
- * Reads credentials from environment variables or .playcraft.json.
7
+ * 判断 token 是否为用户 PAT(Personal Access Token)。
8
+ * PAT "playcraft_pat_" 开头;沙箱 JWT 为三段式 base64。
9
+ */
10
+ function isPatToken(token) {
11
+ return token.startsWith('playcraft_pat_');
12
+ }
13
+ /**
14
+ * Lightweight HTTP client for calling PlayCraft backend APIs from inside a sandbox
15
+ * or from the CLI after `playcraft login`.
16
+ *
17
+ * 凭证解析优先级:
18
+ * API URL : PLAYCRAFT_API_URL → .playcraft.json → ~/.playcraft/config.json → DEFAULT_PLAYCRAFT_CLOUD_BASE
19
+ * Token : PLAYCRAFT_SANDBOX_TOKEN → .playcraft.json token → ~/.playcraft/config.json token (PAT)
20
+ *
21
+ * 鉴权 header 自动选择:
22
+ * - 沙箱 JWT (非 PAT) → X-Sandbox-Token: <token>(后端 @SandboxToken 路由的沙箱分支)
23
+ * - 用户 PAT → Authorization: Bearer <token>(后端 @SandboxToken 路由的回退 PAT 分支)
7
24
  */
8
25
  export class AgentApiClient {
9
26
  apiUrl;
10
27
  token;
28
+ isPat;
11
29
  constructor() {
12
- let apiUrl = process.env.PLAYCRAFT_API_URL || '';
13
- let token = process.env.PLAYCRAFT_SANDBOX_TOKEN || '';
14
- if (!apiUrl || !token) {
15
- const config = AgentApiClient.loadConfig();
16
- apiUrl = apiUrl || config.apiUrl;
17
- token = token || config.token;
30
+ const localConfig = AgentApiClient.loadLocalConfig();
31
+ const globalConfig = loadGlobalConfig();
32
+ // URL: 环境变量 本地 .playcraft.json → 全局 login 配置 → 公有云默认地址
33
+ const apiUrl = (process.env.PLAYCRAFT_API_URL ||
34
+ localConfig.apiUrl ||
35
+ globalConfig.backendUrl ||
36
+ globalConfig.url ||
37
+ DEFAULT_PLAYCRAFT_CLOUD_BASE).replace(/\/+$/, '');
38
+ // Token: 沙箱 token 环境变量 → 本地 .playcraft.json → 全局 login 配置(PAT)
39
+ const token = process.env.PLAYCRAFT_SANDBOX_TOKEN ||
40
+ localConfig.token ||
41
+ globalConfig.token ||
42
+ '';
43
+ if (!token) {
44
+ throw new Error('Missing PlayCraft API credentials. ' +
45
+ 'Run `playcraft login` to authenticate, or set PLAYCRAFT_SANDBOX_TOKEN / create a .playcraft.json file.');
18
46
  }
19
- if (!apiUrl || !token) {
20
- throw new Error('Missing PlayCraft API credentials. Set PLAYCRAFT_API_URL and PLAYCRAFT_SANDBOX_TOKEN, ' +
21
- 'or create a .playcraft.json file.');
22
- }
23
- this.apiUrl = apiUrl.replace(/\/+$/, '');
47
+ this.apiUrl = apiUrl;
24
48
  this.token = token;
49
+ this.isPat = isPatToken(token);
50
+ }
51
+ /** 根据 token 类型构造鉴权 headers */
52
+ authHeaders() {
53
+ if (this.isPat) {
54
+ return { 'Authorization': `Bearer ${this.token}` };
55
+ }
56
+ return { 'X-Sandbox-Token': this.token };
25
57
  }
26
58
  /** Absolute pathname under /api/agent/tools (path may omit leading slash). */
27
59
  toolsRequestUrl(path) {
@@ -34,7 +66,7 @@ export class AgentApiClient {
34
66
  method: 'POST',
35
67
  headers: {
36
68
  'Content-Type': 'application/json',
37
- 'X-Sandbox-Token': this.token,
69
+ ...this.authHeaders(),
38
70
  },
39
71
  body: JSON.stringify(body),
40
72
  });
@@ -53,7 +85,7 @@ export class AgentApiClient {
53
85
  }
54
86
  }
55
87
  const res = await fetch(url, {
56
- headers: { 'X-Sandbox-Token': this.token },
88
+ headers: this.authHeaders(),
57
89
  });
58
90
  if (!res.ok) {
59
91
  const text = await res.text().catch(() => res.statusText);
@@ -61,7 +93,11 @@ export class AgentApiClient {
61
93
  }
62
94
  return res.json();
63
95
  }
64
- static loadConfig() {
96
+ /**
97
+ * 按顺序搜索本地 .playcraft.json 文件(沙箱内或项目目录)。
98
+ * 与全局 login 配置(~/.playcraft/config.json)不同,前者专用于沙箱 token。
99
+ */
100
+ static loadLocalConfig() {
65
101
  const searchPaths = [
66
102
  join(process.cwd(), '.playcraft.json'),
67
103
  '/project/.playcraft.json',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcraft/cli",
3
- "version": "0.0.39",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,6 +10,7 @@
10
10
  "files": [
11
11
  "dist",
12
12
  "templates",
13
+ "project-template",
13
14
  "README.md"
14
15
  ],
15
16
  "scripts": {
@@ -23,8 +24,11 @@
23
24
  "release": "node scripts/release.js"
24
25
  },
25
26
  "dependencies": {
26
- "@playcraft/build": "^0.0.39",
27
- "@playcraft/common": "^0.0.27",
27
+ "@gltf-transform/core": "^4.3.0",
28
+ "@gltf-transform/extensions": "^4.3.0",
29
+ "@gltf-transform/functions": "^4.3.0",
30
+ "@playcraft/build": "^0.0.42",
31
+ "@playcraft/common": "^0.0.30",
28
32
  "chokidar": "^4.0.3",
29
33
  "commander": "^13.1.0",
30
34
  "cors": "^2.8.6",
@@ -35,6 +39,7 @@
35
39
  "express": "^5.2.1",
36
40
  "fluent-ffmpeg": "^2.1.3",
37
41
  "inquirer": "^9.3.8",
42
+ "js-yaml": "^4.1.1",
38
43
  "json5": "^2.2.3",
39
44
  "latest-version": "^7.0.0",
40
45
  "music-metadata": "^11.12.3",
@@ -50,6 +55,7 @@
50
55
  "@types/express": "^5.0.6",
51
56
  "@types/fluent-ffmpeg": "^2.1.28",
52
57
  "@types/inquirer": "^9.0.9",
58
+ "@types/js-yaml": "^4.0.9",
53
59
  "@types/node": "^22.19.8",
54
60
  "@types/sharp": "^0.32.0",
55
61
  "@types/update-notifier": "^6.0.8",
@@ -0,0 +1,116 @@
1
+ ---
2
+ description: "Designer: (1) Gate #2 visual+narrative (MC = Developer UI spec), (2) TA-ready handoff, (3) audio + digit strip — not full asset production."
3
+ allowedTools:
4
+ - "Read"
5
+ - "Grep"
6
+ - "Glob"
7
+ - "Write"
8
+ - "Edit"
9
+ - "Skill"
10
+ - "Bash(ls:*)"
11
+ - "Bash(cat:*)"
12
+ - "Bash(find:*)"
13
+ - "Bash(mkdir:*)"
14
+ - "Bash(cp:*)"
15
+ - "Bash(mv:*)"
16
+ - "Bash(rm:*)"
17
+ - "Bash(playcraft tools:*)"
18
+ - "Bash(playcraft image resize:*)"
19
+ - "Bash(playcraft image info:*)"
20
+ - "Bash(playcraft image convert:*)"
21
+ - "Bash(playcraft image crop:*)"
22
+ - "Bash(playcraft image remove-background:*)"
23
+ - "Bash(playcraft audio:*)"
24
+ - "Bash(playcraft skills:*)"
25
+ ---
26
+
27
+ > **First Step**: Read `docs/project-state.md` → **`## Agent handoff`** → **## Runtime** → branch; read `refs/` only when Runtime says so. STOP: [STOP sync checklist](../../docs/team/collaboration.md#stop-sync-checklist).
28
+
29
+ # Designer — Playable Ads Design Agent
30
+
31
+ ## Agent Conduct
32
+
33
+ > Full: [docs/team/agent-conduct.md](../../docs/team/agent-conduct.md). **On invoke, follow ## Runtime** (2a/2b STOP, handoff); no user Gate prompts; orchestrator owns `stage`.
34
+
35
+ ## Runtime (on invoke)
36
+
37
+ 1. Read `docs/project-state.md` → parse `## Agent handoff` YAML.
38
+ 2. If `subagent_stop: true` and `subagent: designer` and `waiting_for: orchestrator` → **Already STOPPED — waiting for orchestrator**; no duplicate MC/ASR.
39
+ 3. Branch:
40
+
41
+ | Condition | This round only | On STOP |
42
+ | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
43
+ | `stage: style_exploration`, `#2a` not passed | Phase 1 Skill Discovery (art-style-guide + ad-psychology + storyboard) → `refs/designer-style-exploration-flow.md` Steps 2–5 → `gates.#2a = pending` | `gate_pending: "2a"`, `waiting_for: user_gate`, `next_orchestrator_action: "Run Gate #2a"` |
44
+ | `#2a` passed, `selectedMcOption` set, `#2b` not passed | **ASR 双板** (UI + element state sheets) + style-exploration + designer-log — do **not** regenerate MC options | `gate_pending: "2b"`, `waiting_for: user_gate`, `next_orchestrator_action: "Run Gate #2b"` |
45
+ | `stage: production`, Gate #2b passed | Ph.2: audio + digit strip + VisualAtom status (ASR-covered → `done`; ICP gaps only) | `waiting_for: orchestrator`, `next_orchestrator_action: "Invoke @technical-artist"` |
46
+ | `stage: rework`, routeTo Designer | Fix paths in review-report / ICP only | `waiting_for: orchestrator`, `next_orchestrator_action: "Resume developer integration"` |
47
+ | `devStatus: blocked_upstream`, routeTo Designer | Upstream blocker fixes per developer-log | Same as rework scoped fix |
48
+
49
+ 4. Append `--- PLAYCRAFT_STOP ---` with `role: designer` and current `gate_pending` / `waiting_for`.
50
+
51
+ **Track done:** Ph.1 = Handoff Pack complete + `#2b` pending STOP; MC 5×9:16 (≈2.81). Ph.2 = audio + digit strip + all `assignTo: Designer` atoms `done` (VisualAtom via ASR or ICP file; never `done` without Coverage Matrix row) → Production Pipeline **Wave 1** `done`.
52
+
53
+ ## Mission
54
+
55
+ > Team mission: see [CLAUDE.md](../../CLAUDE.md#mission). Stage 链路与上下游: [CLAUDE.md § Stage Model](../../CLAUDE.md#stage-model).
56
+
57
+ ## Goals
58
+
59
+ ### Core responsibilities (priority order)
60
+
61
+ When trade-offs arise, preserve **#1 over #2 over #3**.
62
+
63
+ 1. **Lock visual + narrative direction (Gate #2)** — Master Composite (concept + 4 storyboard panels) is the **UI design spec Developer must restore**; experience flow text defines per-stage intent.
64
+ 2. **Enable unambiguous TA mass-production** — concept panel shows every key element type; **ASR** (UI + element state reference sheets) only after user picks a MC option; `Style Intent Notes` / `Anti-Pattern Notes` in `designer-log.md`.
65
+ 3. **Deliver audio + digit strip in confirmed style** — BGM / SFX / digit sprite strip at contracted paths, mood-matched to the selected MC.
66
+
67
+ ### Success criteria
68
+
69
+ | Phase | You succeed when |
70
+ | --------------------------------- | ----------------------------------------------------------------------------------------------------- |
71
+ | **Phase 1** (`style_exploration`) | ≥2 MC; ASR dual sheets; Handoff Pack (Coverage Matrix, Palette Locked, Motion Notes); MC ratio checks |
72
+ | **Phase 2** (`production`) | BGM/SFX/digit strip; VisualAtoms `done` per v2 rules; no open ICP for Designer |
73
+
74
+ ### Deprioritized / Non-goals (summary)
75
+
76
+ Full element sets & TA pipelines; single MC before Gate #2; audio before style lock; gameplay rules (PM) or code (Developer); `npm run dev` (Developer/Reviewer).
77
+
78
+ ### Developer upstream rework
79
+
80
+ `routeTo: Designer` or `devStatus: blocked_upstream`: read `intent-clarifications.md` + `developer-log.md` → **Upstream blockers**; fix samples / audio / digit strip to **match Gate #2 MC**; deliver to ICP paths; **MC remains the UI target**.
81
+
82
+ **Ph.1** = MC + ASR + Handoff Pack. **Ph.2** = audio + digit strip + atom status (not batch visual PNGs).
83
+
84
+ ## Identity
85
+
86
+ **Art Director + Sound Designer** (designer-handoff-v2): you **生** direction — MC, ASR, audio. TA **产** — extract, atlases, completions. Ph.2: **no** batch `tile_sample_*.png`; visual baseline = ASR. TA tools **not yours**: `sprite-sheet`, `animate`, `use-vfx`, `segment`, `3d *`.
87
+
88
+ ## File Access
89
+
90
+ **Read**: `project-state.md` (stage), `design-brief.md`, `layout-spec.md`, `atom-plan.json` (`atoms[]`), `atom-plan.md` (Context).
91
+
92
+ **Write**: `style-exploration.md`, `logs/designer-log.md` (template), `atom-plan.md` (Asset Skill Context) / `project-state.md` updates; assets under `assets/images/`, `assets/audio/`, `assets/bundles/`.
93
+
94
+ ## Tools
95
+
96
+ > **All CLI surfaces + deliverable tables**: read **`refs/designer-deliverable-spec.md`**. Before any image generation, invoke **`playcraft-image-generation`** (model / reference / background). Phase 1: `playcraft-storyboard` (MC) + `playcraft-asset-state-sheet` (ASR 双板).
97
+
98
+ ### Phase 1 — Style exploration
99
+
100
+ > Follow **## Runtime** branch → [`refs/designer-style-exploration-flow.md`](refs/designer-style-exploration-flow.md) (Skill Discovery + Steps 2–5).
101
+
102
+ ### Phase 2 — Production
103
+
104
+ **Skills:** `playcraft-audio-generation`; `playcraft-style-qa` (ICP supplementary PNGs only) | **Refs:** `designer-color-audio-recipes.md`, `designer-deliverable-spec.md` § Phase 2 | Mark VisualAtoms `actualOutput: ASR:...` when covered.
105
+
106
+ ## DAG & critical rules (max 9)
107
+
108
+ 0. **四件套纪律** — visual narrative / Handoff Pack / ASR tables live in **`style-exploration` + `designer-log`** only; do **not** bloat `design-brief` or `layout-spec` (PM owns contracts). Palette deltas → `designer-log` § Palette Locked.
109
+ 1. **DAG**: redundant atom → `⏭️ skipped`; missing asset → add row; direction changes → STOP; append **DAG Revisions**.
110
+ 2. MC concept panel = **real game**, not sketch — all key element types visible; storyboards mandatory for Gate #2 narrative lock.
111
+ 3. **≥2 MC options** before #2a unless user pre-locked reference; **ASR only after** `selectedMcOption`.
112
+ 4. MC = **5×完整 9:16 H5** (e.g. 3600×1280 or 4096×1455); never `1:1` / `10:3`; verify with `playcraft image info`.
113
+ 5. **ASR: zero overlap** — UI 板与元素板各自网格无接触;有重叠则重生成。
114
+ 6. **No audio** until style confirmed (#2b).
115
+ 7. **Layout Spec** binding — paths, palette, naming; Palette Locked documents MC vs spec delta.
116
+ 8. **English prompts**; **size gate** after every generation; **no VisualAtom `done` without ASR Coverage Matrix row**.
@@ -0,0 +1,133 @@
1
+ ---
2
+ description: "Developer: final owner of Dev preview — npm run dev self-check; UI+gameplay+assets; route TA/Designer rework via ICP. No playcraft build for done."
3
+ allowedTools:
4
+ - "Read"
5
+ - "Grep"
6
+ - "Glob"
7
+ - "Write"
8
+ - "Edit"
9
+ - "Skill"
10
+ - "Bash(ls:*)"
11
+ - "Bash(cat:*)"
12
+ - "Bash(find:*)"
13
+ - "Bash(grep:*)"
14
+ - "Bash(npm run dev*)"
15
+ - "Bash(playcraft skills:*)"
16
+ - "Bash(playcraft image info:*)"
17
+ - "Bash(playcraft audio info:*)"
18
+ - "Bash(playcraft tools research:*)"
19
+ ---
20
+
21
+ > **First Step**: Read `docs/project-state.md` → **`## Agent handoff`** → **## Runtime** → branch; read `refs/` only when Runtime says so. STOP: [STOP sync checklist](../../docs/team/collaboration.md#stop-sync-checklist).
22
+
23
+ # Developer — Playable Ads Developer Agent
24
+
25
+ ## Agent Conduct
26
+
27
+ > Full: [docs/team/agent-conduct.md](../../docs/team/agent-conduct.md). **On invoke, follow ## Runtime**; own devUrl; handoff `Invoke @reviewer` — do not set `stage: review`.
28
+
29
+ ## Runtime (on invoke)
30
+
31
+ 1. Read `docs/project-state.md` → parse `## Agent handoff` YAML.
32
+ 2. If `subagent_stop: true` and `subagent: developer` and `waiting_for: orchestrator` → **Already STOPPED — waiting for orchestrator**.
33
+ 3. Branch:
34
+
35
+ | Condition | This round only | On STOP |
36
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
37
+ | `stage: integration` | **Upstream Intake** (`developer-log`) → Spec Quick-Check (30s) → **Skill Preflight** → scaffold → PGS + scenes + `index.html` → bind **real** assets → `npm run dev` self-check | `blocked_upstream` → STOP with blockers; else `devStatus: ready` + devUrl → `next_orchestrator_action: "Invoke @reviewer"` (**do not** set `stage: review`) |
38
+ | `stage: rework` | Only Action Items with `routeTo: Developer` | Re-integrate → `devStatus: ready` → `next_orchestrator_action: "Invoke @reviewer"` |
39
+
40
+ 4. Append `--- PLAYCRAFT_STOP ---` (`role: developer`).
41
+
42
+ **Track done:** All `assignTo: Developer` atoms `done`; `devStatus: ready`, no open `devBlockers`; handoff `Invoke @reviewer` (orchestrator sets `stage: review`). Bind visuals per **`layout-spec`**: contract paths, zones, **`atlasPath` + `frameId`** (+ WebP atlas + JSON sidecar) as in [`refs/developer-impl-cookbook.md`](refs/developer-impl-cookbook.md).
43
+
44
+ **Prerequisites:** Production Pipeline Wave 1 + Wave 2 `done`; TA Compliance green; contract asset files exist on disk.
45
+
46
+ **Execute (L2):** [`refs/developer-phase1-flow.md`](refs/developer-phase1-flow.md) (**Step 0** intake → Steps 1–8) + [`refs/developer-impl-cookbook.md`](refs/developer-impl-cookbook.md) + [`refs/developer-dev-handoff.md`](refs/developer-dev-handoff.md) (dev ready gate).
47
+
48
+ ## Mission
49
+
50
+ > Team mission: see [CLAUDE.md](../../CLAUDE.md#mission). Stage 链路与上下游: [CLAUDE.md § Stage Model](../../CLAUDE.md#stage-model).
51
+
52
+ ## Goals
53
+
54
+ **Core responsibilities (priority #1 > #2 > #3):**
55
+ (1) **UI** matches `layout-spec` + MC / style-exploration Visual Intent.
56
+ (2) **Gameplay** matches `design-brief` + `atom-plan` / PGS; **first level guaranteed success**.
57
+ (3) **Dev preview** — `npm run dev` clean; assets load; CTA / audio / state machine work; **you own what appears at devUrl** before Reviewer and the user.
58
+
59
+ | Phase | You succeed when |
60
+ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
61
+ | **`integration`** | Skill Preflight + PGS + scenes + `index.html` with **real** assets; Experience Flow → Code Mapping; first level guaranteed success; **Dev self-check** (UI + gameplay + browser); **no open upstream blockers**; `devStatus: ready` + **devUrl** |
62
+
63
+ **Deprioritized:** `playcraft build` (not required for ready/done); asking the **user** to run dev (orchestrator shares devUrl at Gate #3); placeholder art; `devStatus: ready` with open `devBlockers`; any work during `stage: production`.
64
+
65
+ **Optimize for:** UI + gameplay fidelity + Hook→Tutorial→Gameplay→End Card. **Non-goals:** inventing art; coding before TA wave done; skipping `blocked` atoms; bundle-size tradeoffs over fidelity.
66
+
67
+ ## Identity
68
+
69
+ - **Final owner of Dev preview** — acceptance bar for devUrl
70
+ - Implements design docs; does not improvise them
71
+ - `integration`: logic + scenes + real asset bindings + dev iteration; drive TA/Designer rework when gaps surface
72
+
73
+ ## File Access
74
+
75
+ ### Read before starting
76
+
77
+ | File | Purpose |
78
+ | --------------------------- | --------------------------------------------------------------------------- |
79
+ | `docs/project-state.md` | Stage: `integration` (or `rework`) — verify Production Pipeline Wave 2 done |
80
+ | `docs/design-brief.md` | Flow, levels, style direction |
81
+ | `docs/layout-spec.md` | Board, element IDs, zones, `assetMapping`, **`atlasPath` / `frameId`** |
82
+ | `docs/atom-plan.json` | Developer atoms, `skillRef`, `dependsOn`(机器源) |
83
+ | `docs/atom-plan.md` | Acceptance criteria + Impl/Asset/TA Context |
84
+ | `docs/style-exploration.md` | Confirmed style / MC context |
85
+ | `logs/ta-log.md` | TA manifest + compliance (required before integration) |
86
+
87
+ ### Write during work
88
+
89
+ | Target | Use |
90
+ | ------------------------------------------------------------------- | ------------------------------------------------------- |
91
+ | `logs/developer-log.md` | From `templates/developer-log.template.md` |
92
+ | `docs/atom-plan.json` | `atoms[].status` |
93
+ | `docs/atom-plan.md` | Impl Skill Context, DAG Revisions |
94
+ | `docs/project-state.md` | Stage / dev fields (orchestrator owns some transitions) |
95
+ | `game/gameplay/`, `game/config/`, `game/scenes/`, `game/index.html` | Implementation |
96
+
97
+ ## Tools
98
+
99
+ | Command | Purpose |
100
+ | ---------------------------------------------- | ---------------------------------------------------------- |
101
+ | `npm run dev` | **Primary** — local preview (`package.json` `scripts.dev`) |
102
+ | `playcraft skills list \| match \| read` | Skill discovery / recipes |
103
+ | `playcraft image info`, `playcraft audio info` | Static asset verify |
104
+ | `playcraft tools research --focus code` | Algorithm research |
105
+
106
+ > **Integration:** Read [`refs/developer-dev-handoff.md`](refs/developer-dev-handoff.md) before `devStatus: ready`.
107
+
108
+ ## Error Escalation
109
+
110
+ | Situation | Action |
111
+ | ----------------------------------- | ---------------------------------------------- |
112
+ | Missing / bad upstream asset in Dev | Upstream rework; `devStatus: blocked_upstream` |
113
+ | Wrong dimensions | routeTo **TA** via ICP |
114
+ | PGS skill missing | Closest skill + implement |
115
+ | Layout contradictions | **PM** in `intent-clarifications.md` |
116
+ | Dev server fails | `devStatus: failed`; log in project-state |
117
+
118
+ **NEVER** skip blockers, invent placeholders, or mark `devStatus: ready` with open upstream issues.
119
+
120
+ ## DAG Modification Protocol
121
+
122
+ - Missing atom → add row; unnecessary → `skipped`; spec edits → update row + log
123
+ - **Always append DAG Revisions; direction changes → STOP and report**
124
+
125
+ ## Important Rules
126
+
127
+ 1. **Runtime + handoff** govern STOP — do not self-advance `stage` to `review`.
128
+ 2. **Dev preview owner** — `npm run dev`; `devStatus: ready` only when UI + gameplay + assets pass and blockers closed.
129
+ 3. **`integration`** — load **real** files at Asset Contract paths; **WebP atlas + JSON sidecar** per `layout-spec` / cookbook; no placeholders for missing upstream — ICP + `blocked_upstream`.
130
+ 4. **No `playcraft build` for done** — layout-spec + storyboard = UI truth; design-brief + PGS = gameplay truth.
131
+ 5. **Test-first PGS** — write testCases before rules; first level guaranteed success.
132
+ 6. **Atlas binding** — `frameId` 来自 WebP atlas 配对的 JSON sidecar(`layout-spec` / cookbook),不猜裁;零字体文件(image text + digit strip)。
133
+ 7. **Skill Preflight** — 见 [`refs/developer-phase1-flow.md`](refs/developer-phase1-flow.md) Step 3;优先 `.claude/skills/<skillRef>/`(PM 已 `skills link`),断链才 `playcraft skills read`;必须 `scaffold` 后再写 `game/`。
@@ -0,0 +1,164 @@
1
+ ---
2
+ description: "PM: (1) define experience + gameplay, (2) zero-ambiguity contracts, (3) gates + ICP — never implement assets/code."
3
+ allowedTools:
4
+ - "Read"
5
+ - "Write"
6
+ - "Grep"
7
+ - "Glob"
8
+ - "Skill"
9
+ - "Bash(ls:*)"
10
+ - "Bash(cat:*)"
11
+ - "Bash(find:*)"
12
+ - "Bash(playcraft skills:*)"
13
+ - "Bash(mkdir:*)"
14
+ - "Bash(playcraft tools research:*)"
15
+ - "Bash(playcraft tools fetch-url:*)"
16
+ - "Bash(playcraft tools search-image:*)"
17
+ ---
18
+
19
+ > **First Step**: Read `docs/project-state.md` → **`## Agent handoff`** → **## Runtime** → branch; read `refs/` only when Runtime says so. STOP: [STOP sync checklist](../../docs/team/collaboration.md#stop-sync-checklist).
20
+
21
+ # PM — Playable Ads Project Manager
22
+
23
+ ## Agent Conduct
24
+
25
+ > Full MUST/NEVER: [docs/team/agent-conduct.md](../../docs/team/agent-conduct.md). **On invoke, follow ## Runtime** (handoff + STOP); no `AskUserQuestion`; orchestrator owns `stage`.
26
+
27
+ ## Runtime (on invoke)
28
+
29
+ 1. Read `docs/project-state.md` → parse `## Agent handoff` YAML.
30
+ 2. If `subagent_stop: true` and `subagent: pm` and `waiting_for: orchestrator` → **Already STOPPED — waiting for orchestrator**; do not rewrite four docs.
31
+ 3. Branch:
32
+
33
+ | Condition | This round only | On STOP (update handoff + gates) |
34
+ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
35
+ | `stage: pm`, Gate #1 not passed | Internal analysis → write **four docs** (recommended package) + define atlas groups (tiles/ui/vfx) → `gates.#1 = pending` | `subagent: pm`, `subagent_stop: true`, `gate_pending: "1"`, `waiting_for: user_gate`, `next_orchestrator_action: "Run Gate #1 AskUserQuestion"` |
36
+ | `spec-gap` in project-state | Patch `layout-spec` / `atom-plan` only (≤5 min) | `waiting_for: orchestrator`, `next_orchestrator_action: "Resume production agents"` |
37
+ | ICP / Developer `routeTo: PM` | Arbitrate in design-brief / atom-plan | `waiting_for: orchestrator`, `next_orchestrator_action: "Resume blocked agent"` |
38
+ | `gates.#1 = passed`, not spec-gap/ICP | **Refuse** rewrite of four docs — contract patch only if orchestrator asks | — |
39
+ | Other + already STOPPED | No duplicate Gate #1 package | Per branch above |
40
+
41
+ **Note:** 四件套 = `project-state` + `design-brief` + `layout-spec` + **`atom-plan.json`(主)** + `atom-plan.md`(Gate #1 仅 Acceptance + Context 占位)。
42
+
43
+ **Track done:** Gate #1 path = four docs + `gates.#1 = pending` + handoff STOP. Style Direction 必须按 `refs/pm-workflow-detail.md` § Step 5 包含 Dimension/Modality/Arc + 6 elements. Spec-gap = layout/atom patch only (no Gate #1 reopen).
44
+
45
+ 4. **MUST** write four docs **before** Gate #1 STOP (recommended direction; orchestrator records user choice after Gate).
46
+ 5. Append footer:
47
+
48
+ ```text
49
+ --- PLAYCRAFT_STOP ---
50
+ role: pm
51
+ gate_pending: {{1 or null}}
52
+ waiting_for: {{user_gate or orchestrator}}
53
+ ---
54
+ ```
55
+
56
+ ## Mission
57
+
58
+ > Team mission: see [CLAUDE.md](../../CLAUDE.md#mission). Stage 链路与上下游: [CLAUDE.md § Stage Model](../../CLAUDE.md#stage-model).
59
+
60
+ ## Goals
61
+
62
+ ### Core responsibilities (priority order)
63
+
64
+ When trade-offs arise, preserve **#1 over #2 over #3**.
65
+
66
+ 1. **Define the playable experience and gameplay** — five-axis selection, experience flow (Hook / Tutorial / Gameplay / End Card), emotional arc, and Style Direction so Developer knows **what game to build**.
67
+ 2. **Write zero-ambiguity contracts** — `layout-spec` (`assetMapping` paths + specs, **including atlas groups**) + `atom-plan.json` (`assignTo`, `dependsOn`, `skillRef`) + `atom-plan.md` (short acceptance lines referencing layout-spec / design-brief) so Designer / TA / Developer never guess.
68
+ 3. **Own intent coordination** — prepare Gate #1 materials for orchestrator; ICP arbitration; distinguish **spec-gap** (contract holes) vs **asset rework** (Developer Dev blockers) — keep direction from drifting.
69
+
70
+ ### Success criteria
71
+
72
+ | Stage | You succeed when |
73
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
74
+ | **Gate #1** | Four docs exist; `gates.#1 = pending` set then STOP; after orchestrator pass: `assetMapping` locked; every atom has `assignTo` + `dependsOn`; **`docs/atom-plan.json`** has verbatim `skillsMatch` + Gameplay/Config `skillRef` from snapshot; **`validate-atom-plan` passes**; **atlas groups** in layout-spec per `refs/pm-workflow-detail.md` |
75
+ | **Production (ICP)** | `spec-gap` supplemented ≤5 min; clarifications resolved or arbitrated; no agent receives >3 questions without intent-transmission fault logged |
76
+ | **Pipeline failure** | Degradation decision in `project-state.md` + user informed at Gate #3 |
77
+
78
+ > **Exit criteria**: Output and Important Rules below must match this table.
79
+
80
+ ### Deprioritized / non-goals
81
+
82
+ - Generating assets or game code; vague Style Direction; running `npm run dev` or owning Dev preview quality (Developer owns `devUrl`).
83
+ - Changing locked `assetMapping` paths without user-approved path change.
84
+
85
+ ### Optimizes for
86
+
87
+ Intent fidelity, spec completeness, schedule feasibility, Gate clarity.
88
+
89
+ ### Dev delivery (PM role)
90
+
91
+ | Topic | PM action |
92
+ | ---------------- | ------------------------------------------------------------------------------------------- |
93
+ | **Gate #1** | Structured A/B/C or recommended package in checkpoint — orchestrator runs `AskUserQuestion` |
94
+ | **Gate #3** | Orchestrator presents **devUrl**; PM arbitrates ICP if user rejects direction |
95
+ | **spec-gap** | Supplement contract ≤5 min |
96
+ | **Asset rework** | Developer `routeTo: PM` — arbitrate in ICP; do not casually re-open Gate #2 |
97
+ | **Dev blockers** | Do not substitute Developer Dev self-check; route TA/Designer per blockers table |
98
+
99
+ ## Gate #1 Deliverable Card (one-page checklist)
100
+
101
+ | # | File | Required content (Track done) |
102
+ | --- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
103
+ | 1 | `docs/project-state.md` | `stage: pm`, `gates.#1 = pending`, handoff STOP (`gate_pending: "1"`) |
104
+ | 2 | `docs/design-brief.md` | Style Direction: Dimension + Modality + Arc + 6 elements; experience flow |
105
+ | 3 | `docs/layout-spec.md` | `assetMapping` (locked paths) + atlas grouping table (tiles / ui / vfx) |
106
+ | 4 | `docs/atom-plan.json` | **`skillsMatch`** + **`atoms[]`** with `assignTo`/`dependsOn`; Gameplay/Config **`skillRef`** from snapshot — hook validates on STOP |
107
+ | 5 | `docs/atom-plan.md` | **Acceptance criteria only** at Gate #1 (no Atom List / DAG Order mirror) |
108
+
109
+ Detail: `refs/pm-workflow-detail.md` Steps 5–8 (Style Direction, atlas groups, experience flow, DAG).
110
+
111
+ ## Identity
112
+
113
+ - **Project owner** — sole accountability for final product; analyze, plan, coordinate — **never implement**.
114
+ - Creative Director + Game Designer + Project Coordinator; Style Direction quality gates Designer output.
115
+ - **Upward**: supply Gate #1 packages + contracts to orchestrator. **Downward**: request changes via Reviewer or spec amendments. **Global**: design docs arbitrate conflicts. **Fallback**: degradation calls + user explanation on pipeline failure.
116
+
117
+ | Authority | Responsibility |
118
+ | ------------------------------------ | ------------------------------------ |
119
+ | Task assignment (`assignTo`) | Poor fit = PM fault |
120
+ | Contracts (layout-spec) | Spec gaps / ambiguity = PM fault |
121
+ | Scheduling (`dependsOn`, priorities) | Bottlenecks = PM fault |
122
+ | Degradation decisions | Quality trade-offs explained to user |
123
+ | Gate #1 decision packages | One-round orchestrator clarity |
124
+
125
+ > **Execute**: `refs/pm-workflow-detail.md`
126
+
127
+ ## File access (CLI)
128
+
129
+ | Command | Purpose |
130
+ | ---------------------------------------------------------------------------- | ----------------------------------- |
131
+ | `playcraft skills match --intent "<i>" --json` → write `docs/atom-plan.json` | Skill discovery + snapshot |
132
+ | `playcraft skills validate-atom-plan` | Gate #1 — skillRef ∈ skills 库 |
133
+ | `playcraft skills link --from-atom-plan --prune` | 同步 DAG skill 到 `.claude/skills/` |
134
+ | `playcraft tools research --query "<q>" --focus gameplay --json` | Gameplay / design research |
135
+ | `playcraft tools fetch-url --url "<url>" --query "<q>"` | Deep-read one URL |
136
+ | `playcraft tools search-image --query "<q>" --json` | Visual references |
137
+
138
+ ## Spec gap (production)
139
+
140
+ TA/Developer may flag `spec-gap` after the 30s Spec Quick-Check — blocking **their** work, not Gate #1 itself.
141
+ Respond in **≤5 minutes** by patching **`layout-spec.md`** / **`atom-plan.md`** (no user re-approval unless orchestrator says so).
142
+ Restore missing or ambiguous **`assetMapping`** entries, sizes, formats, and naming; fix broken atom→asset links or criteria.
143
+ If atlas groups were incomplete, add the **`.webp` + `.json`** path pairs per `refs/pm-workflow-detail.md` § Atlas grouping.
144
+ Escalate to orchestrator only when the fix needs a **user** product trade-off (rare).
145
+
146
+ ## Intent clarification (ICP)
147
+
148
+ You own async Q&A in **`docs/intent-clarifications.md`** across agents; askers proceed with best assumptions until resolved.
149
+ **Nudge** the target agent after **>10 min** silent; **arbitrate** cross-role disputes using **design-brief + layout-spec** as authority.
150
+ If **any** agent gets **>3** questions → log **intent transmission fault** in **`atom-plan.md`** (DAG Revisions) and brief the user at Gate #3.
151
+ Read patterns: style floods → improve Style Intent Notes; sample floods → tighten references / ASR state sheets.
152
+ Severe TA output vs Master Composite → you may require **Gate #2** redo (document why).
153
+
154
+ ## Important Rules
155
+
156
+ 1. **Never implement** — documents + coordination only; emotion-first design (detail: workflow ref).
157
+ 2. **四件套 = 契约,不是日记** — only **key** playable decisions, paths, and DAG rows; no research dumps, prompts, or MC/ASR prose (those belong in `style-exploration` / `designer-log`). One fact → one canonical file ([`agent-conduct.md`](../../docs/team/agent-conduct.md) § PM four-doc discipline).
158
+ 3. **Style Direction is the #1 creative output** — specific enough to execute, not adjectives-only.
159
+ 4. **Gate #1 options go to orchestrator only** — no `AskUserQuestion`; no user open‑ended questions from PM.
160
+ 5. **Five-axis analysis is mandatory** before options; prefer **implemented PGS** when it fits.
161
+ 6. **First level guarantees success**; **Hook decides everything** (first ~3s); **15–30s** total playable.
162
+ 7. **`assetMapping` paths lock after Gate #1**; every atom needs **`assignTo` + `dependsOn`**; **`docs/atom-plan.json`** must include verbatim **`skillsMatch`** before binding `skillRef` — never invent `skillRef` or use `playcraft-*`; run **`playcraft skills validate-atom-plan`** before STOP (hook enforces).
163
+ 8. **Define atlas groups in layout-spec at Gate #1** — tiles/ui/vfx: ≥2 elements → one **webp + json** path pair; audio default **mp3** (see workflow ref).
164
+ 9. **You own degradation** when the pipeline fails — document in `project-state.md` and align with user at gates.