dev-flow-deepseek 0.7.2 → 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 +27 -15
- package/lib/tool-names.mjs +10 -1
- package/package.json +2 -1
- package/runtime/darwin-arm64/dev-flow +0 -0
- package/skills/dev-flow/SKILL.md +75 -142
- package/skills/dev-flow/references/node-payloads.md +81 -323
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.
|
|
15
|
-
| Bundled Core | `0.6.
|
|
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.
|
|
19
|
+
| Release | [deepseek-v0.7.3](https://github.com/Innocent-children/dev-flow/releases/tag/deepseek-v0.7.3) |
|
|
20
20
|
|
|
21
|
-
`0.7.
|
|
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
|
|
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
138
|
-
| `dev_flow_get_next_action` |
|
|
139
|
-
| `
|
|
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
|
|
148
|
-
|
|
156
|
+
mutation 响应不确定时,Adapter 只保留 Task ID 与 Action ID,先读取 Core 保存的规范化提交,再调用
|
|
157
|
+
`dev_flow_recover_action` 或按 advice 停止。它不重建原始 payload,也不自行选择 destination。
|
|
149
158
|
|
|
150
|
-
当前 Core 只接受当前 SQLite Schema。不兼容或 pre-graph data
|
|
151
|
-
`
|
|
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
|
|
192
|
+
license 和一个内嵌 WebUI 资产的 darwin-arm64 Core。它不包含 source tree、tests、fixtures、用户数据或构建日志,
|
|
181
193
|
也不提供独立 `bin` executable。
|
|
182
194
|
|
|
183
195
|
## 维护者入口
|
package/lib/tool-names.mjs
CHANGED
|
@@ -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
|
-
"
|
|
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.
|
|
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
|
package/skills/dev-flow/SKILL.md
CHANGED
|
@@ -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
|
|
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. `
|
|
59
|
-
6. `
|
|
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.
|
|
173
|
-
|
|
174
|
-
8.
|
|
175
|
-
|
|
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
|
|
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
|
-
-
|
|
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.
|
|
206
|
-
|
|
207
|
-
uses
|
|
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,84 +238,45 @@ 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
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
Before
|
|
236
|
-
|
|
237
|
-
`fresh_action
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
`
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
`
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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.
|
|
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.
|
|
264
262
|
|
|
265
263
|
If the live schema and packaged reference disagree, stop before mutation and report the packaging
|
|
266
264
|
contract defect. Do not choose whichever shape appears more convenient.
|
|
267
265
|
|
|
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
266
|
```text
|
|
291
|
-
|
|
292
|
-
"request_id": caller_request_id,
|
|
267
|
+
submission_arguments = {
|
|
293
268
|
"host": "deepseek",
|
|
294
269
|
"task_id": fresh_action.task_id,
|
|
295
|
-
"revision": fresh_action.revision,
|
|
296
270
|
"action_id": fresh_action.action_id,
|
|
297
|
-
"
|
|
298
|
-
"
|
|
299
|
-
"
|
|
300
|
-
"
|
|
301
|
-
"
|
|
302
|
-
"
|
|
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
|
|
303
277
|
}
|
|
304
278
|
```
|
|
305
279
|
|
|
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
280
|
If Core returns `INVALID_ARGUMENT`, treat it as a complete payload-contract rejection, not transport
|
|
311
281
|
uncertainty. Use the bounded-correction section only when the complete result explicitly authorizes
|
|
312
282
|
`correct_current_action`; otherwise stop and report the failing contract without private data. Never
|
|
@@ -351,46 +321,17 @@ selector again; no background handling is promised.
|
|
|
351
321
|
|
|
352
322
|
A mutation result is uncertain when it is missing, cancelled, malformed, truncated, or
|
|
353
323
|
transport-failed instead of returning one complete structured result. Do not immediately repeat
|
|
354
|
-
|
|
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.
|
|
324
|
+
the submission tool and do not infer the result from repository state or worktree contents.
|
|
384
325
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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.
|
|
390
331
|
|
|
391
332
|
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
|
|
393
|
-
|
|
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
|
|
394
335
|
terminal next-action result is a safe-stop, not permission to replay.
|
|
395
336
|
|
|
396
337
|
DSH reconnect restores transport and tool registrations only. It never replays, retries, resumes, or
|
|
@@ -400,24 +341,17 @@ still applies, and any later user turn that dispatches those reads must contain
|
|
|
400
341
|
Do not implement or branch on the five-class decision table. Obey only Core's complete
|
|
401
342
|
`next_advice`:
|
|
402
343
|
|
|
403
|
-
- `retry_current_action`:
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
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;
|
|
408
348
|
- `read_next_action`: read the authoritative next action and continue only from that result;
|
|
409
|
-
- `resolve_blocker`:
|
|
410
|
-
`
|
|
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;
|
|
411
351
|
- `stop_for_repository_drift`: report the bounded drift condition and stop.
|
|
412
352
|
|
|
413
353
|
Never infer that an unlisted action is safe. A recovery read itself cannot create a blocker or adopt
|
|
414
|
-
work.
|
|
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.
|
|
354
|
+
work. If the original `task_id` or `action_id` is missing, stop; do not rebuild it from partial output.
|
|
421
355
|
|
|
422
356
|
Do not branch, decide, or interpret any recovery classification and do not guess from repository
|
|
423
357
|
state. Core owns classification, effect proof, blocker eligibility, and mutation directives.
|
|
@@ -425,8 +359,7 @@ state. Core owns classification, effect proof, blocker eligibility, and mutation
|
|
|
425
359
|
A complete structured `ok=false` result is an authoritative domain error, not transport
|
|
426
360
|
uncertainty. Never convert or treat that domain error as missing or transport failure. Obey Core's
|
|
427
361
|
`code`, `message`, `recovery.retry_safe`, `recovery.action`, and `recovery.message`. When it reports
|
|
428
|
-
`retry_safe=false` and `action=none`, stop; do not
|
|
429
|
-
`mcp__dev_flow__dev_flow_apply_action`.
|
|
362
|
+
`retry_safe=false` and `action=none`, stop; do not submit or recover the Action.
|
|
430
363
|
|
|
431
364
|
## Bounded correction of the current action
|
|
432
365
|
|
|
@@ -434,16 +367,16 @@ A complete structured domain error may carry field-level detail. `error.details[
|
|
|
434
367
|
failing member as `path`, a closed `rule`, and a fixed non-sensitive `message`. A refused transition
|
|
435
368
|
may instead carry `error.guard` with the Core `guard_id` and the same failure shape.
|
|
436
369
|
|
|
437
|
-
Submit exactly one corrected
|
|
370
|
+
Submit exactly one corrected input through the same `fresh_action.submission_tool` only when every
|
|
371
|
+
condition holds:
|
|
438
372
|
|
|
439
373
|
1. the original result is a complete structured Core domain error;
|
|
440
374
|
2. `recovery.action` is `correct_current_action`;
|
|
441
375
|
3. `recovery.retry_safe` is `true`;
|
|
442
|
-
4. Task
|
|
443
|
-
5.
|
|
444
|
-
6.
|
|
445
|
-
7.
|
|
446
|
-
8. every other payload byte keeps the same meaning.
|
|
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.
|
|
447
380
|
|
|
448
381
|
Stop immediately when the second submission also fails. Do not submit a third candidate payload;
|
|
449
382
|
report only the exact `path`, `rule`, and that the bounded correction still failed. Never report
|
|
@@ -1,342 +1,100 @@
|
|
|
1
|
-
#
|
|
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
|
-
|
|
4
|
-
|
|
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
|
-
|
|
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": "
|
|
71
|
+
"summary": "Requirements completed.",
|
|
54
72
|
"reason": "",
|
|
55
|
-
"artifacts":
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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": "
|
|
65
|
-
"scope": [
|
|
66
|
-
"out_of_scope": [
|
|
67
|
-
"acceptance_criteria": ["
|
|
68
|
-
"constraints": [
|
|
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
|
|
342
|
-
|
|
99
|
+
For DeepSeek, use `host="deepseek"` and the qualified tool name
|
|
100
|
+
`mcp__dev_flow__<submission_tool>`. All other fields remain the same.
|