maestro-flow 0.4.14 → 0.4.16

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 (105) hide show
  1. package/.agents/skills/maestro/SKILL.md +22 -42
  2. package/.agents/skills/maestro-plan/SKILL.md +10 -9
  3. package/.agents/skills/maestro-ralph/SKILL.md +61 -55
  4. package/.agents/skills/maestro-ralph-execute/SKILL.md +66 -109
  5. package/.agents/skills/manage-knowledge-audit/SKILL.md +90 -0
  6. package/.agy/skills/maestro/SKILL.md +22 -42
  7. package/.agy/skills/maestro-plan/SKILL.md +10 -9
  8. package/.agy/skills/maestro-ralph/SKILL.md +61 -55
  9. package/.agy/skills/maestro-ralph-execute/SKILL.md +66 -109
  10. package/.agy/skills/manage-knowledge-audit/SKILL.md +90 -0
  11. package/.claude/commands/maestro-plan.md +10 -9
  12. package/.claude/commands/maestro-ralph-execute.md +66 -109
  13. package/.claude/commands/maestro-ralph.md +61 -55
  14. package/.claude/commands/maestro.md +22 -42
  15. package/.claude/commands/manage-knowledge-audit.md +88 -0
  16. package/dist/src/cli.js +1 -0
  17. package/dist/src/cli.js.map +1 -1
  18. package/dist/src/commands/font-guide.d.ts +13 -0
  19. package/dist/src/commands/font-guide.d.ts.map +1 -0
  20. package/dist/src/commands/font-guide.js +114 -0
  21. package/dist/src/commands/font-guide.js.map +1 -0
  22. package/dist/src/commands/hooks.d.ts +30 -3
  23. package/dist/src/commands/hooks.d.ts.map +1 -1
  24. package/dist/src/commands/hooks.js +138 -11
  25. package/dist/src/commands/hooks.js.map +1 -1
  26. package/dist/src/commands/install-backend.d.ts +49 -4
  27. package/dist/src/commands/install-backend.d.ts.map +1 -1
  28. package/dist/src/commands/install-backend.js +163 -53
  29. package/dist/src/commands/install-backend.js.map +1 -1
  30. package/dist/src/commands/install.d.ts.map +1 -1
  31. package/dist/src/commands/install.js +50 -10
  32. package/dist/src/commands/install.js.map +1 -1
  33. package/dist/src/commands/ralph.d.ts +6 -0
  34. package/dist/src/commands/ralph.d.ts.map +1 -0
  35. package/dist/src/commands/ralph.js +133 -0
  36. package/dist/src/commands/ralph.js.map +1 -0
  37. package/dist/src/commands/uninstall.d.ts.map +1 -1
  38. package/dist/src/commands/uninstall.js +25 -38
  39. package/dist/src/commands/uninstall.js.map +1 -1
  40. package/dist/src/core/manifest.d.ts +45 -0
  41. package/dist/src/core/manifest.d.ts.map +1 -1
  42. package/dist/src/core/manifest.js +37 -1
  43. package/dist/src/core/manifest.js.map +1 -1
  44. package/dist/src/hooks/statusline.d.ts.map +1 -1
  45. package/dist/src/hooks/statusline.js +189 -81
  46. package/dist/src/hooks/statusline.js.map +1 -1
  47. package/dist/src/ralph/cmd-check.d.ts +9 -0
  48. package/dist/src/ralph/cmd-check.d.ts.map +1 -0
  49. package/dist/src/ralph/cmd-check.js +53 -0
  50. package/dist/src/ralph/cmd-check.js.map +1 -0
  51. package/dist/src/ralph/cmd-complete.d.ts +10 -0
  52. package/dist/src/ralph/cmd-complete.d.ts.map +1 -0
  53. package/dist/src/ralph/cmd-complete.js +91 -0
  54. package/dist/src/ralph/cmd-complete.js.map +1 -0
  55. package/dist/src/ralph/cmd-next.d.ts +5 -0
  56. package/dist/src/ralph/cmd-next.d.ts.map +1 -0
  57. package/dist/src/ralph/cmd-next.js +158 -0
  58. package/dist/src/ralph/cmd-next.js.map +1 -0
  59. package/dist/src/ralph/cmd-session.d.ts +5 -0
  60. package/dist/src/ralph/cmd-session.d.ts.map +1 -0
  61. package/dist/src/ralph/cmd-session.js +52 -0
  62. package/dist/src/ralph/cmd-session.js.map +1 -0
  63. package/dist/src/ralph/cmd-skills.d.ts +6 -0
  64. package/dist/src/ralph/cmd-skills.d.ts.map +1 -0
  65. package/dist/src/ralph/cmd-skills.js +55 -0
  66. package/dist/src/ralph/cmd-skills.js.map +1 -0
  67. package/dist/src/ralph/skill-resolver.d.ts +40 -0
  68. package/dist/src/ralph/skill-resolver.d.ts.map +1 -0
  69. package/dist/src/ralph/skill-resolver.js +162 -0
  70. package/dist/src/ralph/skill-resolver.js.map +1 -0
  71. package/dist/src/ralph/skill-scanner.d.ts +15 -0
  72. package/dist/src/ralph/skill-scanner.d.ts.map +1 -0
  73. package/dist/src/ralph/skill-scanner.js +122 -0
  74. package/dist/src/ralph/skill-scanner.js.map +1 -0
  75. package/dist/src/ralph/status-checker.d.ts +7 -0
  76. package/dist/src/ralph/status-checker.d.ts.map +1 -0
  77. package/dist/src/ralph/status-checker.js +139 -0
  78. package/dist/src/ralph/status-checker.js.map +1 -0
  79. package/dist/src/ralph/status-schema.d.ts +94 -0
  80. package/dist/src/ralph/status-schema.d.ts.map +1 -0
  81. package/dist/src/ralph/status-schema.js +9 -0
  82. package/dist/src/ralph/status-schema.js.map +1 -0
  83. package/dist/src/ralph/status-store.d.ts +20 -0
  84. package/dist/src/ralph/status-store.d.ts.map +1 -0
  85. package/dist/src/ralph/status-store.js +70 -0
  86. package/dist/src/ralph/status-store.js.map +1 -0
  87. package/dist/src/tui/install-ui/ExecutionView.d.ts.map +1 -1
  88. package/dist/src/tui/install-ui/ExecutionView.js +14 -5
  89. package/dist/src/tui/install-ui/ExecutionView.js.map +1 -1
  90. package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
  91. package/dist/src/tui/install-ui/InstallExecution.js +89 -45
  92. package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
  93. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -1
  94. package/dist/src/tui/install-ui/InstallFlow.js +28 -14
  95. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -1
  96. package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -1
  97. package/dist/src/tui/install-ui/InstallResult.js +1 -1
  98. package/dist/src/tui/install-ui/InstallResult.js.map +1 -1
  99. package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts.map +1 -1
  100. package/dist/src/tui/uninstall-ui/UninstallFlow.js +12 -28
  101. package/dist/src/tui/uninstall-ui/UninstallFlow.js.map +1 -1
  102. package/dist/src/utils/update-notices.js +12 -0
  103. package/dist/src/utils/update-notices.js.map +1 -1
  104. package/package.json +1 -1
  105. package/workflows/knowledge-audit.md +358 -0
@@ -134,18 +134,19 @@ Next steps:
134
134
  /maestro-plan {phase} -- Re-plan with modifications
135
135
  ```
136
136
 
137
- **Completion status:**
137
+ **Completion (when invoked from ralph):**
138
+ End the step by calling the CLI (no `--- COMPLETION STATUS ---` text block):
138
139
  ```
139
- --- COMPLETION STATUS ---
140
- STATUS: DONE|NEEDS_CONTEXT
141
- CONCERNS: {description if applicable}
142
- NEXT: /maestro-execute
143
- --- END STATUS ---
140
+ maestro ralph complete <idx> --status DONE [--evidence scratch/{YYYYMMDD}-plan-P{N}-{slug}/plan.json]
144
141
  ```
145
142
 
146
- Status mapping:
147
- - **DONE** — Plan created/revised and confirmed → NEXT: /maestro-execute
148
- - **NEEDS_CONTEXT** — Ambiguous requirements, insufficient context to produce plan
143
+ STATUS verdicts (CLI-enforced enum):
144
+ - **DONE** — Plan created/revised and confirmed → next step picks up automatically
145
+ - **DONE_WITH_CONCERNS** — Plan produced but with explicit caveats; pass `--concerns "..."`
146
+ - **NEEDS_RETRY** — Plan failed (tooling error, transient issue); ralph will retry
147
+ - **BLOCKED** — External hard blocker (e.g., upstream artifact missing, dependency unavailable); pass `--reason "..."`
148
+
149
+ > Ambiguous requirements are NOT a completion status — resolve them in-place via `AskUserQuestion` during planning (≤3 rounds), then proceed to DONE. `NEEDS_CONTEXT` has been removed; context shortage is handled by the harness's automatic compaction.
149
150
 
150
151
  ### Mode: Revise / Check
151
152
 
@@ -29,32 +29,29 @@ Remaining → session_id (if matches maestro-* or ralph-*)
29
29
  ```
30
30
  Also read `session.auto_mode` from status.json — if true, treat as `-y`.
31
31
 
32
- **Node types:**
32
+ **Step kinds:**
33
33
 
34
- | Type | Execution | Flow after |
35
- |------|-----------|------------|
36
- | decision (ralph-only) | `Skill("maestro-ralph")` | Execution ends here |
37
- | internal (default) | `Read({file_path: step.command_path})` + 内联解释执行 | Self-invoke next |
38
- | external (opt-in) | `maestro delegate --to claude --mode write` (STOP → callback) | Self-invoke next |
34
+ | Kind | Identifier | Execution | Flow after |
35
+ |------|-----------|-----------|------------|
36
+ | decision step | `step.decision` 非空 | `Skill("maestro-ralph")` | Execution ends here |
37
+ | 执行 step | `step.decision == null` | `Bash("maestro ralph next")` 内联按其 stdout 执行 → `Bash("maestro ralph complete N --status ...")` | Self-invoke next |
39
38
 
40
39
  HARD RULES:
41
- - internal step:优先通过 `Read({command_path})` 把命令 .md 加载进当前会话,再按内容执行;不要对 internal step 使用 `Skill({skill})` 调用
42
- - **必须遵循 `<required_reading>` / `<deferred_reading>` 标签**:命令 .md 通常采用"入口 + workflow"形式,主体逻辑放在 workflow 文件中并通过 `<required_reading>` 引用;不加载 required_reading 会导致命令执行不完整
43
- - decision 节点例外:A_EXEC_DECISION 必须使用 `Skill({ skill: "maestro-ralph" })` 进行 handoff(这是 decision 节点的唯一允许用法)
44
- - `command_path` ralph A_BUILD_STEPS 写入 status.json;ralph-execute 不再自行解析(缺失 报错 E002)
45
- - external 仅在 `step.type == "external"` 显式声明时使用,并 always append `-y` 到 prompt args
46
- - 每个 step 必须产出 `--- COMPLETION STATUS ---` 块,否则视为 NEEDS_RETRY
40
+ - 执行 step:**统一通过 `maestro ralph next` CLI 加载**。CLI 负责读 command_path、解析 `<required_reading>` + `<deferred_reading>`、拼接 prompt、写 `step.load.*` + `active_step_index` + `step.status="running"`。不要再在会话里手动 Read + 解析 required_reading
41
+ - decision step:A_EXEC_DECISION 通过 `Skill({ skill: "maestro-ralph" })` handoff ralph 评估(不走 CLI)
42
+ - `command_path` ralph A_BUILD_STEPS 写入 status.json(缺失 → ralph next 返回 E006/E007 并拒绝执行)
43
+ - 每个 step 结束必须调用 `maestro ralph complete N --status <S>` 或 `maestro ralph retry N`。STATUS 4 个合法值:`DONE | DONE_WITH_CONCERNS | NEEDS_RETRY | BLOCKED`(**`NEEDS_CONTEXT` 已废除**,context 容量由 harness 自动压缩处理)
47
44
  </context>
48
45
 
49
46
  <invariants>
50
- 1. **Internal = Read + inline**通过 Read 读取 `step.command_path`,按其指令在当前 session 内执行
51
- 2. **Required reading must be loaded**命令 .md 中的 `<required_reading>` 引用的所有文件必须立即 Read;缺一 视为加载失败,pause session(E007
52
- 3. **Deferred reading recorded only** — `<deferred_reading>` 列出的文件路径需记录,执行过程按需 Read;不在加载阶段读取
53
- 4. **Skill loaded confirmation** 所有 required_reading 加载完成后必须输出一行确认:`✓ skill {step.skill} 加载完成 (required: N, deferred: M)`
54
- 5. **External = explicit only**`step.type == "external"` 才走 delegate;默认绝不发起
55
- 6. **必须显式 completion confirmation** — 每个 step 完成时需有 `STATUS: DONE` 且写入 `step.completion_confirmed = true`
56
- 7. **Self-invocation chain** 持续直到全部 `completion_confirmed` 或 paused
57
- 8. **status.json 每步骤后写盘**resume-safe
47
+ 1. **执行 = `ralph next` + inline + `ralph complete`** `maestro ralph next` 拿到 skill 内容,按 stdout 内联执行
48
+ 2. **Required reading CLI 负责**`ralph next` 自动展开 + 加载 `<required_reading>` 引用的所有文件,缺失退出码 1(E007),不写 active_step_index,不进入执行
49
+ 3. **Deferred reading recorded only** — `<deferred_reading>` 路径由 CLI 记录到 `step.load.deferred_files`,执行阶段按需 Read
50
+ 4. **一致性取代锁**同一 session 同时最多一个 step `active_step_index`;CLI 校验失败直接退出码 3,不静默推进
51
+ 5. **Completion 通过 CLI 调用**每个 step 末尾调 `maestro ralph complete N --status <S>` 或 `maestro ralph retry N`,由 CLI 写 `completion_*` + 清 `active_step_index`
52
+ 6. **Self-invocation chain** — 持续直到全部 `completion_confirmed` paused
53
+ 7. **status.json 每步骤后由 CLI 原子写盘** resume-safe
54
+ 8. **STATUS 枚举受限**仅 `DONE | DONE_WITH_CONCERNS | NEEDS_RETRY | BLOCKED`;`NEEDS_CONTEXT` 已废除
58
55
  </invariants>
59
56
 
60
57
  <state_machine>
@@ -80,14 +77,13 @@ S_RESOLVE_ARGS:
80
77
  → S_EXECUTE DO: A_RESOLVE_ARGS
81
78
 
82
79
  S_EXECUTE:
83
- → END WHEN: step.type == "decision" DO: A_EXEC_DECISION
84
- → S_POST_EXEC WHEN: step.type == "internal" + success DO: A_EXEC_INTERNAL
85
- → S_HANDLE_FAIL WHEN: step.type == "internal" + failure DO: A_EXEC_INTERNAL
86
- → END WHEN: step.type == "external" DO: A_EXEC_EXTERNAL
87
- (STOP after background delegate; on callback → S_POST_EXEC or S_HANDLE_FAIL)
80
+ → END WHEN: step.decision != null DO: A_EXEC_DECISION
81
+ → S_POST_EXEC WHEN: step.decision == null + ralph complete invoked with DONE|DONE_WITH_CONCERNS DO: A_EXEC_STEP
82
+ → S_HANDLE_FAIL WHEN: step.decision == null + ralph next exit≠0 OR ralph complete with NEEDS_RETRY|BLOCKED DO: A_EXEC_STEP
88
83
 
89
84
  S_POST_EXEC:
90
- → S_LOCATE DO: A_MARK_COMPLETE + Skill("maestro-ralph-execute")
85
+ → S_LOCATE DO: Bash("maestro ralph complete ...") + Skill("maestro-ralph-execute")
86
+ NOTE: CLI 已写完 completion_*, status, active_step_index;无需额外写盘
91
87
 
92
88
  S_HANDLE_FAIL:
93
89
  → S_LOCATE WHEN: auto + not retried DO: A_RETRY
@@ -110,8 +106,8 @@ S_FALLBACK:
110
106
 
111
107
  1. If session_id provided → load `.workflow/.maestro/{session_id}/status.json`
112
108
  2. Else: scan `.workflow/.maestro/*/status.json`, filter `status == "running"`, sort DESC, take first
113
- 3. Extract: session_id, source, steps[], current_step, phase, milestone, intent, auto_mode, context, cli_tool
114
- 4. Find first step with `status == "pending"` next step
109
+ 3. Extract: session_id, source, steps[], phase, milestone, intent, auto_mode, context, cli_tool, active_step_index
110
+ 4. **不在此处选 pending step**——pending 选择由 `maestro ralph next` CLI 内部完成;A_LOCATE_SESSION 只确认 session 存在且 running,由 A_EXEC_STEP 调 CLI 推进
115
111
 
116
112
  ### A_RESOLVE_ARGS
117
113
 
@@ -153,79 +149,41 @@ Write enriched args back to status.json.
153
149
  ### A_EXEC_DECISION
154
150
 
155
151
  1. Mark step running, write status.json
156
- 2. Display: `[{index}/{total}] ◆ {decision} Retry: {retry}/{max}`
152
+ 2. Display: `[{index}/{total}] ◆ {step.decision} Retry: {retry}/{max}`
157
153
  3. `Skill({ skill: "maestro-ralph" })` — ralph 评估 + handoff
158
154
  4. 执行在此结束
159
155
 
160
- ### A_EXEC_INTERNAL
161
-
162
- 1. Validate `step.command_path != null`;否则 raise E002,pause session
163
- 2. Mark step running, write status.json
164
- 3. Display: `[{index}/{total}] {step.skill} [internal · {step.command_scope}]`
165
- 4. `Read({ file_path: step.command_path })` — 把命令 .md 全文加载进当前会话(prefer Read over Skill for internal steps;decision 节点另行使用 Skill 见 A_EXEC_DECISION)
166
- 5. **解析 reading 标签**("入口 + workflow"形式核心步骤):
167
- - 抽取 frontmatter `argument-hint` / `allowed-tools`
168
- - 抽取 `<required_reading>` 块的所有 `@path` 引用 → 立刻 `Read({ file_path: <expanded path> })` 加载(`~/` / `@~/` 展开为用户主目录);任一文件缺失或读取失败 → raise E007,pause session
169
- - 抽取 `<deferred_reading>` 块的所有路径 → 仅记录到 `step.deferred_reads = [...]`,执行阶段按需 Read
170
- - 抽取 `<purpose>/<context>/<state_machine>/<execution>/<actions>` 等指令块
171
- 6. **加载完成确认**:required_reading 全部成功 Read 后,输出一行:
172
- ```
173
- ✓ skill {step.skill} 加载完成 (required: {N}, deferred: {M})
174
- ```
175
- 其中 N = required_reading 引用数,M = deferred_reading 路径数(缺省块按 0 计)
176
- 7. 计算 `effective_args`:`step.args` + auto flag(`auto ? (flag_map[step.skill] || "") : ""`)
177
- 8. 按读到的指令在本会话中**内联执行**:调用允许的工具完成命令所规定的工作,不再发起 delegate;执行过程中如触发 deferred_reading 引用的资源 → 按需 Read
178
- 9. 执行结束:要求最后一段必须包含 `--- COMPLETION STATUS ---` 块(见 A_MARK_COMPLETE)
179
- 10. Return success / failure
180
-
181
- **Auto flag map**: 所有 lifecycle skill → `-y`; `quality-test` → `-y --auto-fix`; 未列出 → 无 flag
182
-
183
- ### A_EXEC_EXTERNAL
156
+ ### A_EXEC_STEP
184
157
 
185
- 仅当 `step.type == "external"` 时使用(默认链路不产生)。
158
+ 1. **Load** — `Bash("maestro ralph next")`
159
+ - 退出码 0 → 按 stdout 内联执行
160
+ - 退出码 2 → 交给 S_LOCATE
161
+ - 退出码 3 → active_step_index 已被占用
162
+ - 退出码 1 → pause session
163
+ 2. **Inline execution** — 按 stdout 执行;deferred_reading 按需 Read
164
+ 3. **Complete**:
165
+ - `Bash("maestro ralph complete N --status DONE [--evidence <path>]")`
166
+ - `Bash("maestro ralph complete N --status DONE_WITH_CONCERNS --concerns \"...\"")`
167
+ - `Bash("maestro ralph retry N")`
168
+ - `Bash("maestro ralph complete N --status BLOCKED --reason \"...\"")`
169
+ 4. **Propagate context signals** — 关键信号 (`PHASE: N` / `scratch_dir: path` / `BLP-xxx`) 写入 `status.json.context`
186
170
 
187
- 1. Mark step running, write status.json
188
- 2. Display: `[{index}/{total}] ⚡ {step.skill} [external]`
189
- 3. 始终在 prompt 内追加 `-y`(delegate session 非交互):`flag = flag_map[step.skill] || "-y"`
190
- 4. Execute:
191
- ```
192
- Bash({
193
- command: `maestro delegate "/${step.skill} ${effective_args}" --to claude --mode write`,
194
- run_in_background: true, timeout: 600000
195
- })
196
- STOP — wait for callback.
197
- ```
198
- 5. On callback: 把回调输出视为 step 的执行结果 → S_POST_EXEC / S_HANDLE_FAIL
199
-
200
- ### A_MARK_COMPLETE
201
-
202
- 1. 从 step 输出中提取 `--- COMPLETION STATUS ---` 块(required)
203
- 2. 解析并写入:
204
- - `STATUS: DONE` → `step.status = "completed"`, `step.completion_confirmed = true`, `step.completion_status = "DONE"`
205
- - `STATUS: DONE_WITH_CONCERNS` → `step.status = "completed"`, `step.completion_confirmed = true`, `step.completion_status = "DONE_WITH_CONCERNS"`, `step.concerns = <CONCERNS>`
206
- - `STATUS: NEEDS_RETRY` → `step.status = "pending"`, `step.retried = true`, `step.completion_confirmed = false`, → S_HANDLE_FAIL
207
- - `STATUS: BLOCKED` / `NEEDS_CONTEXT` → `session.status = "paused"`, `step.completion_status` 记录原因, `step.completion_confirmed = false`
208
- - 缺失 `--- COMPLETION STATUS ---` 块 → 视为 NEEDS_RETRY(不允许 heuristic fallback)
209
- 3. 写入 `step.completion_evidence`(artifact 路径 / 关键输出节选)
210
- 4. 扫描输出抓取 context 信号:`PHASE: N` → session.phase;`scratch_dir: path` → context.scratch_dir;`BLP-xxx` → context.blueprint_session_id
211
- 5. `step.completed_at = now`,写 status.json
212
- 6. **Sub-goal evidence 校验**(task_decomposition 存在时):若 `step.goal_ref` 对应子目标的 `lifecycle` 覆盖当前 stage 且 evidence artifact 已生成 → 暂不直接置 done,仍交由 post-goal-audit 决策;仅在 step 显式确认时更新 `task_decomposition[*].completion_confirmed = false` 占位(保持 pending)
213
- 7. Display: `[{index}/{total}] ✓ {step.skill} completed (confirmed)`
171
+ 完成后 S_LOCATE 触发 `Skill({ skill: "maestro-ralph-execute" })` 自调用。
214
172
 
215
173
  ### A_RETRY
216
174
 
217
- 1. `step.retried = true`, `step.status = "pending"`, `step.error = null`, `step.completion_confirmed = false`
218
- 2. Write status.json
175
+ 1. `Bash("maestro ralph retry N")` — CLI 设 `step.retried = true`, `step.status = "pending"`, `step.completion_confirmed = false`, `active_step_index`
176
+ 2. Display: `[{index}/{total}] ↻ {step.skill} retry`
219
177
 
220
178
  ### A_SKIP_STEP
221
179
 
222
- 1. `step.status = "skipped"`, `step.completion_confirmed = false`
223
- 2. Write status.json
180
+ 跳过执行 step — 手动编辑 `status.json`:将该 step `status` 设为 `"skipped"`,`completion_confirmed` 设为 `false`,并清 `active_step_index`(若指向此 step)。
181
+ (不提供 CLI 子命令;跳过是非常规操作,避免自动化误用。)
224
182
 
225
183
  ### A_PAUSE_SESSION
226
184
 
227
- 1. `session.status = "paused"`, write status.json
228
- 2. Display: `[{index}/{total}] ✗ {step.skill} 失败,会话已暂停。/maestro-ralph continue 恢复。`
185
+ 通常由 `ralph complete N --status BLOCKED --reason "..."` 触发,CLI 已写 `session.status = "paused"`。手动 pause 场景下直接编辑 status.json
186
+ Display: `[{index}/{total}] ✗ {step.skill} 失败,会话已暂停。/maestro-ralph continue 恢复。`
229
187
 
230
188
  ### A_COMPLETE_SESSION
231
189
 
@@ -240,14 +198,14 @@ Write enriched args back to status.json.
240
198
  Session: {session_id} [{source}]
241
199
  Steps: {completed}/{total} confirmed: {confirmed}/{completed}
242
200
 
243
- [✓] 0. maestro-plan 1 [internal · global]
244
- [✓] 1. maestro-execute 1 [internal · project]
245
- [✓] 2. maestro-verify 1 [internal · global]
201
+ [✓] 0. maestro-plan 1 [global]
202
+ [✓] 1. maestro-execute 1 [project]
203
+ [✓] 2. maestro-verify 1 [global]
246
204
  [✓] 3. ◆ post-verify [decision]
247
205
  ...
248
206
  ============================================================
249
207
  ```
250
- Icons: `✓` confirmed, `—` skipped, `✗` failed, `◆` decision, `⚡` external
208
+ Icons: `✓` confirmed, `—` skipped, `✗` failed, `◆` decision
251
209
 
252
210
  </actions>
253
211
 
@@ -260,31 +218,30 @@ Write enriched args back to status.json.
260
218
  | Code | Severity | Description | Recovery |
261
219
  |------|----------|-------------|----------|
262
220
  | E001 | error | No running session found | Suggest /maestro or /maestro-ralph |
263
- | E002 | error | step.command_path missing for internal step | Pause, ask ralph to rebuild step |
264
- | E003 | error | status.json corrupt | Show path, manual check |
265
- | E004 | error | Delegate failed + user abort | Mark paused, suggest resume |
266
- | E005 | error | COMPLETION STATUS block missing | Trigger NEEDS_RETRY |
267
- | E007 | error | required_reading file 缺失或读取失败 | List missing paths, pause session |
221
+ | E006 | error | command_path missing/unreachable for 执行 step | `ralph next` 拒绝;编辑 status.json 或重 build |
222
+ | E007 | error | required_reading 引用文件缺失 | `ralph next` 拒绝;CLI stderr 列出缺失路径 |
223
+ | E008 | error | `ralph complete` idx active_step_index | 编辑 status.json 修正一致性 |
224
+ | E009 | error | `ralph complete` step.status running | 重复 complete 或非法跳跃;编辑 status.json |
225
+ | E010 | error | status.json schema 损坏 | `ralph check` 显示具体损坏字段 |
268
226
  | W001 | warning | Step completed with concerns | Log and continue |
269
- | W002 | warning | command .md `<required_reading>` 标签 | 直接执行 .md 主体,跳过加载阶段 |
227
+ | W005 | warning | active_step_index 指向已 completed step | `ralph next` 自动清理后继续 |
228
+ | W007 | warning | step.skill ≠ command .md frontmatter.name | 提示但不阻塞 |
270
229
 
271
230
  ### Success Criteria
272
231
 
273
232
  - [ ] Session discovery covers maestro-* and ralph-*
274
- - [ ] `-y` parsed from args 或 session.auto_mode
233
+ - [ ] `-y` parsed from args 或 session.auto_mode;auto=true 时透传 `-y` 到 skill args
275
234
  - [ ] Placeholders resolved;per-skill enrichment 正确
276
- - [ ] Decision 节点 Skill("maestro-ralph") handoff
277
- - [ ] Internal 节点通过 Read({step.command_path}) 内联执行,禁止 Skill()
278
- - [ ] Internal 节点 Read 后必须解析并加载 `<required_reading>` 引用的文件;缺失 E007 pause
279
- - [ ] `<deferred_reading>` 仅记录路径到 `step.deferred_reads`,执行阶段按需 Read
280
- - [ ] required_reading 加载完成后输出 `✓ skill {name} 加载完成 (required: N, deferred: M)`
281
- - [ ] External 仅在显式声明时走 delegate,prompt 必带 `-y`
282
- - [ ] 每个 step 强制 `--- COMPLETION STATUS ---`;缺失 → NEEDS_RETRY
283
- - [ ] step.completion_confirmed = true 仅在 STATUS: DONE/DONE_WITH_CONCERNS 时设置
284
- - [ ] step.completion_evidence 记录 artifact path / 输出节选
285
- - [ ] Context signals 传播 status.json
235
+ - [ ] Decision 节点(`step.decision != null`)走 Skill("maestro-ralph") handoff(**不调 ralph next CLI**)
236
+ - [ ] 执行 step 通过 `Bash("maestro ralph next")` 加载;CLI 返回拼好的 prompt + completion 协议
237
+ - [ ] required_reading CLI 自动加载并拼入 prompt;缺失CLI 退出码 1,pause session
238
+ - [ ] `<deferred_reading>` CLI 记录到 `step.load.deferred_files`,执行阶段按需 Read
239
+ - [ ] 每个 step 末尾必须调 `maestro ralph complete N --status <S>` 或 `maestro ralph retry N`
240
+ - [ ] STATUS 枚举仅 `DONE | DONE_WITH_CONCERNS | NEEDS_RETRY | BLOCKED`;CLI 拒绝 `NEEDS_CONTEXT`
241
+ - [ ] active_step_index 一致性由 CLI 维护;E008/E009 直接退出,不静默推进
242
+ - [ ] step.completion_evidence 通过 `--evidence` 传入并记录
243
+ - [ ] Context signals 由执行 step 显式写回 status.json.context(非 ralph-execute 内嵌扫描)
286
244
  - [ ] Auto mode: retry 一次后 pause;interactive 提供 retry/skip/abort
287
245
  - [ ] 自调用持续到全部 completion_confirmed 或 paused
288
- - [ ] A_COMPLETE_SESSION 校验全部 step confirmed + sub-goal all_done
289
246
 
290
247
  </appendix>
@@ -17,7 +17,7 @@ Closed-loop decision engine for the maestro workflow lifecycle.
17
17
  Reads project state → infers position → builds adaptive chain → delegates execution.
18
18
 
19
19
  Entry points:
20
- - **`/maestro-ralph "intent"`** — New session: infer → decompose → build → (decomposition → emit /goal prompt, STOP;否则 dispatch ralph-execute)
20
+ - **`/maestro-ralph "intent"`** — New session: infer → decompose → build → emit /goal prompt(如有 decomposition)→ dispatch ralph-execute
21
21
  - **`/maestro-ralph continue`** — Wrapper; dispatches to ralph-execute(首选直接 `/maestro-ralph-execute` 推进 step)
22
22
  - **`/maestro-ralph status`** — Display session progress
23
23
 
@@ -25,10 +25,9 @@ Entry points:
25
25
 
26
26
  Initial decomposition (S_DECOMPOSE): boundary-clarified via ≤3 questions for broad intents (重构/全面/迁移/重写). 写入 status.json 的 `boundary_contract` / `execution_criteria` / `task_decomposition`,附 `/goal` prompt。
27
27
 
28
- Node types:
29
- - **internal** (default): ralph-execute `Read({command_path})` 命令 .md,按内容内联执行
30
- - **decision**: ralph 评估
31
- - **external**: 仅在显式声明时使用(`maestro delegate --to claude`)
28
+ Step kinds:
29
+ - **执行 step**: ralph-execute `Bash("maestro ralph next")` 加载 command .md + required_reading 全文,按 stdout 内联执行
30
+ - **decision step**: `step.decision` 字段非空;回 ralph 评估(CLI 只读分析)
32
31
 
33
32
  Key difference from maestro coordinator:
34
33
  - maestro: static chain → one-time selection → runs all steps
@@ -45,9 +44,9 @@ Mutual invocation with `/maestro-ralph-execute` forms a self-perpetuating work l
45
44
  │ writes status.json
46
45
  │ emits /goal prompt
47
46
 
48
- ralph-execute ◀─┐ internalRead(command_path) inline
49
- │ │ decision → Skill("maestro-ralph")
50
- └─────────┘ writes step.completion_confirmed
47
+ ralph-execute ◀─┐ 执行 step `maestro ralph next` + inline + `ralph complete`
48
+ │ │ decision step → Skill("maestro-ralph")
49
+ └─────────┘ CLI writes step.completion_confirmed
51
50
  loop until all completion_confirmed | paused
52
51
  ```
53
52
  </purpose>
@@ -70,14 +69,14 @@ Remaining → intent
70
69
 
71
70
  <invariants>
72
71
  1. **Ralph never executes steps** — only creates sessions and evaluates decisions
73
- 2. **Handoff via Skill("maestro-ralph-execute")** — 仅当 session `task_decomposition` 时在创建后自动 handoff;decomposition 路径 STOP 等用户输入。decision 评估后始终 handoff
72
+ 2. **Handoff via Skill("maestro-ralph-execute")** — 创建 session 后始终自动 handoff;decision 评估后始终 handoff
74
73
  3. **Decision delegates read-only** — `maestro delegate --role analyze --mode analysis`
75
- 4. **Default type = internal** `external` 仅显式标注时出现,build 不默认生成
74
+ 4. **执行 step 通过 `maestro ralph next` CLI 加载并内联执行**(详见 invariant 8)
76
75
  5. **status.json 是唯一真源** — 不生成 markdown 清单或侧文件
77
- 6. **每个 step 必须 `completion_confirmed: true`** — 基于 `--- COMPLETION STATUS ---` `STATUS: DONE`;缺失则视为未完成
78
- 7. **command_path 在 A_BUILD_STEPS 解析** — 全局优先 `~/.claude/commands/{name}.md`,fallback 项目 `.claude/commands/{name}.md`,写入 status.json
79
- 8. **Internal step 加载契约** — ralph-execute `command_path` 后,必须解析并加载该命令 `<required_reading>` 引用的所有文件("入口 + workflow"形式的核心),并把 `<deferred_reading>` 路径记录到 `step.deferred_reads`;加载完成后输出 `✓ skill {name} 加载完成`。ralph build 阶段只解析路径,不读 .md 内容
80
- 9. **Decomposition is outcome-oriented** — sub-goals 为可观测交付,禁止 lifecycle 复刻;`/goal` 用户绑定,ralph 只发提示词后 STOP,等用户输入
76
+ 6. **每个 step 必须 `completion_confirmed: true`** — `maestro ralph complete N --status DONE`(或 DONE_WITH_CONCERNS)写入;CLI 是唯一合法写入路径
77
+ 7. **command_path 在 A_BUILD_STEPS 解析** — 通过 `maestro ralph skills --json --quiet` 预校验(project 覆盖 global),命中即写绝对路径到 status.json;未命中标 `command_scope = "missing"`
78
+ 8. **执行 step 加载契约** — 由 `maestro ralph next` CLI 在执行期完成:解析 frontmatter + `<required_reading>` + `<deferred_reading>`,自动读取 required 文件全文并拼入 prompt;缺失 required 退出码 1(E007),pause session。ralph build 阶段只通过 `maestro ralph skills` 校验路径存在性,不读 .md 内容
79
+ 9. **Decomposition is outcome-oriented** — sub-goals 为可观测交付,禁止 lifecycle 复刻;`/goal` 用户绑定,ralph 输出提示词后继续 handoff,用户可在执行过程中随时输入 `/goal`
81
80
  10. **planning_mode governs arg granularity** — `unified` → skill args 无 `{phase}`;`independent` → 含 `{phase}`
82
81
  11. **task_decomposition 驱动 steps[] 动态生长** — `post-goal-audit` 按 unmet 子目标插入 scoped mini-loop;字段可选/累加,既有字段不删不改
83
82
  </invariants>
@@ -149,9 +148,8 @@ S_BUILD_CHAIN:
149
148
  → S_CREATE_SESSION DO: A_BUILD_STEPS
150
149
 
151
150
  S_CREATE_SESSION:
152
- END WHEN: task_decomposition present DO: A_CREATE_SESSION (emits Goal Prompt → STOP,等用户输入 /goal 后手动 /maestro-ralph-execute)
153
- S_CONFIRM WHEN: not auto_confirm AND no decomposition DO: A_CREATE_SESSION
154
- → S_DISPATCH WHEN: auto_confirm AND no decomposition DO: A_CREATE_SESSION
151
+ S_CONFIRM WHEN: not auto_confirm DO: A_CREATE_SESSION
152
+ S_DISPATCH WHEN: auto_confirm DO: A_CREATE_SESSION
155
153
 
156
154
  S_CONFIRM:
157
155
  → S_DISPATCH WHEN: user selects "Proceed"
@@ -161,7 +159,7 @@ S_CONFIRM:
161
159
  S_DISPATCH:
162
160
  → END DO: Skill({ skill: "maestro-ralph-execute" })
163
161
 
164
- S_DECISION_EVAL:
162
+ S_DECISION_EVAL: (decision 节点 == `step.decision` 非空,下述 gate 名取自该字段)
165
163
  → S_APPLY_VERDICT WHEN: quality-gate (post-verify, post-business-test, post-review, post-test)
166
164
  DO: A_DELEGATE_EVALUATE
167
165
  → S_APPLY_VERDICT WHEN: goal-gate (post-goal-audit)
@@ -200,7 +198,7 @@ S_FALLBACK:
200
198
 
201
199
  1. Find latest ralph session (by created_at)
202
200
  2. Display: Session, Status, Position, Progress, Current step
203
- 3. List steps: [✓] completion_confirmed, [▸] current, [ ] pending, [◆] decision;附 `command_scope`(global/project) + `command_path`
201
+ 3. List steps: [✓] completion_confirmed, [▸] current, [ ] pending, [◆] decision(`step.decision` 非空);执行 step 附 `command_scope`(global/project) + `command_path`
204
202
  4. If `task_decomposition` present (absent → skip):
205
203
  ```
206
204
  Sub-goals ({done}/{total}) source: {session_dir}/status.json#/task_decomposition
@@ -380,24 +378,26 @@ narrow → derive defaults from intent + codebase, skip questions.
380
378
 
381
379
  Generate steps from `session.lifecycle_position` to `milestone-complete`.
382
380
 
383
- | Stage | Skill (independent) | Skill (unified) | Type | Decision after | quality_mode |
384
- |-------|---------------------|-----------------|------|----------------|--------------|
385
- | brainstorm | `maestro-brainstorm "{intent}"` | *(same)* | internal | — | all |
386
- | blueprint | `maestro-blueprint "{intent}"` | *(same)* | internal | — | all |
387
- | init | `maestro-init` | *(same)* | internal | — | all |
388
- | analyze-macro | `maestro-analyze "{intent}"` | *(same)* | internal | `post-analyze-scope` | all |
389
- | roadmap | `maestro-roadmap --from analyze:{analyze_macro_id}` | *(same)* | internal | — | all |
390
- | analyze | `maestro-analyze {phase}` | `maestro-analyze` | internal | — | all |
391
- | plan | `maestro-plan {phase}` *(scope=phase)* / `maestro-plan --from analyze:{analyze_macro_id}` *(scope=standalone)* / `maestro-plan --from blueprint:{blueprint_id}` *(scope=standalone)* | `maestro-plan` | internal | — | all |
392
- | execute | `maestro-execute {phase}` | `maestro-execute` | internal | — | all |
393
- | verify | `maestro-verify {phase}` | `maestro-verify` | internal | `post-verify` | all |
394
- | business-test | `quality-auto-test {phase}` | `quality-auto-test` | internal | `post-business-test` | full only |
395
- | review | `quality-review {phase}` | `quality-review` | internal | `post-review` | all (quick: append `--tier quick`) |
396
- | test-gen | `quality-auto-test {phase}` | `quality-auto-test` | internal | — | full / standard if coverage<80% |
397
- | test | `quality-test {phase}` | `quality-test` | internal | `post-test` | full, standard |
398
- | milestone-audit | `maestro-milestone-audit` | *(same)* | internal | — | all |
399
- | goal-audit | *(decision-only)* | *(same)* | decision | `post-goal-audit` | all (only if decomposed) |
400
- | milestone-complete | `maestro-milestone-complete` | *(same)* | internal | `post-milestone` | all |
381
+ | Stage | Skill (independent) | Skill (unified) | Decision after | quality_mode |
382
+ |-------|---------------------|-----------------|----------------|--------------|
383
+ | brainstorm | `maestro-brainstorm "{intent}"` | *(same)* | — | all |
384
+ | blueprint | `maestro-blueprint "{intent}"` | *(same)* | — | all |
385
+ | init | `maestro-init` | *(same)* | — | all |
386
+ | analyze-macro | `maestro-analyze "{intent}"` | *(same)* | `post-analyze-scope` | all |
387
+ | roadmap | `maestro-roadmap --from analyze:{analyze_macro_id}` | *(same)* | — | all |
388
+ | analyze | `maestro-analyze {phase}` | `maestro-analyze` | — | all |
389
+ | plan | `maestro-plan {phase}` *(scope=phase)* / `maestro-plan --from analyze:{analyze_macro_id}` *(scope=standalone)* / `maestro-plan --from blueprint:{blueprint_id}` *(scope=standalone)* | `maestro-plan` | — | all |
390
+ | execute | `maestro-execute {phase}` | `maestro-execute` | — | all |
391
+ | verify | `maestro-verify {phase}` | `maestro-verify` | `post-verify` | all |
392
+ | business-test | `quality-auto-test {phase}` | `quality-auto-test` | `post-business-test` | full only |
393
+ | review | `quality-review {phase}` | `quality-review` | `post-review` | all (quick: append `--tier quick`) |
394
+ | test-gen | `quality-auto-test {phase}` | `quality-auto-test` | — | full / standard if coverage<80% |
395
+ | test | `quality-test {phase}` | `quality-test` | `post-test` | full, standard |
396
+ | milestone-audit | `maestro-milestone-audit` | *(same)* | — | all |
397
+ | goal-audit | *(decision-only)* | *(same)* | `post-goal-audit` | all (only if decomposed) |
398
+ | milestone-complete | `maestro-milestone-complete` | *(same)* | `post-milestone` | all |
399
+
400
+ > 所有执行 stage 统一通过 `maestro ralph next` CLI 加载 + 内联执行;decision 节点单独作为独立 step 插入(见规则 4)。
401
401
 
402
402
  **Build rules (按顺序应用):**
403
403
 
@@ -405,18 +405,19 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
405
405
  1. **起点**:从 `session.lifecycle_position` 开始
406
406
  2. **跳过已完成**:跳过当前 milestone+phase 下已有 completed artifact 的 stage(按 `session.phase` 过滤);unified 按 milestone 过滤
407
407
  3. **quality_mode 过滤**:按 `session.quality_mode` 排除不匹配 stage
408
- 4. **决策节点**:每个 Decision after 非空的 stage 之后插入 `{ type: "decision", decision: "<gate>", retry_count: 0, max_retries: 2 }`
408
+ 4. **决策节点**:每个 Decision after 非空的 stage 之后插入 `{ decision: "<gate>", retry_count: 0, max_retries: 2, command_scope: null, command_path: null }`
409
409
  5. **goal-audit 插入**:`task_decomposition` 存在时,在最后一个 evidence-producing stage(verify/review/test)之后、`milestone-complete` 之前插入 `decision:post-goal-audit`
410
410
  6. **终点硬约束**:chain 以 `milestone-complete` 结尾
411
411
  7. **goal_ref 传播**:`task_decomposition` 存在时,每个 step 按 `step.stage ∈ g.lifecycle` 匹配 `step.goal_ref = g.id`(多匹配取字典序最小);decision 节点不打 goal_ref
412
412
  8. **占位符**:independent 保留 `{phase}` `{intent}`;unified 不带 `{phase}`
413
- 9. **command_path 解析**(每个非 decision step):
413
+ 9. **command_path 解析**(每个执行 step,decision 节点跳过):
414
414
  - 取 skill 名(args 前的第一个 token)
415
- - 全局优先:`~/.claude/commands/{name}.md` 存在 `command_scope = "global"`
416
- - Fallback:`.claude/commands/{name}.md` 存在 → `command_scope = "project"`
417
- - 两者都缺`command_scope = "missing"`, `command_path = null`,A_CREATE_SESSION 报错 E006
418
- - **不在 build 阶段读取 .md 内容**;`<required_reading>` / `<deferred_reading>` 解析与加载由 ralph-execute A_EXEC_INTERNAL 负责(保持入口/工作流分离)
419
- 10. **每个 step 初始化** `completion_confirmed: false`, `completion_status: null`, `completion_evidence: null`, `deferred_reads: []`
415
+ - **预校验通过 `Bash("maestro ralph skills --json --quiet")`** 一次性拉取所有可用 commands + skills(global + project,project 覆盖 global),匹配 skill 名得到:
416
+ - 命中 commands → `command_scope = "global" | "project"`,`command_path = <绝对路径>`
417
+ - 命中 skills 同上(type=skill)
418
+ - 未命中 `command_scope = "missing"`, `command_path = null`,A_CREATE_SESSION 报错 E006
419
+ - **不在 build 阶段读取 .md 内容**;`<required_reading>` / `<deferred_reading>` 解析与加载由 `maestro ralph next` CLI 在执行期完成
420
+ 10. **每个 step 初始化** `completion_confirmed: false`, `completion_status: null`, `completion_evidence: null`, `deferred_reads: []`, `load: null`(由 `ralph next` 写入)
420
421
  11. **scope_verdict gating**(仅当 chain 起点 = `analyze-macro`):
421
422
  - `scope_verdict ∈ {medium, small}` → 跳过 `roadmap` + `analyze` 两 stage;`plan` 选 standalone 列(`--from analyze:{analyze_macro_id}`),不带 `{phase}`
422
423
  - `scope_verdict == large` → 保留 `roadmap` + `analyze`;`plan` 选 phase 列(`{phase}`)
@@ -434,7 +435,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
434
435
  1. Validate: 所有 step 的 `command_scope != "missing"`;否则 raise E006 + 列出缺失 skill
435
436
  2. Write `.workflow/.maestro/ralph-{YYYYMMDD-HHmmss}/status.json` (Appendix: Session Schema)
436
437
  3. Display chain overview:每步显示 `{index}. {skill} [{type}] [{command_scope}]`
437
- 4. If `task_decomposition` present: display **Goal Prompt block** (Appendix) → STOP,等用户输入 `/goal`(auto_confirm 也不跳过)
438
+ 4. If `task_decomposition` present: display **Goal Prompt block** (Appendix),不阻塞流程,继续 handoff
438
439
 
439
440
  ### A_DELEGATE_EVALUATE
440
441
 
@@ -595,6 +596,8 @@ Runs only when `task_decomposition` present.
595
596
  {
596
597
  "session_id": "ralph-{YYYYMMDD-HHmmss}",
597
598
  "source": "ralph", "status": "running",
599
+ "ralph_protocol_version": "1", // CLI-driven; absent/0 → legacy inline ralph-execute
600
+ "active_step_index": null, // CLI-managed; only one step held at a time
598
601
  "intent": "", "lifecycle_position": "",
599
602
  "phase": null, "phase_is_new": false,
600
603
  "milestone": "", // D-007 反查结果,禁止读 current_milestone
@@ -609,13 +612,15 @@ Runs only when `task_decomposition` present.
609
612
  "analysis_dir": null, "brainstorm_dir": null, "blueprint_dir": null },
610
613
  "steps": [{
611
614
  "index": 0,
612
- "type": "internal|external|decision",
613
- "skill": "",
615
+ "skill": "", // 执行 step 有值;decision 节点为空字符串/null
614
616
  "args": "",
615
617
  "stage": "", // brainstorm|blueprint|init|analyze-macro|roadmap|analyze|plan|execute|verify|...
616
618
  "scope": null, // "phase"|"standalone"|"milestone"|null(plan 等需要)
617
- "command_scope": "global|project|missing|null",
618
- "command_path": "~/.claude/commands/{name}.md | .claude/commands/{name}.md | null",
619
+ "decision": null, // 非 null → decision 节点(值为 gate 名,如 "post-verify");null → 执行 step
620
+ "retry_count": 0, // decision 节点专用
621
+ "max_retries": 2, // decision 节点专用
622
+ "command_scope": "global|project|missing|null", // 执行 step;decision 节点固定 null
623
+ "command_path": "<absolute path resolved by `maestro ralph skills --json --quiet`> | null",
619
624
  "milestone_id": null, // D-007 反查注入;仅含 {phase} 占位符的 step 有
620
625
  "source_artifact_ref": null, // "analyze:ANL-xxx" | "blueprint:BLP-xxx" | null
621
626
  "status": "pending|running|completed|skipped|failed",
@@ -624,7 +629,8 @@ Runs only when `task_decomposition` present.
624
629
  "completion_status": null,
625
630
  "completion_evidence": null,
626
631
  "completed_at": null,
627
- "deferred_reads": [] // 由 ralph-execute A_EXEC_INTERNAL 解析 .md 时填充
632
+ "deferred_reads": [], // 由 ralph next CLI 解析 .md 时填充
633
+ "load": null // { loaded_at, required_files[], deferred_files[], resolve_version } —— 由 ralph next 写入
628
634
  }],
629
635
  "waves": [], "current_step": 0,
630
636
 
@@ -646,7 +652,7 @@ Runs only when `task_decomposition` present.
646
652
 
647
653
  ### Fix-Loop Templates
648
654
 
649
- 所有插入 step 默认 `type: "internal"`,按 A_BUILD_STEPS 规则 9 解析 `command_path` + `command_scope`。
655
+ 所有插入的执行 step A_BUILD_STEPS 规则 9 解析 `command_path` + `command_scope`;`decision:*` 条目为 decision 节点(`step.decision` 字段)。
650
656
 
651
657
  **post-verify:**
652
658
  ```
@@ -708,12 +714,12 @@ decision:post-goal-audit {retry+1}
708
714
  链路概览后逐字显示(仅当 decomposition 已产出):
709
715
 
710
716
  ```
711
- 📋 任务分解完成。复制以下 /goal 设定终止条件,随后运行 /maestro-ralph-execute:
717
+ 📋 任务分解完成。可随时复制以下 /goal 设定终止条件(执行过程中输入即可):
712
718
 
713
719
  /goal 直到 {session_dir}/status.json 的 task_decomposition[*] 与 steps[*] 全部 completion_confirmed=true 才停。每轮以 status.json 为唯一行动手册,通过 /maestro-ralph-execute 推进 step;decision 节点由其自动 handoff 回 ralph 评估。禁止手动执行 skill 或修改 boundary_contract.out_of_scope。
714
720
  ```
715
721
 
716
- `/goal` 由用户输入;ralph 只输出此提示词。判据以 status.json 为权威。
722
+ `/goal` 由用户输入;ralph 输出提示词后继续 handoff,不阻塞。
717
723
 
718
724
  ### Error Codes
719
725
 
@@ -745,8 +751,8 @@ decision:post-goal-audit {retry+1}
745
751
  - [ ] quality_mode 由 A_DETERMINE_QUALITY_MODE 决定,过滤 build steps
746
752
  - [ ] Decomposition: broad intent ≤3 question clarify;narrow auto-derive
747
753
  - [ ] status.json 唯一真源:boundary_contract + execution_criteria + task_decomposition;无外部清单
748
- - [ ] 每个 step 默认 `type: "internal"`,含 `command_scope` + `command_path`(全局优先 fallback 项目)
749
- - [ ] Ralph build 阶段只解析路径,不读 .md 内容;`<required_reading>` 加载由 ralph-execute A_EXEC_INTERNAL 完成
754
+ - [ ] 执行 step `command_scope` + `command_path`(通过 `maestro ralph skills --json --quiet` 预校验,project 覆盖 global);decision step 通过 `step.decision` 字段标识
755
+ - [ ] Ralph build 阶段只通过 `ralph skills` 校验路径存在性,不读 .md 内容;`<required_reading>` 加载由 `maestro ralph next` CLI 完成
750
756
  - [ ] 每个 step 含 `completion_confirmed` + `completion_status` + `completion_evidence` + `deferred_reads`(初始 false/null/[])
751
757
  - [ ] 每个 sub-goal 含 `completion_confirmed`(初始 false)
752
758
  - [ ] post-goal-audit decision 仅在 decomposed 时插入,位于 milestone-complete 之前