dev-flow-deepseek 0.7.2 → 0.7.4

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.
package/README.md CHANGED
@@ -11,27 +11,28 @@ macOS arm64 Core executable。
11
11
 
12
12
  | 项目 | 当前支持 |
13
13
  | --- | --- |
14
- | Package | `dev-flow-deepseek@0.7.2` |
15
- | Bundled Core | `0.6.1` |
14
+ | Package | `dev-flow-deepseek@0.7.4` |
15
+ | Bundled Core | `0.6.3` |
16
16
  | Platform | macOS arm64 |
17
17
  | Node.js | `>=24` |
18
18
  | DSH | `>=0.1.0-rc.6` |
19
- | Release | [deepseek-v0.7.2](https://github.com/Innocent-children/dev-flow/releases/tag/deepseek-v0.7.2) |
19
+ | Release | [deepseek-v0.7.4](https://github.com/Innocent-children/dev-flow/releases/tag/deepseek-v0.7.4) |
20
20
 
21
- `0.7.2` 的 normal release 已通过 registry package 安装、显式触发、Core handshake、
21
+ `0.7.4` 的 normal release 已通过 registry package 安装、显式触发、Core handshake、
22
22
  restart/resume、`DONE`、remove、uninstall、retained reopen 和 repository-unchanged 门禁。上表
23
23
  记录已验证的精确公开版本;下面的安装命令使用 npm `latest` dist-tag 获取当前最新稳定 package。
24
24
 
25
25
  ## 安装与验证
26
26
 
27
- DSH 是前置 Host。`create-dev-flow` 独立发布后,用户只需指定真实 Profile,默认使用 `web`:
27
+ DSH 是前置 Host。使用 `dev-flow` 时只需指定真实 Profile,默认使用 `web`:
28
28
 
29
29
  ```bash
30
- npx @imotong/create-dev-flow@latest
30
+ npm install -g @imotong/dev-flow@latest
31
+ dev-flow
31
32
  ```
32
33
 
33
- 当前公开稳定制品尚未包含该新 manager package。发布前或诊断恢复时继续使用以下 Host 原生命令;
34
- 需要其他 Profile 时修改 `PROFILE` 的值,不要把 `<profile>` 原样输入 shell:
34
+ 诊断恢复时仍可使用以下 Host 原生命令;需要其他 Profile 时修改 `PROFILE` 的值,不要把
35
+ `<profile>` 原样输入 shell:
35
36
 
36
37
  ```bash
37
38
  npm install -g @deepseek-ai/dsh@latest
@@ -89,11 +90,11 @@ dsh --profile "$PROFILE" --dump-config
89
90
  模型文本、Skill 注入或仓库内容不能替代 selector;空调用或普通讨论不会创建 Task。
90
91
 
91
92
  通过 admission 后,Adapter 首先读取 server info,验证 `standard-development`、definition
92
- digest、method profiles、live schemas 和恰好六个工具,再创建或恢复当前仓库的 Task。
93
+ digest、method profiles、live schemas 和恰好十五个工具,再创建或恢复当前仓库的 Task。
93
94
 
94
95
  Task 可选择 `plain`、`spec-kit` 或 `openspec` profile。Core 管理 current node、legal transitions、
95
96
  destination、Recovery、blocker 和 terminal outcome;Adapter 负责执行当前节点工作、呈现完整 Action
96
- 并转发 closed payload。
97
+ 并通过当前 Action 指定的提交工具转发节点结果。
97
98
 
98
99
  ## 两仓声明、Workspace Root 与可选索引
99
100
 
@@ -127,16 +128,25 @@ DeepSeek 与 Codex 共用同一 Repository Scope、scoped path、Action 和唯
127
128
 
128
129
  ## MCP 工具
129
130
 
130
- DeepSeek Adapter 暴露与 Codex 相同的六工具 Core catalog;在 DSH 中会使用限定后的 tool name,
131
+ DeepSeek Adapter 暴露与 Codex 相同的十五工具 Core catalog;在 DSH 中会使用限定后的 tool name,
131
132
  但 Core tool identity 保持不变。
132
133
 
133
134
  | MCP 工具 | 作用 |
134
135
  | --- | --- |
135
136
  | `dev_flow_server_info` | 读取 Core identity、能力、process、method profile、工具目录和 DeepSeek 有效索引偏好;有效 admission 后必须首先调用。 |
136
137
  | `dev_flow_open_task` | 为 Workspace Root 内显式声明的主/附加仓库创建一个 Task,或从任一参与仓库恢复同一 Task。 |
137
- | `dev_flow_get_task` | 读取持久化 Task;可附带 operation probe 获取 Recovery assessment。 |
138
- | `dev_flow_get_next_action` | 读取当前节点的权威 Action、验证预算、method steps 和全部合法 transition。 |
139
- | `dev_flow_apply_action` | 使用当前 revision、Action identity、repository binding 和 closed payload 应用一次 Core 声明的 transition;允许写入的 node result 提交精确 `changed_paths` 或 `no_file_changes`,artifact references 只作为证据。输入 Schema 是单个封闭对象,`action_kind` 与 `payload` 在 Host callable 中完整可见;精确分支由 Core 校验,失败时返回字段级 `error.details[]`、`error.guard` 与一次 `correct_current_action` 纠正许可。 |
138
+ | `dev_flow_get_task` | 读取持久化 Task;存在 Core 保存的提交时自动返回 Recovery assessment。 |
139
+ | `dev_flow_get_next_action` | 读取当前 Action、`submission_tool`、验证预算、method steps 和全部合法 transition。 |
140
+ | `dev_flow_submit_requirements` | 提交 REQUIREMENTS 节点结果;Core 补齐完整 Action identity 和内部 payload |
141
+ | `dev_flow_submit_design` | 提交 DESIGN 节点结果。 |
142
+ | `dev_flow_submit_tasks` | 提交 TASKS 节点结果。 |
143
+ | `dev_flow_submit_implementation` | 提交 IMPLEMENT 节点结果。 |
144
+ | `dev_flow_submit_test` | 提交 TEST 节点结果。 |
145
+ | `dev_flow_submit_comprehension` | 提交 COMPREHENSION_REVIEW 节点结果。 |
146
+ | `dev_flow_submit_refactor` | 提交 REFACTOR 节点结果。 |
147
+ | `dev_flow_submit_delivery` | 提交 DELIVERY 节点结果。 |
148
+ | `dev_flow_resolve_blocker` | 使用 Task ID 与 Action ID 解除已满足条件的 blocker。 |
149
+ | `dev_flow_recover_action` | 使用 Core 保存的规范化提交恢复不确定 Action,不重新发送 payload。 |
140
150
  | `dev_flow_cancel_task` | 使用当前 revision 和明确 reason 取消一个非终态 Task。 |
141
151
 
142
152
  ## 数据与恢复
@@ -144,11 +154,14 @@ DeepSeek Adapter 暴露与 Codex 相同的六工具 Core catalog;在 DSH 中
144
154
  Task data 位于 Dev Flow 的本地数据目录,不属于 DSH plugin 配置。移除、卸载或重新安装 package
145
155
  不会删除 Task data,也不会修改目标 Git 仓库或 Codex-owned state。
146
156
 
147
- mutation 响应不确定时,Adapter 保留原 operation identitypayload,先读取 Core 的五分类
148
- Recovery 结论,再决定恢复动作。它不盲目重试,也不自行选择 destination。
157
+ mutation 响应不确定时,Adapter 只保留 Task IDAction ID,先读取 Core 保存的规范化提交,再调用
158
+ `dev_flow_recover_action` 或按 advice 停止。它不重建原始 payload,也不自行选择 destination。
149
159
 
150
- 当前 Core 只接受当前 SQLite Schema。不兼容或 pre-graph data 会返回
151
- `SCHEMA_UNSUPPORTED` 并保持零写入;用户可以选择新的数据目录,或在 Core 外部手工处理旧目录。
160
+ 当前 Core 只接受当前 SQLite Schema。不兼容或 pre-graph data 在普通启动时保持零写入并返回
161
+ `reset_required`。package 携带的同一 Core 支持 `dev-flow webui start|open|status|stop|reset`;WebUI 只监听
162
+ loopback,DeepSeek 与 Codex 复用同一进程和数据。reset 先展示精确 database/sidecar 目标,再要求当前
163
+ target-bound token 和数据库独占访问;浏览器没有 reset mutation。界面支持简体中文/英文,首次跟随系统
164
+ 语言,手工选择只保存在浏览器。完整说明见 [WebUI](../../docs/WEBUI.md)。
152
165
 
153
166
  ## 卸载与彻底清理
154
167
 
@@ -177,7 +190,7 @@ rm -rf "$HOME/Library/Application Support/dev-flow"
177
190
  ## Package 内容
178
191
 
179
192
  Package 只包含一个 `cordis.patch.yml` layer、Adapter libraries、`dev-flow` Skill、references、
180
- license 和一个 darwin-arm64 Core。它不包含 source tree、tests、fixtures、用户数据或构建日志,
193
+ license 和一个内嵌 WebUI 资产的 darwin-arm64 Core。它不包含 source tree、tests、fixtures、用户数据或构建日志,
181
194
  也不提供独立 `bin` executable。
182
195
 
183
196
  ## 维护者入口
@@ -6,7 +6,16 @@ export const DEV_FLOW_RAW_TOOL_NAMES = Object.freeze([
6
6
  "dev_flow_open_task",
7
7
  "dev_flow_get_task",
8
8
  "dev_flow_get_next_action",
9
- "dev_flow_apply_action",
9
+ "dev_flow_submit_requirements",
10
+ "dev_flow_submit_design",
11
+ "dev_flow_submit_tasks",
12
+ "dev_flow_submit_implementation",
13
+ "dev_flow_submit_test",
14
+ "dev_flow_submit_comprehension",
15
+ "dev_flow_submit_refactor",
16
+ "dev_flow_submit_delivery",
17
+ "dev_flow_resolve_blocker",
18
+ "dev_flow_recover_action",
10
19
  "dev_flow_cancel_task",
11
20
  ]);
12
21
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dev-flow-deepseek",
3
- "version": "0.7.2",
3
+ "version": "0.7.4",
4
4
  "private": false,
5
5
  "description": "Explicit DeepSeek Harness adapter for the Dev Flow process graph.",
6
6
  "license": "Apache-2.0",
@@ -24,6 +24,7 @@
24
24
  "test": "node --test tests/*.test.mjs",
25
25
  "test:package": "node --test tests/package-contract.test.mjs",
26
26
  "test:bundle": "node --test tests/bundle-contract.test.mjs",
27
+ "build:webui": "../../scripts/build-webui.sh",
27
28
  "pack:dry": "pnpm pack --dry-run --json"
28
29
  },
29
30
  "engines": {
Binary file
@@ -49,14 +49,23 @@ call. Require one complete structured result proving:
49
49
  - `method_profiles` is exactly `plain`, `spec-kit`, `openspec` in that order;
50
50
  - `host_preferences.deepseek.codebase_memory` is present and is exactly a JSON boolean; it expresses
51
51
  a preference only and does not prove that codebase-memory is installed or available;
52
- - the tool catalog contains exactly these six raw names, in this order:
52
+ - the tool catalog contains exactly these fifteen raw names, in this order:
53
53
 
54
54
  1. `dev_flow_server_info`
55
55
  2. `dev_flow_open_task`
56
56
  3. `dev_flow_get_task`
57
57
  4. `dev_flow_get_next_action`
58
- 5. `dev_flow_apply_action`
59
- 6. `dev_flow_cancel_task`
58
+ 5. `dev_flow_submit_requirements`
59
+ 6. `dev_flow_submit_design`
60
+ 7. `dev_flow_submit_tasks`
61
+ 8. `dev_flow_submit_implementation`
62
+ 9. `dev_flow_submit_test`
63
+ 10. `dev_flow_submit_comprehension`
64
+ 11. `dev_flow_submit_refactor`
65
+ 12. `dev_flow_submit_delivery`
66
+ 13. `dev_flow_resolve_blocker`
67
+ 14. `dev_flow_recover_action`
68
+ 15. `dev_flow_cancel_task`
60
69
 
61
70
  Any other schema, unsupported process version, absent process digest, false new-task support,
62
71
  incomplete method-profile set, missing/additional/reordered tool, or incomplete, truncated, malformed,
@@ -169,10 +178,15 @@ For an active task, perform each iteration in this order:
169
178
  Task and is reported with the declared repository key; do not shrink the Core Scope and continue.
170
179
  6. Render and perform each current method operation under the allowed effects, repository
171
180
  instructions, verification budget, and current user authority.
172
- 7. Build only the closed payload branch named by the Action and select only a Core-returned
173
- transition consistent with the actual typed node facts.
174
- 8. Before dispatch, generate and retain one opaque request ID plus the exact Action identity and
175
- payload. Submit exactly one `mcp__dev_flow__dev_flow_apply_action` mutation.
181
+ 7. Select only a Core-returned transition and build the closed input of
182
+ `fresh_action.submission_tool` from the actual typed node facts.
183
+ `changed_paths` contains only repository paths newly changed while performing this current Action,
184
+ relative to its issuance binding. Do not repeat paths changed by an earlier node. When the current
185
+ Action only reads files or runs verification commands, submit `changed_paths=[]` and
186
+ `no_file_changes=true`, even when the Task's implementation already has uncommitted paths.
187
+ 8. Submit exactly one call to that qualified tool with `host`, `task_id`, `action_id`, the selected
188
+ transition, result text, artifact slots, method results and the exact node result. Core fills and
189
+ retains the complete Action identity and payload envelope.
176
190
  9. After a complete committed result, continue only from its authoritative next Action/outcome or a
177
191
  fresh ordinary Core read.
178
192
 
@@ -194,17 +208,16 @@ immutable profile:
194
208
  - A tool invocation is not semantic completion. Record evidence only after the work and expected
195
209
  result actually complete.
196
210
 
197
- Build exactly one `MethodEvidence` item for every current Action step, in the same order:
211
+ Build one `method_results` member for every current Action step, keyed by its exact `step_id`.
212
+ Provide only `capability` and `summary`: use the actual capability ID after capability completion,
213
+ or an empty capability after completed ordinary work. Core adds the step identity, order and status.
198
214
 
199
- - actual capability completion uses `status=completed` and the actual capability ID;
200
- - completed ordinary work uses `status=plain_fallback` and an empty capability;
201
- - incomplete work uses `status=unavailable` or `status=not_run` honestly.
202
-
203
- An unavailable or not-run required step is unsatisfied, so do not call `mcp__dev_flow__dev_flow_apply_action`.
215
+ An unavailable or not-run required step is unsatisfied, so do not call the submission tool.
204
216
  Capability output cannot substitute for the typed `node_result`, node obligations, evidence, or
205
- user decision. Artifact references contain only an observed role, contract path, digest, and
206
- summary. A single-repository Task uses an ordinary repository-relative path. A multi-repository Task
207
- uses `<repository-key>::<repository-relative-path>`.
217
+ user decision. Put artifacts produced for the current node in `artifacts.current` when that member
218
+ exists, and related method artifacts in `artifacts.other_process`. Core assigns the artifact role.
219
+ A single-repository Task uses an ordinary repository-relative path. A multi-repository Task uses
220
+ `<repository-key>::<repository-relative-path>`.
208
221
 
209
222
  Existing authorized spec, plan, or tasks artifacts should be reviewed, revised, or amended as
210
223
  needed, not regenerated or rerun mechanically because a semantic step appears. Resolve the active
@@ -229,84 +242,45 @@ Use the same `fresh_action` already bound from `result.task.current_action` or `
229
242
  not construct another Action view.
230
243
 
231
244
  Read [the node payload construction reference](references/node-payloads.md) from the packaged path
232
- `references/node-payloads.md` before every ordinary apply. The reference is construction guidance;
233
- the fresh Action, live `mcp__dev_flow__dev_flow_apply_action` `inputSchema`, and Core remain authoritative.
234
-
235
- Before calling `mcp__dev_flow__dev_flow_apply_action`, perform this order exactly:
236
-
237
- `fresh_action.payload_contract` identifies the payload branch that must agree with the live schema
238
- and packaged template.
239
-
240
- 1. Rebind the complete `fresh_action` and read its `action_kind`, `current_node`, `payload_contract`,
241
- `method_steps`, and all `available_transitions`.
242
- 2. Read the live `mcp__dev_flow__dev_flow_apply_action` `inputSchema`. It is one closed object:
243
- `action_kind` is a top-level `enum` of every action kind and `payload` is a closed object whose
244
- `node_result` declares the union of every node result member. The schema does not narrow `payload`
245
- by `action_kind`, so select the branch from `fresh_action.action_kind` plus
246
- `fresh_action.payload_contract` and send only that branch's members.
247
- 3. Open the corresponding marked template in `references/node-payloads.md`.
248
- 4. Preserve the template's complete common envelope and `node_result` wrapper; replace only dynamic
249
- values with facts from the current Task, Action, user decision, repository work, and actual check.
250
- 5. Use current baseline revisions, work-item IDs, record IDs, acceptance, and evidence sets; never
251
- guess or reuse stale values.
252
- 6. Confirm all six common payload members exist and no seventh member exists.
253
- 7. Confirm every branch-specific required `node_result` key exists and arrays remain arrays.
254
- 8. Confirm every ArtifactReference role belongs to the live closed enum. Never convert a
255
- `required_evidence` kind such as `repository_observation` into an artifact role. Use
256
- `"artifacts": []` when no real repository-relative process artifact exists.
257
- 9. Confirm MethodEvidence exactly matches current Action steps in ID, order, and count. Completed
258
- `plain` work uses `plain_fallback` with an empty capability.
259
- 10. Confirm the selected transition is present in the fresh Action and its reason rule matches.
260
- 11. Confirm `destination`, `next_node`, `next_cursor`, caller classification, repository facts,
261
- payload digest, raw output, and unknown members are absent.
262
- 12. Map the mutation top-level identity from that same fresh Action.
263
- 13. Retain the exact request and call `mcp__dev_flow__dev_flow_apply_action` once.
245
+ `references/node-payloads.md` before every ordinary submission. The reference explains the exact
246
+ `node_result` fields; the live schema named by `fresh_action.submission_tool` and Core remain current.
247
+
248
+ Before submitting, perform this order:
249
+
250
+ 1. Rebind `fresh_action` and read `submission_tool`, `action_id`, `method_steps`, and all
251
+ `available_transitions`.
252
+ 2. Read the live schema of that exact qualified submission tool. Do not choose another submit tool.
253
+ 3. Open the matching node-result template and fill only current facts. Use current baseline
254
+ revisions, work-item IDs, record IDs, acceptance and evidence sets.
255
+ 4. Set `host="deepseek"`, copy only `task_id` and `action_id`, and select one returned
256
+ `transition_id`.
257
+ 5. Provide `summary`, the transition's required or empty `reason`, and the exact `node_result`.
258
+ 6. Put current-node artifacts in `artifacts.current` only when the live schema exposes it. Put
259
+ related method artifacts in `artifacts.other_process`. Each entry contains only `path`, `digest`
260
+ and `summary`; Core assigns the role.
261
+ 7. Build `method_results` as a closed object keyed by every returned method `step_id`. Each member
262
+ contains only `capability` and `summary`; Core assigns step identity, order and status.
263
+ 8. Confirm `request_id`, revision, action kind, process identity, source cursor, repository binding,
264
+ payload envelope, destination and recovery fields are absent.
265
+ 9. Call `fresh_action.submission_tool` once.
264
266
 
265
267
  If the live schema and packaged reference disagree, stop before mutation and report the packaging
266
268
  contract defect. Do not choose whichever shape appears more convenient.
267
269
 
268
- Do not derive payload keys from `required_evidence`. Do not search the repository or installed
269
- package, inspect a binary or log, or start another MCP server to recover a schema. The selected
270
- payload contains exactly `transition_id`, `summary`, `reason`, `artifacts`, `method_evidence`, and
271
- `node_result`; put `problem_class` exactly where that node branch's actual schema requires it. Keep
272
- arrays as arrays and the payload as an object. Do not add unknown fields, caller classification,
273
- caller digest, authoritative repository facts, command/output/configuration data, `destination`,
274
- `next_node`, or `next_cursor`, and do not wrap the whole request in an outer `payload`.
275
-
276
- Map every mutation top-level field from the same fresh Action:
277
-
278
- - caller-generated opaque identity -> top-level `request_id`;
279
- - exact value `deepseek` -> top-level `host`;
280
- - `fresh_action.task_id` -> top-level `task_id`;
281
- - `fresh_action.revision` -> top-level `revision`;
282
- - `fresh_action.action_id` -> top-level `action_id`;
283
- - `fresh_action.action_kind` -> top-level `action_kind`;
284
- - `fresh_action.process_id` -> top-level `process_id`;
285
- - `fresh_action.process_definition_digest` -> top-level `process_definition_digest`;
286
- - `fresh_action.current_node` -> top-level `source_cursor`;
287
- - `fresh_action.repository_binding_digest` -> top-level `repository_binding_digest`;
288
- - the selected closed payload -> top-level `payload`.
289
-
290
270
  ```text
291
- apply_arguments = {
292
- "request_id": caller_request_id,
271
+ submission_arguments = {
293
272
  "host": "deepseek",
294
273
  "task_id": fresh_action.task_id,
295
- "revision": fresh_action.revision,
296
274
  "action_id": fresh_action.action_id,
297
- "action_kind": fresh_action.action_kind,
298
- "process_id": fresh_action.process_id,
299
- "process_definition_digest": fresh_action.process_definition_digest,
300
- "source_cursor": fresh_action.current_node,
301
- "repository_binding_digest": fresh_action.repository_binding_digest,
302
- "payload": payload_for_selected_schema_branch
275
+ "transition_id": selected_transition_id,
276
+ "summary": normalized_summary,
277
+ "reason": required_or_empty_reason,
278
+ "artifacts": artifact_slots,
279
+ "method_results": method_results_by_step_id,
280
+ "node_result": exact_current_node_result
303
281
  }
304
282
  ```
305
283
 
306
- `revision` remains an integer, not a string. `payload` remains an object, not a string. Do not wrap
307
- that request inside an outer `payload` object. For an ordinary mutation, omit `recovery_apply` or
308
- send `recovery_apply=null`.
309
-
310
284
  If Core returns `INVALID_ARGUMENT`, treat it as a complete payload-contract rejection, not transport
311
285
  uncertainty. Use the bounded-correction section only when the complete result explicitly authorizes
312
286
  `correct_current_action`; otherwise stop and report the failing contract without private data. Never
@@ -351,46 +325,17 @@ selector again; no background handling is promised.
351
325
 
352
326
  A mutation result is uncertain when it is missing, cancelled, malformed, truncated, or
353
327
  transport-failed instead of returning one complete structured result. Do not immediately repeat
354
- `mcp__dev_flow__dev_flow_apply_action` and do not infer the result from repository state or worktree contents.
355
-
356
- Before calling `mcp__dev_flow__dev_flow_apply_action`, retain the original `request_id`, `task_id`, `process_id`,
357
- `process_definition_digest`, `source_cursor`, `revision`, `action_id`,
358
- `action_kind`, `repository_binding_digest`, and exact closed `payload` from the same fresh action and
359
- the same apply dispatch. Never derive or reconstruct them from an incomplete response or partial
360
- output.
361
-
362
- When all required original identity values are retained, construct exactly this closed
363
- `operation_probe`:
364
-
365
- ```json
366
- {
367
- "operation_id": "<original apply request_id>",
368
- "process_id": "standard-development",
369
- "process_definition_digest": "<original process definition digest>",
370
- "source_cursor": "<original source cursor>",
371
- "expected_revision": 3,
372
- "action_id": "<original action id>",
373
- "action_kind": "<original action kind>",
374
- "repository_binding_digest": "<original issuance binding digest>",
375
- "payload": {}
376
- }
377
- ```
378
-
379
- `operation_id` is the original apply `request_id`, never a read request ID.
380
- `expected_revision` is the original action `revision`. `repository_binding_digest` is the original
381
- issuance binding. `payload` is the exact original closed payload; when it was not completely
382
- retained, send JSON `null`. Never reconstruct it from partial output, repository text, or model
383
- memory.
328
+ the submission tool and do not infer the result from repository state or worktree contents.
384
329
 
385
- Use the original `task_id` to call `mcp__dev_flow__dev_flow_get_task` with that exact probe. A stale pre-dispatch
386
- Task snapshot is not an authoritative read-back. Require one complete `recovery_assessment` with the
387
- original graph operation identity, binding relations, operation evidence, optional committed proof,
388
- retry flag, `next_advice`, optional unblock condition, and observation time. Stop if it is absent,
389
- truncated, malformed, or refers to another operation.
330
+ Retain only the `task_id` and `action_id` used for the call. Core retains the complete normalized
331
+ Action identity and payload before the Task transition. Call `mcp__dev_flow__dev_flow_get_task` with
332
+ ordinary `host` and `task_id`; do not construct `operation_probe` and do not reconstruct any payload.
333
+ Require one complete `recovery_assessment`. Stop if it is absent, truncated, malformed, or refers to
334
+ another Action.
390
335
 
391
336
  Then call `mcp__dev_flow__dev_flow_get_next_action` for the same task before considering any mutation.
392
- Compare the fresh Task and next Action's revision, action identity, current node, last operation, and
393
- recovery advice with the retained original identity. A missing, malformed, truncated, blocker, or
337
+ Compare the fresh Task and next Action's action identity, current node, last operation, and recovery
338
+ advice with the retained Action ID. A missing, malformed, truncated, blocker, or
394
339
  terminal next-action result is a safe-stop, not permission to replay.
395
340
 
396
341
  DSH reconnect restores transport and tool registrations only. It never replays, retries, resumes, or
@@ -400,24 +345,17 @@ still applies, and any later user turn that dispatches those reads must contain
400
345
  Do not implement or branch on the five-class decision table. Obey only Core's complete
401
346
  `next_advice`:
402
347
 
403
- - `retry_current_action`: retry the ordinary current action only when Core also returns
404
- `action_retry_safe=true` and the authoritative task still exposes the exact original action;
405
- - `submit_recovery_apply`: submit the retained original top-level operation identity and payload,
406
- adding exactly `recovery_apply={"operation_id":<original request_id>,"source_cursor":<original
407
- source_cursor>}`; do not add a new recovery operation ID, destination, or classification;
348
+ - `retry_current_action`: re-perform the current Action's allowed repository work from the fresh Task
349
+ and Action, then call `mcp__dev_flow__dev_flow_recover_action` with exactly `host`, the retained
350
+ `task_id`, and the retained `action_id`; Core reuses the saved result, so do not rebuild it;
351
+ - `submit_recovery_apply`: call that recovery tool with those same three fields immediately;
408
352
  - `read_next_action`: read the authoritative next action and continue only from that result;
409
- - `resolve_blocker`: stop ordinary work and handle only the Core-returned current
410
- `RESOLVE_BLOCKER` action;
353
+ - `resolve_blocker`: call `mcp__dev_flow__dev_flow_resolve_blocker` with the current blocked Action's
354
+ `task_id` and `action_id` after the required repository condition has been restored;
411
355
  - `stop_for_repository_drift`: report the bounded drift condition and stop.
412
356
 
413
357
  Never infer that an unlisted action is safe. A recovery read itself cannot create a blocker or adopt
414
- work. Only a Core-requested explicit recovery apply may do so, and its result becomes the next
415
- authority.
416
-
417
- If any required identity is missing or incomplete, do not construct or send an `operation_probe`;
418
- send no fabricated or half probe. Do not fill missing values from a partial response, do not assume
419
- `not_started`, and do not automatically retry. Stop and report that the Skill cannot prove the
420
- mutation state.
358
+ work. If the original `task_id` or `action_id` is missing, stop; do not rebuild it from partial output.
421
359
 
422
360
  Do not branch, decide, or interpret any recovery classification and do not guess from repository
423
361
  state. Core owns classification, effect proof, blocker eligibility, and mutation directives.
@@ -425,8 +363,7 @@ state. Core owns classification, effect proof, blocker eligibility, and mutation
425
363
  A complete structured `ok=false` result is an authoritative domain error, not transport
426
364
  uncertainty. Never convert or treat that domain error as missing or transport failure. Obey Core's
427
365
  `code`, `message`, `recovery.retry_safe`, `recovery.action`, and `recovery.message`. When it reports
428
- `retry_safe=false` and `action=none`, stop; do not call `mcp__dev_flow__dev_flow_get_next_action` or
429
- `mcp__dev_flow__dev_flow_apply_action`.
366
+ `retry_safe=false` and `action=none`, stop; do not submit or recover the Action.
430
367
 
431
368
  ## Bounded correction of the current action
432
369
 
@@ -434,16 +371,16 @@ A complete structured domain error may carry field-level detail. `error.details[
434
371
  failing member as `path`, a closed `rule`, and a fixed non-sensitive `message`. A refused transition
435
372
  may instead carry `error.guard` with the Core `guard_id` and the same failure shape.
436
373
 
437
- Submit exactly one corrected payload for the same Action only when every condition holds:
374
+ Submit exactly one corrected input through the same `fresh_action.submission_tool` only when every
375
+ condition holds:
438
376
 
439
377
  1. the original result is a complete structured Core domain error;
440
378
  2. `recovery.action` is `correct_current_action`;
441
379
  3. `recovery.retry_safe` is `true`;
442
- 4. Task revision, action ID, process identity, source cursor, and repository binding are unchanged;
443
- 5. the corrected request uses a new `request_id`;
444
- 6. only members listed in `recovery.allowed_paths` change;
445
- 7. the corrected value follows directly from the returned `rule`, with no source-code guessing;
446
- 8. every other payload byte keeps the same meaning.
380
+ 4. the current Task still exposes the same Action ID and submission tool;
381
+ 5. only members listed in `recovery.allowed_paths` change;
382
+ 6. the corrected value follows directly from the returned `rule`, with no source-code guessing;
383
+ 7. every other submitted fact keeps the same meaning.
447
384
 
448
385
  Stop immediately when the second submission also fails. Do not submit a third candidate payload;
449
386
  report only the exact `path`, `rule`, and that the bounded correction still failed. Never report
@@ -79,7 +79,7 @@ only when actually visible and appropriate to the current authorized artifacts.
79
79
  | `implementation.record_surface` | Record exact changed paths or the no-change state and deviations. | Observe and record the exact changed surface. | Direct implementation result; no mandatory capability. | Direct apply result; no mandatory capability. | Changed paths or explicit no-change result. |
80
80
  | `implementation.classify_deviations` | Classify deviations as requirement, design, or complexity concerns. | Record the exact concern and route it through Core facts. | Direct classification; amend active artifacts before continuing when semantics change. | Direct classification and current change-artifact update. | Exact deviations and findings. |
81
81
  | `test.run_budgeted_checks` | Run only verification authorized by the current verification budget. | Run the current bounded verification steps. | Direct plan-defined checks; no mandatory Spec Kit capability. | Use `openspec-verify` only when visible; otherwise run plan-defined checks. | Actual current verification result. |
82
- | `test.record_evidence` | Record actual evidence sources, outcomes, and unverified or manual items. | Record actual sources and statuses without relabeling. | Direct evidence recording; no mandatory capability. | Direct evidence recording; no mandatory capability. | Current bounded evidence summary. |
82
+ | `test.record_evidence` | Record actual evidence sources, outcomes, and unverified or manual items. | Record actual sources and statuses without relabeling; report only file changes newly produced by this TEST Action. Verification-only work uses `changed_paths=[]` and `no_file_changes=true`. | Direct evidence recording; no mandatory capability. | Direct evidence recording; no mandatory capability. | Current bounded evidence summary. |
83
83
  | `test.classify_failure` | Classify failures as implementation, design, or requirement problems. | Classify current failures from observed facts. | Direct classification; no mandatory capability. | Direct classification; no mandatory capability. | Exact failure class and findings. |
84
84
  | `comprehension.explain` | Explain current behavior, design, and code paths in developer-readable terms. | Present a bounded explanation to the developer. | Direct review; no Spec Kit command owns the verdict. | Direct review; no OpenSpec command owns the verdict. | Developer-readable explanation. |
85
85
  | `comprehension.identify_complexity` | Identify unnecessary abstractions and maintenance risks. | List concrete complexity and maintenance concerns. | Direct review; no mandatory capability. | Direct review; no mandatory capability. | Exact abstraction and risk findings. |
@@ -1,342 +1,100 @@
1
- # current Core contract Node Payload Construction
1
+ # Action submission reference
2
+
3
+ The current Action's `submission_tool` is the only mutation tool for that Action. Its live schema
4
+ is the exact input contract. The Host sends current work results; Core fills revision, Action kind,
5
+ process identity, source cursor, repository binding, artifact roles, method step identity/order/status
6
+ and the internal payload envelope.
7
+
8
+ ## Common input
9
+
10
+ Every ordinary submission contains exactly:
11
+
12
+ - `host`, `task_id`, and `action_id`;
13
+ - one `transition_id` returned by the current Action;
14
+ - normalized `summary` and the transition's required or empty `reason`;
15
+ - `artifacts`, split into the live schema's optional `current` slot and required
16
+ `other_process` slot;
17
+ - `method_results`, keyed by every current `method_steps[].step_id`;
18
+ - the action-specific `node_result`.
19
+
20
+ Artifact entries contain only `path`, `digest`, and `summary`. Core assigns the role. Method
21
+ result entries contain only `capability` and `summary`. Use the actual capability ID when one
22
+ completed the step, otherwise use an empty capability after completed ordinary work.
23
+
24
+ Do not send `request_id`, revision, Action kind, process identity, source cursor, repository binding,
25
+ `payload`, `method_evidence`, artifact `role`, destination, or recovery fields.
26
+
27
+ ## Tool mapping
28
+
29
+ | Action kind | Submission tool |
30
+ | --- | --- |
31
+ | `COMPLETE_REQUIREMENTS` | `dev_flow_submit_requirements` |
32
+ | `COMPLETE_DESIGN` | `dev_flow_submit_design` |
33
+ | `COMPLETE_TASKS` | `dev_flow_submit_tasks` |
34
+ | `COMPLETE_IMPLEMENTATION` | `dev_flow_submit_implementation` |
35
+ | `COMPLETE_TEST` | `dev_flow_submit_test` |
36
+ | `COMPLETE_COMPREHENSION_REVIEW` | `dev_flow_submit_comprehension` |
37
+ | `COMPLETE_REFACTOR` | `dev_flow_submit_refactor` |
38
+ | `COMPLETE_DELIVERY` | `dev_flow_submit_delivery` |
39
+ | `RESOLVE_BLOCKER` | `dev_flow_resolve_blocker` |
40
+
41
+ ## Node-result members
42
+
43
+ Use the live tool schema for types and nested members. These are the closed top-level members:
44
+
45
+ | Submission tool | Required `node_result` members |
46
+ | --- | --- |
47
+ | Requirements | `problem_class`, `baseline`, `unresolved_questions`, `changed_paths`, `no_file_changes` |
48
+ | Design | `problem_class`, `baseline`, `findings`, `changed_paths`, `no_file_changes` |
49
+ | Tasks | `problem_class`, `baseline`, `findings`, `changed_paths`, `no_file_changes` |
50
+ | Implementation | `problem_class`, `task_plan_revision`, `completed_work_item_ids`, `changed_paths`, `no_file_changes`, `deviations`, `findings` |
51
+ | Test | `problem_class`, `checks`, `failed_items`, `unverified_items`, `manual_handoff_items`, `findings`, `changed_paths`, `no_file_changes` |
52
+ | Comprehension | `problem_class`, `explained_components`, `unresolved_questions`, `unnecessary_abstractions`, `maintenance_risks`, `user_confirmation`, `findings`, `changed_paths`, `no_file_changes` |
53
+ | Refactor | `problem_class`, `changed_paths`, `no_file_changes`, `simplifications`, `behavior_change_intended`, `findings` |
54
+ | Delivery | `problem_class`, `acceptance`, `automated_evidence_ids`, `manual_evidence_ids`, `test_record_id`, `comprehension_record_id`, `unverified_items`, `risks`, `findings`, `changed_paths`, `no_file_changes` |
55
+
56
+ `changed_paths` and `no_file_changes` remain mutually exclusive. A single-repository Task uses
57
+ repository-relative paths. A multi-repository Task uses
58
+ `<repository-key>::<repository-relative-path>`.
2
59
 
3
- This reference helps the Host Adapter construct the one closed payload branch returned by the
4
- current Core Action. It is not a process definition, transition table, cursor, or authority. The
5
- fresh Action, the live `dev_flow_apply_action` `inputSchema`, and Core validation remain authoritative.
6
-
7
- ## Construction rules
8
-
9
- Before every ordinary apply:
60
+ Completed developer-run verification is a `source="user"` check with `command_count=0` and
61
+ `full_suite=false`. Put only work nobody has run yet in `manual_handoff_items`.
10
62
 
11
- 1. Bind one complete fresh Action and read `action_kind`, `current_node`, `payload_contract`,
12
- `method_steps`, and every `available_transition`.
13
- 2. Select only a transition returned by that Action. Never submit `destination`, `next_node`,
14
- `next_cursor`, resume node, guard result, or caller classification.
15
- 3. The live `dev_flow_apply_action` `inputSchema` is one closed object. `action_kind` is a top-level
16
- `enum` of every action kind and `payload.node_result` declares the union of every node result
17
- member, so the schema does not narrow the payload by `action_kind`. Select the branch from the
18
- fresh Action's `action_kind` and `payload_contract`, send only that branch's `node_result` members,
19
- and use exactly the six common payload members: `transition_id`, `summary`, `reason`, `artifacts`,
20
- `method_evidence`, and `node_result`.
21
- Set `reason=""` whenever the selected transition has `reason_required=false`; provide a nonempty
22
- reason only when the selected transition has `reason_required=true`.
23
- 4. `required_evidence` and `artifacts` are different concepts. `repository_observation` is a Core evidence requirement, not an ArtifactReference role. When no real repository-relative process
24
- artifact exists, submit `"artifacts": []`.
25
- 5. Allowed ArtifactReference roles are only `requirements`, `design`, `task_plan`,
26
- `implementation`, `test`, `comprehension`, `refactor`, `delivery`, and `other_process`.
27
- For every ArtifactReference path, work-item `expected_paths`, and node-result `changed_paths`, use
28
- an ordinary repository-relative path for a single-repository Task
29
- and `<repository-key>::<repository-relative-path>` for a multi-repository Task. The key must
30
- already belong to the immutable Core Scope. Do not add a payload field or a second digest.
31
- 6. Preserve the complete `node_result` branch wrapper. Every standard node result reports exact
32
- `changed_paths` or `no_file_changes`; exactly one of a nonempty path list or
33
- `no_file_changes=true` describes the current effect. Artifact references remain evidence and do
34
- not replace this mutation envelope. Never flatten baseline fields or encode an array as prose.
35
- 7. Submit exactly one MethodEvidence item for every current Action method step, in Action order.
36
- For completed `plain` work use `"status": "plain_fallback"` and `"capability": ""`.
37
- 8. Replace every value beginning `placeholder-` and every exemplar revision/ID with the current
38
- normalized value read from the current Task/Action. Delivery acceptance, record IDs, and exact
39
- evidence sets always come from the latest Task projection and are never guessed.
40
- 9. Do not include repository facts, payload digests, raw command/output/environment data, or
41
- unknown members.
42
- 10. `INVALID_ARGUMENT` and `TRANSITION_NOT_ALLOWED` are completed Core domain rejections, never
43
- transport uncertainty. When the result carries `error.details[]` or `error.guard`,
44
- `recovery.action="correct_current_action"`, and `recovery.retry_safe=true`, submit exactly one
45
- corrected payload for the same Action: change only the members in `recovery.allowed_paths`, derive
46
- each corrected value from the returned closed `rule`, and use a new `request_id`. Stop after a
47
- second failure and report the exact `path` and `rule`; never probe with a third candidate payload.
63
+ ## Requirements example
48
64
 
49
- <!-- node-payload-template:requirements:start -->
50
65
  ```json
51
66
  {
67
+ "host": "codex",
68
+ "task_id": "task-current",
69
+ "action_id": "action-current",
52
70
  "transition_id": "requirements_ready",
53
- "summary": "placeholder-normalized-summary",
71
+ "summary": "Requirements completed.",
54
72
  "reason": "",
55
- "artifacts": [],
56
- "method_evidence": [
57
- {"step_id": "requirements.capture", "status": "plain_fallback", "capability": "", "summary": "placeholder-capture-summary"},
58
- {"step_id": "requirements.clarify", "status": "plain_fallback", "capability": "", "summary": "placeholder-clarify-summary"},
59
- {"step_id": "requirements.validate", "status": "plain_fallback", "capability": "", "summary": "placeholder-validation-summary"}
60
- ],
73
+ "artifacts": {
74
+ "current": [],
75
+ "other_process": []
76
+ },
77
+ "method_results": {
78
+ "requirements.capture": {"capability": "", "summary": "Captured the bounded requirements."},
79
+ "requirements.clarify": {"capability": "", "summary": "Resolved material questions."},
80
+ "requirements.validate": {"capability": "", "summary": "Validated scope and acceptance."}
81
+ },
61
82
  "node_result": {
62
83
  "problem_class": "none",
63
84
  "baseline": {
64
- "goal": "placeholder-goal",
65
- "scope": ["placeholder-scope"],
66
- "out_of_scope": ["placeholder-exclusion"],
67
- "acceptance_criteria": ["placeholder-acceptance-criterion"],
68
- "constraints": ["placeholder-constraint"],
85
+ "goal": "Current goal",
86
+ "scope": [],
87
+ "out_of_scope": [],
88
+ "acceptance_criteria": ["Current criterion"],
89
+ "constraints": [],
69
90
  "assumptions": []
70
91
  },
71
92
  "unresolved_questions": [],
72
- "changed_paths": ["specs/placeholder-feature/spec.md"],
73
- "no_file_changes": false
74
- }
75
- }
76
- ```
77
- <!-- node-payload-template:requirements:end -->
78
-
79
- Never use `repository_observation` as an artifact role, place goal/scope beside `node_result`, or
80
- omit `problem_class`, `baseline`, or `unresolved_questions`.
81
- `unresolved_questions` is a sibling of `baseline` inside `node_result`; it is never a member of the
82
- closed `baseline` object.
83
-
84
- <!-- node-payload-template:design:start -->
85
- ```json
86
- {
87
- "transition_id": "design_ready",
88
- "summary": "placeholder-normalized-summary",
89
- "reason": "",
90
- "artifacts": [],
91
- "method_evidence": [
92
- {"step_id": "design.choose_approach", "status": "plain_fallback", "capability": "", "summary": "placeholder-approach-summary"},
93
- {"step_id": "design.review_complexity", "status": "plain_fallback", "capability": "", "summary": "placeholder-complexity-summary"},
94
- {"step_id": "design.record_decisions", "status": "plain_fallback", "capability": "", "summary": "placeholder-decision-summary"}
95
- ],
96
- "node_result": {
97
- "problem_class": "none",
98
- "baseline": {
99
- "requirements_revision": 1,
100
- "approach": "placeholder-approach",
101
- "components": ["placeholder-component"],
102
- "decisions": ["placeholder-decision"],
103
- "rejected_alternatives": ["placeholder-rejected-alternative"],
104
- "complexity_justification": [],
105
- "risks": []
106
- },
107
- "findings": [],
108
- "changed_paths": ["specs/placeholder-feature/plan.md"],
109
- "no_file_changes": false
110
- }
111
- }
112
- ```
113
- <!-- node-payload-template:design:end -->
114
-
115
- Use the current requirements revision. The field `complexity` is forbidden; the required field is
116
- `complexity_justification`, even when its value is an empty array.
117
-
118
- <!-- node-payload-template:tasks:start -->
119
- ```json
120
- {
121
- "transition_id": "tasks_ready",
122
- "summary": "placeholder-normalized-summary",
123
- "reason": "",
124
- "artifacts": [],
125
- "method_evidence": [
126
- {"step_id": "tasks.decompose", "status": "plain_fallback", "capability": "", "summary": "placeholder-decomposition-summary"},
127
- {"step_id": "tasks.map_acceptance", "status": "plain_fallback", "capability": "", "summary": "placeholder-acceptance-map-summary"},
128
- {"step_id": "tasks.analyze_consistency", "status": "plain_fallback", "capability": "", "summary": "placeholder-consistency-summary"}
129
- ],
130
- "node_result": {
131
- "problem_class": "none",
132
- "baseline": {
133
- "design_revision": 1,
134
- "work_items": [
135
- {
136
- "work_item_id": "placeholder-work-item-id",
137
- "summary": "placeholder-work-item-summary",
138
- "expected_paths": ["src/placeholder.mjs"],
139
- "acceptance_indexes": [0],
140
- "verification_steps": ["placeholder-targeted-verification"],
141
- "dependencies": []
142
- }
143
- ]
144
- },
145
- "findings": [],
146
- "changed_paths": ["specs/placeholder-feature/tasks.md"],
147
- "no_file_changes": false
148
- }
149
- }
150
- ```
151
- <!-- node-payload-template:tasks:end -->
152
-
153
- <!-- node-payload-template:implement:start -->
154
- ```json
155
- {
156
- "transition_id": "implementation_ready_for_test",
157
- "summary": "placeholder-normalized-summary",
158
- "reason": "",
159
- "artifacts": [],
160
- "method_evidence": [
161
- {"step_id": "implementation.execute_plan", "status": "plain_fallback", "capability": "", "summary": "placeholder-execution-summary"},
162
- {"step_id": "implementation.record_surface", "status": "plain_fallback", "capability": "", "summary": "placeholder-surface-summary"},
163
- {"step_id": "implementation.classify_deviations", "status": "plain_fallback", "capability": "", "summary": "placeholder-deviation-summary"}
164
- ],
165
- "node_result": {
166
- "problem_class": "none",
167
- "task_plan_revision": 1,
168
- "completed_work_item_ids": ["placeholder-work-item-id"],
169
- "changed_paths": ["src/placeholder.mjs"],
170
- "no_file_changes": false,
171
- "deviations": [],
172
- "findings": []
173
- }
174
- }
175
- ```
176
- <!-- node-payload-template:implement:end -->
177
-
178
- Exactly one of a nonempty `changed_paths` list or `no_file_changes=true` describes the current
179
- implementation result.
180
-
181
- <!-- node-payload-template:test:start -->
182
- ```json
183
- {
184
- "transition_id": "tests_passed",
185
- "summary": "placeholder-normalized-summary",
186
- "reason": "",
187
- "artifacts": [],
188
- "method_evidence": [
189
- {"step_id": "test.run_budgeted_checks", "status": "plain_fallback", "capability": "", "summary": "placeholder-check-summary"},
190
- {"step_id": "test.record_evidence", "status": "plain_fallback", "capability": "", "summary": "placeholder-evidence-summary"},
191
- {"step_id": "test.classify_failure", "status": "plain_fallback", "capability": "", "summary": "placeholder-classification-summary"}
192
- ],
193
- "node_result": {
194
- "problem_class": "none",
195
- "checks": [
196
- {"source": "automated", "name": "placeholder-check-name", "status": "passed", "summary": "placeholder-check-result", "command_count": 1, "full_suite": false},
197
- {"source": "user", "name": "placeholder-developer-check", "status": "passed", "summary": "placeholder-developer-result", "command_count": 0, "full_suite": false}
198
- ],
199
- "failed_items": [],
200
- "unverified_items": [],
201
- "manual_handoff_items": [],
202
- "findings": [],
203
- "changed_paths": [],
204
- "no_file_changes": true
205
- }
206
- }
207
- ```
208
- <!-- node-payload-template:test:end -->
209
-
210
- Completed developer-run verification is a `source="user"` check with `command_count=0` and
211
- `full_suite=false`; the human command is described in `summary` and never charged to the automatic budget.
212
- `manual_handoff_items` contains only bounded checks still awaiting user execution. Once the developer reports a
213
- completed result, record the user check and remove that item from `manual_handoff_items`.
214
-
215
- <!-- node-payload-template:comprehension-complexity:start -->
216
- ```json
217
- {
218
- "transition_id": "code_too_complex",
219
- "summary": "placeholder-normalized-summary",
220
- "reason": "placeholder-required-complexity-reason",
221
- "artifacts": [],
222
- "method_evidence": [
223
- {"step_id": "comprehension.explain", "status": "plain_fallback", "capability": "", "summary": "placeholder-explanation-summary"},
224
- {"step_id": "comprehension.identify_complexity", "status": "plain_fallback", "capability": "", "summary": "placeholder-complexity-summary"},
225
- {"step_id": "comprehension.obtain_user_verdict", "status": "plain_fallback", "capability": "", "summary": "placeholder-user-verdict-summary"}
226
- ],
227
- "node_result": {
228
- "problem_class": "code_complexity",
229
- "explained_components": ["placeholder-component"],
230
- "unresolved_questions": [],
231
- "unnecessary_abstractions": ["placeholder-unnecessary-abstraction"],
232
- "maintenance_risks": [],
233
- "user_confirmation": null,
234
- "findings": ["placeholder-matching-complexity-fact"],
235
- "changed_paths": [],
236
- "no_file_changes": true
237
- }
238
- }
239
- ```
240
- <!-- node-payload-template:comprehension-complexity:end -->
241
-
242
- <!-- node-payload-template:comprehension-passed:start -->
243
- ```json
244
- {
245
- "transition_id": "comprehension_passed",
246
- "summary": "placeholder-normalized-summary",
247
- "reason": "",
248
- "artifacts": [],
249
- "method_evidence": [
250
- {"step_id": "comprehension.explain", "status": "plain_fallback", "capability": "", "summary": "placeholder-explanation-summary"},
251
- {"step_id": "comprehension.identify_complexity", "status": "plain_fallback", "capability": "", "summary": "placeholder-complexity-summary"},
252
- {"step_id": "comprehension.obtain_user_verdict", "status": "plain_fallback", "capability": "", "summary": "placeholder-user-verdict-summary"}
253
- ],
254
- "node_result": {
255
- "problem_class": "none",
256
- "explained_components": ["placeholder-component"],
257
- "unresolved_questions": [],
258
- "unnecessary_abstractions": [],
259
- "maintenance_risks": [],
260
- "user_confirmation": {"source": "user", "status": "passed", "summary": "placeholder-explicit-user-verdict-summary"},
261
- "findings": [],
262
- "changed_paths": [],
263
- "no_file_changes": true
264
- }
265
- }
266
- ```
267
- <!-- node-payload-template:comprehension-passed:end -->
268
-
269
- No AI or method capability may create the passing user confirmation.
270
-
271
- <!-- node-payload-template:refactor:start -->
272
- ```json
273
- {
274
- "transition_id": "refactor_ready_for_test",
275
- "summary": "placeholder-normalized-summary",
276
- "reason": "",
277
- "artifacts": [],
278
- "method_evidence": [
279
- {"step_id": "refactor.simplify", "status": "plain_fallback", "capability": "", "summary": "placeholder-simplification-summary"},
280
- {"step_id": "refactor.reconcile_artifacts", "status": "plain_fallback", "capability": "", "summary": "placeholder-reconciliation-summary"},
281
- {"step_id": "refactor.record_surface", "status": "plain_fallback", "capability": "", "summary": "placeholder-surface-summary"}
282
- ],
283
- "node_result": {
284
- "problem_class": "none",
285
- "changed_paths": ["src/placeholder.mjs"],
286
- "no_file_changes": false,
287
- "simplifications": ["placeholder-simplification"],
288
- "behavior_change_intended": false,
289
- "findings": []
290
- }
291
- }
292
- ```
293
- <!-- node-payload-template:refactor:end -->
294
-
295
- <!-- node-payload-template:delivery:start -->
296
- ```json
297
- {
298
- "transition_id": "delivery_complete",
299
- "summary": "placeholder-normalized-summary",
300
- "reason": "",
301
- "artifacts": [],
302
- "method_evidence": [
303
- {"step_id": "delivery.reconcile_acceptance", "status": "plain_fallback", "capability": "", "summary": "placeholder-acceptance-summary"},
304
- {"step_id": "delivery.reconcile_method_artifacts", "status": "plain_fallback", "capability": "", "summary": "placeholder-artifact-summary"},
305
- {"step_id": "delivery.prepare_summary", "status": "plain_fallback", "capability": "", "summary": "placeholder-delivery-summary"}
306
- ],
307
- "node_result": {
308
- "problem_class": "none",
309
- "acceptance": [{"criterion": "placeholder-current-criterion", "status": "satisfied"}],
310
- "automated_evidence_ids": ["placeholder-current-automated-evidence-id"],
311
- "manual_evidence_ids": ["placeholder-current-comprehension-evidence-id"],
312
- "test_record_id": "placeholder-current-test-record-id",
313
- "comprehension_record_id": "placeholder-current-comprehension-record-id",
314
- "unverified_items": [],
315
- "risks": [],
316
- "findings": [],
317
93
  "changed_paths": [],
318
94
  "no_file_changes": true
319
95
  }
320
96
  }
321
97
  ```
322
- <!-- node-payload-template:delivery:end -->
323
-
324
- Acceptance order/text and the automated/manual evidence lists must exactly equal the latest Core
325
- projection. Use only current TestRecord and ComprehensionAssessment IDs; stale or guessed IDs are
326
- forbidden.
327
-
328
- <!-- node-payload-template:blocked:start -->
329
- ```json
330
- {
331
- "blocker_id": "placeholder-current-blocker-id",
332
- "condition": {
333
- "kind": "restore_issuance_binding",
334
- "expected_binding_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
335
- },
336
- "observed_binding_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
337
- }
338
- ```
339
- <!-- node-payload-template:blocked:end -->
340
98
 
341
- For `RESOLVE_BLOCKER`, use the exact current blocker ID, stored condition, and freshly observed
342
- binding digest required by Core. Never submit a resume node or destination.
99
+ For DeepSeek, use `host="deepseek"` and the qualified tool name
100
+ `mcp__dev_flow__<submission_tool>`. All other fields remain the same.