dev-flow-deepseek 0.7.2 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -11,27 +11,28 @@ macOS arm64 Core executable。
|
|
|
11
11
|
|
|
12
12
|
| 项目 | 当前支持 |
|
|
13
13
|
| --- | --- |
|
|
14
|
-
| Package | `dev-flow-deepseek@0.7.
|
|
15
|
-
| Bundled Core | `0.6.
|
|
14
|
+
| Package | `dev-flow-deepseek@0.7.4` |
|
|
15
|
+
| Bundled Core | `0.6.3` |
|
|
16
16
|
| Platform | macOS arm64 |
|
|
17
17
|
| Node.js | `>=24` |
|
|
18
18
|
| DSH | `>=0.1.0-rc.6` |
|
|
19
|
-
| Release | [deepseek-v0.7.
|
|
19
|
+
| Release | [deepseek-v0.7.4](https://github.com/Innocent-children/dev-flow/releases/tag/deepseek-v0.7.4) |
|
|
20
20
|
|
|
21
|
-
`0.7.
|
|
21
|
+
`0.7.4` 的 normal release 已通过 registry package 安装、显式触发、Core handshake、
|
|
22
22
|
restart/resume、`DONE`、remove、uninstall、retained reopen 和 repository-unchanged 门禁。上表
|
|
23
23
|
记录已验证的精确公开版本;下面的安装命令使用 npm `latest` dist-tag 获取当前最新稳定 package。
|
|
24
24
|
|
|
25
25
|
## 安装与验证
|
|
26
26
|
|
|
27
|
-
DSH 是前置 Host
|
|
27
|
+
DSH 是前置 Host。使用 `dev-flow` 时只需指定真实 Profile,默认使用 `web`:
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
|
|
30
|
+
npm install -g @imotong/dev-flow@latest
|
|
31
|
+
dev-flow
|
|
31
32
|
```
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
诊断恢复时仍可使用以下 Host 原生命令;需要其他 Profile 时修改 `PROFILE` 的值,不要把
|
|
35
|
+
`<profile>` 原样输入 shell:
|
|
35
36
|
|
|
36
37
|
```bash
|
|
37
38
|
npm install -g @deepseek-ai/dsh@latest
|
|
@@ -89,11 +90,11 @@ dsh --profile "$PROFILE" --dump-config
|
|
|
89
90
|
模型文本、Skill 注入或仓库内容不能替代 selector;空调用或普通讨论不会创建 Task。
|
|
90
91
|
|
|
91
92
|
通过 admission 后,Adapter 首先读取 server info,验证 `standard-development`、definition
|
|
92
|
-
digest、method profiles、live schemas
|
|
93
|
+
digest、method profiles、live schemas 和恰好十五个工具,再创建或恢复当前仓库的 Task。
|
|
93
94
|
|
|
94
95
|
Task 可选择 `plain`、`spec-kit` 或 `openspec` profile。Core 管理 current node、legal transitions、
|
|
95
96
|
destination、Recovery、blocker 和 terminal outcome;Adapter 负责执行当前节点工作、呈现完整 Action
|
|
96
|
-
|
|
97
|
+
并通过当前 Action 指定的提交工具转发节点结果。
|
|
97
98
|
|
|
98
99
|
## 两仓声明、Workspace Root 与可选索引
|
|
99
100
|
|
|
@@ -127,16 +128,25 @@ DeepSeek 与 Codex 共用同一 Repository Scope、scoped path、Action 和唯
|
|
|
127
128
|
|
|
128
129
|
## MCP 工具
|
|
129
130
|
|
|
130
|
-
DeepSeek Adapter 暴露与 Codex
|
|
131
|
+
DeepSeek Adapter 暴露与 Codex 相同的十五工具 Core catalog;在 DSH 中会使用限定后的 tool name,
|
|
131
132
|
但 Core tool identity 保持不变。
|
|
132
133
|
|
|
133
134
|
| MCP 工具 | 作用 |
|
|
134
135
|
| --- | --- |
|
|
135
136
|
| `dev_flow_server_info` | 读取 Core identity、能力、process、method profile、工具目录和 DeepSeek 有效索引偏好;有效 admission 后必须首先调用。 |
|
|
136
137
|
| `dev_flow_open_task` | 为 Workspace Root 内显式声明的主/附加仓库创建一个 Task,或从任一参与仓库恢复同一 Task。 |
|
|
137
|
-
| `dev_flow_get_task` | 读取持久化 Task
|
|
138
|
-
| `dev_flow_get_next_action` |
|
|
139
|
-
| `
|
|
138
|
+
| `dev_flow_get_task` | 读取持久化 Task;存在 Core 保存的提交时自动返回 Recovery assessment。 |
|
|
139
|
+
| `dev_flow_get_next_action` | 读取当前 Action、`submission_tool`、验证预算、method steps 和全部合法 transition。 |
|
|
140
|
+
| `dev_flow_submit_requirements` | 提交 REQUIREMENTS 节点结果;Core 补齐完整 Action identity 和内部 payload。 |
|
|
141
|
+
| `dev_flow_submit_design` | 提交 DESIGN 节点结果。 |
|
|
142
|
+
| `dev_flow_submit_tasks` | 提交 TASKS 节点结果。 |
|
|
143
|
+
| `dev_flow_submit_implementation` | 提交 IMPLEMENT 节点结果。 |
|
|
144
|
+
| `dev_flow_submit_test` | 提交 TEST 节点结果。 |
|
|
145
|
+
| `dev_flow_submit_comprehension` | 提交 COMPREHENSION_REVIEW 节点结果。 |
|
|
146
|
+
| `dev_flow_submit_refactor` | 提交 REFACTOR 节点结果。 |
|
|
147
|
+
| `dev_flow_submit_delivery` | 提交 DELIVERY 节点结果。 |
|
|
148
|
+
| `dev_flow_resolve_blocker` | 使用 Task ID 与 Action ID 解除已满足条件的 blocker。 |
|
|
149
|
+
| `dev_flow_recover_action` | 使用 Core 保存的规范化提交恢复不确定 Action,不重新发送 payload。 |
|
|
140
150
|
| `dev_flow_cancel_task` | 使用当前 revision 和明确 reason 取消一个非终态 Task。 |
|
|
141
151
|
|
|
142
152
|
## 数据与恢复
|
|
@@ -144,11 +154,14 @@ DeepSeek Adapter 暴露与 Codex 相同的六工具 Core catalog;在 DSH 中
|
|
|
144
154
|
Task data 位于 Dev Flow 的本地数据目录,不属于 DSH plugin 配置。移除、卸载或重新安装 package
|
|
145
155
|
不会删除 Task data,也不会修改目标 Git 仓库或 Codex-owned state。
|
|
146
156
|
|
|
147
|
-
mutation 响应不确定时,Adapter
|
|
148
|
-
|
|
157
|
+
mutation 响应不确定时,Adapter 只保留 Task ID 与 Action ID,先读取 Core 保存的规范化提交,再调用
|
|
158
|
+
`dev_flow_recover_action` 或按 advice 停止。它不重建原始 payload,也不自行选择 destination。
|
|
149
159
|
|
|
150
|
-
当前 Core 只接受当前 SQLite Schema。不兼容或 pre-graph data
|
|
151
|
-
`
|
|
160
|
+
当前 Core 只接受当前 SQLite Schema。不兼容或 pre-graph data 在普通启动时保持零写入并返回
|
|
161
|
+
`reset_required`。package 携带的同一 Core 支持 `dev-flow webui start|open|status|stop|reset`;WebUI 只监听
|
|
162
|
+
loopback,DeepSeek 与 Codex 复用同一进程和数据。reset 先展示精确 database/sidecar 目标,再要求当前
|
|
163
|
+
target-bound token 和数据库独占访问;浏览器没有 reset mutation。界面支持简体中文/英文,首次跟随系统
|
|
164
|
+
语言,手工选择只保存在浏览器。完整说明见 [WebUI](../../docs/WEBUI.md)。
|
|
152
165
|
|
|
153
166
|
## 卸载与彻底清理
|
|
154
167
|
|
|
@@ -177,7 +190,7 @@ rm -rf "$HOME/Library/Application Support/dev-flow"
|
|
|
177
190
|
## Package 内容
|
|
178
191
|
|
|
179
192
|
Package 只包含一个 `cordis.patch.yml` layer、Adapter libraries、`dev-flow` Skill、references、
|
|
180
|
-
license
|
|
193
|
+
license 和一个内嵌 WebUI 资产的 darwin-arm64 Core。它不包含 source tree、tests、fixtures、用户数据或构建日志,
|
|
181
194
|
也不提供独立 `bin` executable。
|
|
182
195
|
|
|
183
196
|
## 维护者入口
|
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.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Explicit DeepSeek Harness adapter for the Dev Flow process graph.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"test": "node --test tests/*.test.mjs",
|
|
25
25
|
"test:package": "node --test tests/package-contract.test.mjs",
|
|
26
26
|
"test:bundle": "node --test tests/bundle-contract.test.mjs",
|
|
27
|
+
"build:webui": "../../scripts/build-webui.sh",
|
|
27
28
|
"pack:dry": "pnpm pack --dry-run --json"
|
|
28
29
|
},
|
|
29
30
|
"engines": {
|
|
Binary file
|
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,15 @@ For an active task, perform each iteration in this order:
|
|
|
169
178
|
Task and is reported with the declared repository key; do not shrink the Core Scope and continue.
|
|
170
179
|
6. Render and perform each current method operation under the allowed effects, repository
|
|
171
180
|
instructions, verification budget, and current user authority.
|
|
172
|
-
7.
|
|
173
|
-
|
|
174
|
-
|
|
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
|
+
`changed_paths` contains only repository paths newly changed while performing this current Action,
|
|
184
|
+
relative to its issuance binding. Do not repeat paths changed by an earlier node. When the current
|
|
185
|
+
Action only reads files or runs verification commands, submit `changed_paths=[]` and
|
|
186
|
+
`no_file_changes=true`, even when the Task's implementation already has uncommitted paths.
|
|
187
|
+
8. Submit exactly one call to that qualified tool with `host`, `task_id`, `action_id`, the selected
|
|
188
|
+
transition, result text, artifact slots, method results and the exact node result. Core fills and
|
|
189
|
+
retains the complete Action identity and payload envelope.
|
|
176
190
|
9. After a complete committed result, continue only from its authoritative next Action/outcome or a
|
|
177
191
|
fresh ordinary Core read.
|
|
178
192
|
|
|
@@ -194,17 +208,16 @@ immutable profile:
|
|
|
194
208
|
- A tool invocation is not semantic completion. Record evidence only after the work and expected
|
|
195
209
|
result actually complete.
|
|
196
210
|
|
|
197
|
-
Build
|
|
211
|
+
Build one `method_results` member for every current Action step, keyed by its exact `step_id`.
|
|
212
|
+
Provide only `capability` and `summary`: use the actual capability ID after capability completion,
|
|
213
|
+
or an empty capability after completed ordinary work. Core adds the step identity, order and status.
|
|
198
214
|
|
|
199
|
-
-
|
|
200
|
-
- completed ordinary work uses `status=plain_fallback` and an empty capability;
|
|
201
|
-
- incomplete work uses `status=unavailable` or `status=not_run` honestly.
|
|
202
|
-
|
|
203
|
-
An unavailable or not-run required step is unsatisfied, so do not call `mcp__dev_flow__dev_flow_apply_action`.
|
|
215
|
+
An unavailable or not-run required step is unsatisfied, so do not call the submission tool.
|
|
204
216
|
Capability output cannot substitute for the typed `node_result`, node obligations, evidence, or
|
|
205
|
-
user decision.
|
|
206
|
-
|
|
207
|
-
uses
|
|
217
|
+
user decision. Put artifacts produced for the current node in `artifacts.current` when that member
|
|
218
|
+
exists, and related method artifacts in `artifacts.other_process`. Core assigns the artifact role.
|
|
219
|
+
A single-repository Task uses an ordinary repository-relative path. A multi-repository Task uses
|
|
220
|
+
`<repository-key>::<repository-relative-path>`.
|
|
208
221
|
|
|
209
222
|
Existing authorized spec, plan, or tasks artifacts should be reviewed, revised, or amended as
|
|
210
223
|
needed, not regenerated or rerun mechanically because a semantic step appears. Resolve the active
|
|
@@ -229,84 +242,45 @@ Use the same `fresh_action` already bound from `result.task.current_action` or `
|
|
|
229
242
|
not construct another Action view.
|
|
230
243
|
|
|
231
244
|
Read [the node payload construction reference](references/node-payloads.md) from the packaged path
|
|
232
|
-
`references/node-payloads.md` before every ordinary
|
|
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.
|
|
245
|
+
`references/node-payloads.md` before every ordinary submission. The reference explains the exact
|
|
246
|
+
`node_result` fields; the live schema named by `fresh_action.submission_tool` and Core remain current.
|
|
247
|
+
|
|
248
|
+
Before submitting, perform this order:
|
|
249
|
+
|
|
250
|
+
1. Rebind `fresh_action` and read `submission_tool`, `action_id`, `method_steps`, and all
|
|
251
|
+
`available_transitions`.
|
|
252
|
+
2. Read the live schema of that exact qualified submission tool. Do not choose another submit tool.
|
|
253
|
+
3. Open the matching node-result template and fill only current facts. Use current baseline
|
|
254
|
+
revisions, work-item IDs, record IDs, acceptance and evidence sets.
|
|
255
|
+
4. Set `host="deepseek"`, copy only `task_id` and `action_id`, and select one returned
|
|
256
|
+
`transition_id`.
|
|
257
|
+
5. Provide `summary`, the transition's required or empty `reason`, and the exact `node_result`.
|
|
258
|
+
6. Put current-node artifacts in `artifacts.current` only when the live schema exposes it. Put
|
|
259
|
+
related method artifacts in `artifacts.other_process`. Each entry contains only `path`, `digest`
|
|
260
|
+
and `summary`; Core assigns the role.
|
|
261
|
+
7. Build `method_results` as a closed object keyed by every returned method `step_id`. Each member
|
|
262
|
+
contains only `capability` and `summary`; Core assigns step identity, order and status.
|
|
263
|
+
8. Confirm `request_id`, revision, action kind, process identity, source cursor, repository binding,
|
|
264
|
+
payload envelope, destination and recovery fields are absent.
|
|
265
|
+
9. Call `fresh_action.submission_tool` once.
|
|
264
266
|
|
|
265
267
|
If the live schema and packaged reference disagree, stop before mutation and report the packaging
|
|
266
268
|
contract defect. Do not choose whichever shape appears more convenient.
|
|
267
269
|
|
|
268
|
-
Do not derive payload keys from `required_evidence`. Do not search the repository or installed
|
|
269
|
-
package, inspect a binary or log, or start another MCP server to recover a schema. The selected
|
|
270
|
-
payload contains exactly `transition_id`, `summary`, `reason`, `artifacts`, `method_evidence`, and
|
|
271
|
-
`node_result`; put `problem_class` exactly where that node branch's actual schema requires it. Keep
|
|
272
|
-
arrays as arrays and the payload as an object. Do not add unknown fields, caller classification,
|
|
273
|
-
caller digest, authoritative repository facts, command/output/configuration data, `destination`,
|
|
274
|
-
`next_node`, or `next_cursor`, and do not wrap the whole request in an outer `payload`.
|
|
275
|
-
|
|
276
|
-
Map every mutation top-level field from the same fresh Action:
|
|
277
|
-
|
|
278
|
-
- caller-generated opaque identity -> top-level `request_id`;
|
|
279
|
-
- exact value `deepseek` -> top-level `host`;
|
|
280
|
-
- `fresh_action.task_id` -> top-level `task_id`;
|
|
281
|
-
- `fresh_action.revision` -> top-level `revision`;
|
|
282
|
-
- `fresh_action.action_id` -> top-level `action_id`;
|
|
283
|
-
- `fresh_action.action_kind` -> top-level `action_kind`;
|
|
284
|
-
- `fresh_action.process_id` -> top-level `process_id`;
|
|
285
|
-
- `fresh_action.process_definition_digest` -> top-level `process_definition_digest`;
|
|
286
|
-
- `fresh_action.current_node` -> top-level `source_cursor`;
|
|
287
|
-
- `fresh_action.repository_binding_digest` -> top-level `repository_binding_digest`;
|
|
288
|
-
- the selected closed payload -> top-level `payload`.
|
|
289
|
-
|
|
290
270
|
```text
|
|
291
|
-
|
|
292
|
-
"request_id": caller_request_id,
|
|
271
|
+
submission_arguments = {
|
|
293
272
|
"host": "deepseek",
|
|
294
273
|
"task_id": fresh_action.task_id,
|
|
295
|
-
"revision": fresh_action.revision,
|
|
296
274
|
"action_id": fresh_action.action_id,
|
|
297
|
-
"
|
|
298
|
-
"
|
|
299
|
-
"
|
|
300
|
-
"
|
|
301
|
-
"
|
|
302
|
-
"
|
|
275
|
+
"transition_id": selected_transition_id,
|
|
276
|
+
"summary": normalized_summary,
|
|
277
|
+
"reason": required_or_empty_reason,
|
|
278
|
+
"artifacts": artifact_slots,
|
|
279
|
+
"method_results": method_results_by_step_id,
|
|
280
|
+
"node_result": exact_current_node_result
|
|
303
281
|
}
|
|
304
282
|
```
|
|
305
283
|
|
|
306
|
-
`revision` remains an integer, not a string. `payload` remains an object, not a string. Do not wrap
|
|
307
|
-
that request inside an outer `payload` object. For an ordinary mutation, omit `recovery_apply` or
|
|
308
|
-
send `recovery_apply=null`.
|
|
309
|
-
|
|
310
284
|
If Core returns `INVALID_ARGUMENT`, treat it as a complete payload-contract rejection, not transport
|
|
311
285
|
uncertainty. Use the bounded-correction section only when the complete result explicitly authorizes
|
|
312
286
|
`correct_current_action`; otherwise stop and report the failing contract without private data. Never
|
|
@@ -351,46 +325,17 @@ selector again; no background handling is promised.
|
|
|
351
325
|
|
|
352
326
|
A mutation result is uncertain when it is missing, cancelled, malformed, truncated, or
|
|
353
327
|
transport-failed instead of returning one complete structured result. Do not immediately repeat
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
Before calling `mcp__dev_flow__dev_flow_apply_action`, retain the original `request_id`, `task_id`, `process_id`,
|
|
357
|
-
`process_definition_digest`, `source_cursor`, `revision`, `action_id`,
|
|
358
|
-
`action_kind`, `repository_binding_digest`, and exact closed `payload` from the same fresh action and
|
|
359
|
-
the same apply dispatch. Never derive or reconstruct them from an incomplete response or partial
|
|
360
|
-
output.
|
|
361
|
-
|
|
362
|
-
When all required original identity values are retained, construct exactly this closed
|
|
363
|
-
`operation_probe`:
|
|
364
|
-
|
|
365
|
-
```json
|
|
366
|
-
{
|
|
367
|
-
"operation_id": "<original apply request_id>",
|
|
368
|
-
"process_id": "standard-development",
|
|
369
|
-
"process_definition_digest": "<original process definition digest>",
|
|
370
|
-
"source_cursor": "<original source cursor>",
|
|
371
|
-
"expected_revision": 3,
|
|
372
|
-
"action_id": "<original action id>",
|
|
373
|
-
"action_kind": "<original action kind>",
|
|
374
|
-
"repository_binding_digest": "<original issuance binding digest>",
|
|
375
|
-
"payload": {}
|
|
376
|
-
}
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
`operation_id` is the original apply `request_id`, never a read request ID.
|
|
380
|
-
`expected_revision` is the original action `revision`. `repository_binding_digest` is the original
|
|
381
|
-
issuance binding. `payload` is the exact original closed payload; when it was not completely
|
|
382
|
-
retained, send JSON `null`. Never reconstruct it from partial output, repository text, or model
|
|
383
|
-
memory.
|
|
328
|
+
the submission tool and do not infer the result from repository state or worktree contents.
|
|
384
329
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
330
|
+
Retain only the `task_id` and `action_id` used for the call. Core retains the complete normalized
|
|
331
|
+
Action identity and payload before the Task transition. Call `mcp__dev_flow__dev_flow_get_task` with
|
|
332
|
+
ordinary `host` and `task_id`; do not construct `operation_probe` and do not reconstruct any payload.
|
|
333
|
+
Require one complete `recovery_assessment`. Stop if it is absent, truncated, malformed, or refers to
|
|
334
|
+
another Action.
|
|
390
335
|
|
|
391
336
|
Then call `mcp__dev_flow__dev_flow_get_next_action` for the same task before considering any mutation.
|
|
392
|
-
Compare the fresh Task and next Action's
|
|
393
|
-
|
|
337
|
+
Compare the fresh Task and next Action's action identity, current node, last operation, and recovery
|
|
338
|
+
advice with the retained Action ID. A missing, malformed, truncated, blocker, or
|
|
394
339
|
terminal next-action result is a safe-stop, not permission to replay.
|
|
395
340
|
|
|
396
341
|
DSH reconnect restores transport and tool registrations only. It never replays, retries, resumes, or
|
|
@@ -400,24 +345,17 @@ still applies, and any later user turn that dispatches those reads must contain
|
|
|
400
345
|
Do not implement or branch on the five-class decision table. Obey only Core's complete
|
|
401
346
|
`next_advice`:
|
|
402
347
|
|
|
403
|
-
- `retry_current_action`:
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
source_cursor>}`; do not add a new recovery operation ID, destination, or classification;
|
|
348
|
+
- `retry_current_action`: re-perform the current Action's allowed repository work from the fresh Task
|
|
349
|
+
and Action, then call `mcp__dev_flow__dev_flow_recover_action` with exactly `host`, the retained
|
|
350
|
+
`task_id`, and the retained `action_id`; Core reuses the saved result, so do not rebuild it;
|
|
351
|
+
- `submit_recovery_apply`: call that recovery tool with those same three fields immediately;
|
|
408
352
|
- `read_next_action`: read the authoritative next action and continue only from that result;
|
|
409
|
-
- `resolve_blocker`:
|
|
410
|
-
`
|
|
353
|
+
- `resolve_blocker`: call `mcp__dev_flow__dev_flow_resolve_blocker` with the current blocked Action's
|
|
354
|
+
`task_id` and `action_id` after the required repository condition has been restored;
|
|
411
355
|
- `stop_for_repository_drift`: report the bounded drift condition and stop.
|
|
412
356
|
|
|
413
357
|
Never infer that an unlisted action is safe. A recovery read itself cannot create a blocker or adopt
|
|
414
|
-
work.
|
|
415
|
-
authority.
|
|
416
|
-
|
|
417
|
-
If any required identity is missing or incomplete, do not construct or send an `operation_probe`;
|
|
418
|
-
send no fabricated or half probe. Do not fill missing values from a partial response, do not assume
|
|
419
|
-
`not_started`, and do not automatically retry. Stop and report that the Skill cannot prove the
|
|
420
|
-
mutation state.
|
|
358
|
+
work. If the original `task_id` or `action_id` is missing, stop; do not rebuild it from partial output.
|
|
421
359
|
|
|
422
360
|
Do not branch, decide, or interpret any recovery classification and do not guess from repository
|
|
423
361
|
state. Core owns classification, effect proof, blocker eligibility, and mutation directives.
|
|
@@ -425,8 +363,7 @@ state. Core owns classification, effect proof, blocker eligibility, and mutation
|
|
|
425
363
|
A complete structured `ok=false` result is an authoritative domain error, not transport
|
|
426
364
|
uncertainty. Never convert or treat that domain error as missing or transport failure. Obey Core's
|
|
427
365
|
`code`, `message`, `recovery.retry_safe`, `recovery.action`, and `recovery.message`. When it reports
|
|
428
|
-
`retry_safe=false` and `action=none`, stop; do not
|
|
429
|
-
`mcp__dev_flow__dev_flow_apply_action`.
|
|
366
|
+
`retry_safe=false` and `action=none`, stop; do not submit or recover the Action.
|
|
430
367
|
|
|
431
368
|
## Bounded correction of the current action
|
|
432
369
|
|
|
@@ -434,16 +371,16 @@ A complete structured domain error may carry field-level detail. `error.details[
|
|
|
434
371
|
failing member as `path`, a closed `rule`, and a fixed non-sensitive `message`. A refused transition
|
|
435
372
|
may instead carry `error.guard` with the Core `guard_id` and the same failure shape.
|
|
436
373
|
|
|
437
|
-
Submit exactly one corrected
|
|
374
|
+
Submit exactly one corrected input through the same `fresh_action.submission_tool` only when every
|
|
375
|
+
condition holds:
|
|
438
376
|
|
|
439
377
|
1. the original result is a complete structured Core domain error;
|
|
440
378
|
2. `recovery.action` is `correct_current_action`;
|
|
441
379
|
3. `recovery.retry_safe` is `true`;
|
|
442
|
-
4. Task
|
|
443
|
-
5.
|
|
444
|
-
6.
|
|
445
|
-
7.
|
|
446
|
-
8. every other payload byte keeps the same meaning.
|
|
380
|
+
4. the current Task still exposes the same Action ID and submission tool;
|
|
381
|
+
5. only members listed in `recovery.allowed_paths` change;
|
|
382
|
+
6. the corrected value follows directly from the returned `rule`, with no source-code guessing;
|
|
383
|
+
7. every other submitted fact keeps the same meaning.
|
|
447
384
|
|
|
448
385
|
Stop immediately when the second submission also fails. Do not submit a third candidate payload;
|
|
449
386
|
report only the exact `path`, `rule`, and that the bounded correction still failed. Never report
|
|
@@ -79,7 +79,7 @@ only when actually visible and appropriate to the current authorized artifacts.
|
|
|
79
79
|
| `implementation.record_surface` | Record exact changed paths or the no-change state and deviations. | Observe and record the exact changed surface. | Direct implementation result; no mandatory capability. | Direct apply result; no mandatory capability. | Changed paths or explicit no-change result. |
|
|
80
80
|
| `implementation.classify_deviations` | Classify deviations as requirement, design, or complexity concerns. | Record the exact concern and route it through Core facts. | Direct classification; amend active artifacts before continuing when semantics change. | Direct classification and current change-artifact update. | Exact deviations and findings. |
|
|
81
81
|
| `test.run_budgeted_checks` | Run only verification authorized by the current verification budget. | Run the current bounded verification steps. | Direct plan-defined checks; no mandatory Spec Kit capability. | Use `openspec-verify` only when visible; otherwise run plan-defined checks. | Actual current verification result. |
|
|
82
|
-
| `test.record_evidence` | Record actual evidence sources, outcomes, and unverified or manual items. | Record actual sources and statuses without relabeling. | Direct evidence recording; no mandatory capability. | Direct evidence recording; no mandatory capability. | Current bounded evidence summary. |
|
|
82
|
+
| `test.record_evidence` | Record actual evidence sources, outcomes, and unverified or manual items. | Record actual sources and statuses without relabeling; report only file changes newly produced by this TEST Action. Verification-only work uses `changed_paths=[]` and `no_file_changes=true`. | Direct evidence recording; no mandatory capability. | Direct evidence recording; no mandatory capability. | Current bounded evidence summary. |
|
|
83
83
|
| `test.classify_failure` | Classify failures as implementation, design, or requirement problems. | Classify current failures from observed facts. | Direct classification; no mandatory capability. | Direct classification; no mandatory capability. | Exact failure class and findings. |
|
|
84
84
|
| `comprehension.explain` | Explain current behavior, design, and code paths in developer-readable terms. | Present a bounded explanation to the developer. | Direct review; no Spec Kit command owns the verdict. | Direct review; no OpenSpec command owns the verdict. | Developer-readable explanation. |
|
|
85
85
|
| `comprehension.identify_complexity` | Identify unnecessary abstractions and maintenance risks. | List concrete complexity and maintenance concerns. | Direct review; no mandatory capability. | Direct review; no mandatory capability. | Exact abstraction and risk findings. |
|
|
@@ -1,342 +1,100 @@
|
|
|
1
|
-
#
|
|
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.
|