dev-flow-deepseek 0.7.1 → 0.7.3

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