easy-coding-harness 0.6.0 → 0.6.1

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/CHANGELOG.md CHANGED
@@ -6,6 +6,22 @@
6
6
  - `y`:常规功能升级
7
7
  - `z`:日常 bug 修复
8
8
 
9
+ ## 0.6.1
10
+
11
+ - 状态迁移按是否需要用户决策分层:`INIT → ANALYSIS` 在 INIT 工作完成后自动流转,`MEMORY → COMPLETE` 在记忆处理检查点完成后自动流转;这两条机械边不再创建 `pending_transition`,也不再展示确认或交接选项。
12
+ - 新增受限的 `auto-transition` 状态 API,只允许上述两条自动边;其他前进、修复和重规划边继续通过 `request-transition` / `confirm-transition` 显式确认,Hook 仍保持只读。
13
+ - IMPLEMENT 完成后允许用户选择进入 REVIEW,或明确跳过 REVIEW 直接进入 VERIFICATION;交接和 free-form Other 仍保留,跳过 REVIEW 不能绕过 VERIFICATION 硬门控。
14
+ - ANALYSIS 改为先原样落盘无阶段标签的 dev-spec 骨架,再在分析过程中即时询问并解决技术路线、接口、范围等决策问题,最后才填充完整方案;最终报告不再包含“待用户决策”章节。
15
+ - `ANALYSIS → IMPLEMENT` 在申请和确认迁移时都会校验完整 dev-spec 和最新有效 execution plan;代码任务还必须提供非空 test strategy,只读任务则禁止生成 `test-strategy.md`。必填章节正文、实施单元任务卡字段和并行分组均需完整,原始骨架、空章节、无界单元或缺失产物不能进入实施。
16
+ - dev-spec 骨架使用专用 `[[EC_TODO:...]]` 占位标记,既能可靠拦截未填字段,也不会把方案中合法的 `{title}`、`{type}` 等模板文本误判为残留占位符。
17
+ - execution plan 门禁校验依赖图无环及并行层级顺序;`doc` / `analysis` / `report` 显式无代码任务允许受限空文件范围并通过 `deliverable` 返回只读结果,代码任务仍禁止无界实施。
18
+ - 无代码 IMPLEMENT 单元必须返回非空 `deliverable` 且不得修改文件;主 Agent 在展示摘要或迁移选项前必须向用户原样输出完整 deliverable,避免结果只留在执行日志中。
19
+ - 无代码任务展示完整 deliverable 后直接通过受限 `IMPLEMENT → COMPLETE` 自动边结束;状态 API 会校验 single 空文件计划、匹配的 dispatch/result、零文件改动、非空 deliverable 和无遗留问题,不生成 `test-strategy.md`,不进入 REVIEW、VERIFICATION、MEMORY,也不写任务记忆。
20
+ - 介绍页展示版本与 `package.json` 保持一致,并由版本元数据测试防止后续发布再次漂移。
21
+ - 升级遗留的自动 `pending_transition` 在状态上下文中标记为 `auto-transition-ready`,不再错误注入用户确认提示。
22
+ - `single` / `sequential` / `parallel` 三种执行策略统一派发子代理,仅编排形态不同;技术方案骨架不再生成“主 Agent 直接执行”的冲突指令。
23
+ - 工作流 skills、主约束、README、设计/介绍/使用文档和状态 API 测试统一对齐新的自动边与可选 REVIEW 语义。
24
+
9
25
  ## 0.6.0
10
26
 
11
27
  - 状态机移除无实际工作内容的 `WAITING_CONFIRM`;阶段完成后通过 `task.json.pending_transition` 记录待确认边,状态仍停留在当前阶段,直到用户明确确认。
package/README.md CHANGED
@@ -69,16 +69,20 @@ easy-coding init --submodules packages/a,packages/b
69
69
  ## 工作流
70
70
 
71
71
  ```text
72
- INIT -> ANALYSIS -> IMPLEMENT -> REVIEW -> VERIFICATION -> MEMORY -> COMPLETE
73
- ^ ^ | |
74
- +-- replan ---+ +--- fix -----+
75
- ^ |
76
- +------- repair ----------+
77
- every edge --[user confirmation by default]--> target stage
72
+ INIT --[auto]--> ANALYSIS -> IMPLEMENT -> REVIEW -> VERIFICATION -> MEMORY --[auto]--> COMPLETE
73
+ \----------------> VERIFICATION
74
+ \--[read-only auto]------------------------------> COMPLETE
75
+ ^ ^ | |
76
+ +-- replan ---+ +--- fix -----+
77
+ ^ |
78
+ +------- repair ----------+
79
+ user-decision edge --[confirm / handoff / Other]--> target stage
78
80
  any stage --[user abort via ec-task-close]--> CLOSED
79
81
  ```
80
82
 
81
- - 每个阶段完成后先记录 `pending_transition`,默认必须由用户确认才进入目标阶段;优先通过智能体原生选项功能选择确认、交接给其他智能体或使用 free-form Other,纯文本编号仅作回退。
83
+ - `INIT → ANALYSIS` 与完成记忆处理后的 `MEMORY → COMPLETE` 自动流转,不生成 `pending_transition`,也不展示确认或交接。
84
+ - 其余用户关联边通过 `pending_transition` 等待明确确认;代码 IMPLEMENT 完成后可选择进入 REVIEW、跳过 REVIEW 直接进入 VERIFICATION,或交接给其他智能体。
85
+ - 显式 `doc` / `analysis` / `report` 只读任务不生成 `test-strategy.md`;IMPLEMENT 留下匹配的 dispatch/result 并展示完整报告后自动进入 COMPLETE,不执行 REVIEW、VERIFICATION 或 MEMORY,也不写任务记忆。
82
86
  - `VERIFICATION` 是验证硬门控,未实际运行的 lint、typecheck、test 不算通过。
83
87
  - `MEMORY` 先写入本次任务短期记忆,再执行长期记忆阈值门禁;未超过阈值时长期沉淀为 no-op。
84
88
 
@@ -115,7 +119,7 @@ any stage --[user abort via ec-task-close]--> CLOSED
115
119
  | `ec-workflow` | 统一入口,负责任务创建、恢复、阶段流转和 stage skill 调度 |
116
120
  | `ec-brainstorming` | 实现前的设计探索和方案发散 |
117
121
  | `ec-analysis` | 生成 dev-spec、执行计划和测试策略 |
118
- | `ec-implementing` | 按确认后的计划执行代码实现 |
122
+ | `ec-implementing` | 按确认后的计划执行代码实现或显式无代码只读交付 |
119
123
  | `ec-reviewing` | 多维度代码审查,输出 accept / fix / replan / blocked 结论 |
120
124
  | `ec-verification` | 执行 lint、typecheck、test 等验证硬门控,并处理验收修复循环 |
121
125
  | `ec-memory` | 写短期记忆,并在超过阈值时沉淀长期记忆 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easy-coding-harness",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "CLI scaffold for installing Easy Coding harness files into agent-native directories.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,6 +9,8 @@ complete exactly that unit. Your reply IS the return value, not a message to a h
9
9
  ## Hard constraints
10
10
 
11
11
  - Modify only the files listed in the task card's "Editable scope". Touch nothing else.
12
+ - If the editable scope is `NONE — read-only deliverable`, modify nothing and return the full
13
+ requested result in `deliverable`.
12
14
  - Do not call any Skill tool.
13
15
  - Do not read `.claude/skills/`, `.agents/skills/`, `.qoder/skills/`, or any `.easy-coding/`
14
16
  file. All context you need is already in the task card.
@@ -20,6 +22,7 @@ complete exactly that unit. Your reply IS the return value, not a message to a h
20
22
 
21
23
  - `changed_files`: the files you actually modified
22
24
  - `summary`: one line describing what you did
25
+ - `deliverable`: full no-code result, or `null` for a code unit
23
26
  - `issues`: problems you hit (empty array if none)
24
27
  - `needs_attention`: anything the main agent must decide (empty array if none)
25
28
 
@@ -8,6 +8,8 @@ complete exactly that unit. Your reply IS the return value, not a message to a h
8
8
 
9
9
  Hard constraints:
10
10
  - Modify only the files listed in the task card's "Editable scope". Touch nothing else.
11
+ - If the editable scope is NONE — read-only deliverable, modify nothing and return the full
12
+ requested result in deliverable.
11
13
  - Do not call any Skill tool.
12
14
  - Do not read .agents/skills/, .codex/, or any .easy-coding/ file. All needed context is in
13
15
  the card.
@@ -18,6 +20,7 @@ Hard constraints:
18
20
  Output (return exactly this):
19
21
  - changed_files: the files you actually modified
20
22
  - summary: one line describing what you did
23
+ - deliverable: full no-code result, or null for a code unit
21
24
  - issues: problems you hit (empty array if none)
22
25
  - needs_attention: anything the main agent must decide (empty array if none)
23
26
 
@@ -44,9 +44,13 @@ analysis, workflow operation). The CLI never analyzes the project.
44
44
 
45
45
  6 work stages + 2 terminals, owned by ec-workflow:
46
46
  `INIT → ANALYSIS → IMPLEMENT → REVIEW → VERIFICATION → MEMORY → COMPLETE`, plus `CLOSED`
47
- (user abort, no memory flow). Every legal stage edge records `task.json.pending_transition`
48
- and requires explicit user confirmation by default. VERIFICATION remains the fresh-evidence
49
- hard gate, and MEMORY keeps the conditional long-memory threshold gate. The active task
47
+ (user abort, no memory flow). INIT ANALYSIS and completed MEMORY → COMPLETE are restricted
48
+ automatic edges. A validated read-only `doc` / `analysis` / `report` task also auto-completes
49
+ from IMPLEMENT after its full deliverable is shown, without REVIEW, VERIFICATION, MEMORY, or
50
+ task memory. Other stage edges record `task.json.pending_transition` and require explicit user
51
+ confirmation; code tasks may skip REVIEW and enter VERIFICATION directly. VERIFICATION remains
52
+ the code-task fresh-evidence hard gate, and MEMORY keeps the conditional long-memory threshold
53
+ gate. The active task
50
54
  pointer lives in `sessions/{ppid}.json`;
51
55
  when the task reaches `COMPLETE` or `CLOSED`, the state API clears `current_task` so the
52
56
  session returns to Ready. Each task's stage persists in its `task.json`. Hooks inject the
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ec-analysis
3
- description: ANALYSIS-stage skill. Use when ec-workflow enters ANALYSIS. Creates the dev-spec skeleton FIRST (template-first), then fills incrementally — producing the narrative plan, execution plan (execution.jsonl), and test strategy. Ends by requesting the confirmed edge to IMPLEMENT. Grounds every conclusion in real code, never restates the requirement.
3
+ description: ANALYSIS-stage skill. Use when ec-workflow enters ANALYSIS. Creates the dev-spec skeleton FIRST, resolves user decisions during analysis, then fills the final plan and execution plan; code tasks also receive a standalone test strategy, while read-only tasks do not. Ends by requesting the confirmed edge to IMPLEMENT. Grounds every conclusion in real code, never restates the requirement.
4
4
  ---
5
5
 
6
6
  > **SKELETON FIRST — your first two tool calls MUST be: (1) Read `.easy-coding/templates/dev-spec-skeleton.md`, (2) Write its EXACT content to the task's dev-spec.md. No exceptions. Do not analyze or think before the skeleton file exists on disk.**
@@ -23,24 +23,33 @@ Communicate with the user in the user's language.
23
23
  If dev-spec.md does not exist with the correct template after your second tool call,
24
24
  you have already failed. Do not read code, think aloud, or analyze before the skeleton
25
25
  is on disk.
26
- 2. **All subsequent analysis** fills sections of this file via edits. You do NOT hold analysis
27
- in your head and dump it at the end you write each section into the file as you go.
28
- 3. **Your chat output to the user IS dev-spec.md, verbatim.** After dev-spec.md is complete,
29
- use the Read tool to read it back, then output exactly what you read as your reply this
26
+ 2. **Resolve decisions before filling.** After the exact skeleton is on disk, load the required
27
+ inputs and inspect source code without editing dev-spec.md. As soon as analysis reveals a
28
+ decision that affects technical direction, API, scope, delivery form, state flow, encoding,
29
+ or acceptance, ask the user immediately and stop. Prefer the platform's native user-choice
30
+ tool when available. Keep dev-spec.md as the untouched skeleton until every decision is
31
+ resolved; never write an unresolved question or an assumed answer into the final plan.
32
+ 3. **Decision questions are the only pre-plan chat exception.** While the decision gate is
33
+ unresolved, ask only the evidence-backed question needed to continue; do not present a draft
34
+ report. After all decisions are resolved and dev-spec.md is complete, your chat output to the
35
+ user IS dev-spec.md verbatim. Use the Read tool to read it back, then output exactly what you
36
+ read as your reply — this
30
37
  is a copy operation, not a re-narration. Do NOT reconstruct it from memory, do NOT
31
38
  abbreviate, do NOT invent a different format. No "执行计划" summary tables, no bullet-point
32
39
  plans, no freestyle answers. The template IS the format. If your reply does not contain
33
40
  every mandatory section header from the template, you have failed.
34
- 4. **Three files must exist** in `.easy-coding/tasks/{task-id}/` when you finish:
35
- `dev-spec.md`, `execution.jsonl` (plan record), `test-strategy.md`. Missing any one = failed.
41
+ 4. **Required artifacts depend on delivery mode.** Code tasks require `dev-spec.md`,
42
+ `execution.jsonl` (plan record), and `test-strategy.md`. Read-only `doc` / `analysis` /
43
+ `report` tasks require only `dev-spec.md` and `execution.jsonl`; they MUST NOT create
44
+ `test-strategy.md` because they never enter VERIFICATION.
36
45
  5. **Stay faithful to the user's delivery form (anti-downgrade).** The delivery form —
37
46
  change real code vs. produce a document — is set by the user's original request, NOT by
38
47
  you. If the user asked to refactor / fix / add a feature (a CODE task), you MUST plan real
39
48
  code changes. You may NOT downgrade it to "produce a report / audit / inventory only" or
40
49
  "defer all changes to follow-up sub-tasks." A large change surface is NOT a reason to
41
- downgrade: decompose it into batches/units in 实施拆解, and surface "split into batches? /
42
- which subset this round?" as an explicit item in 待用户决策 for the user to decide. Never
43
- make a scope-narrowing decision yourself and present it as settled. Never fabricate a
50
+ downgrade: during the pre-fill decision gate, ask "split into batches? / which subset this
51
+ round?" and wait for the user to decide. Never make a scope-narrowing decision yourself and
52
+ present it as settled. Never fabricate a
44
53
  premise such as "the user already fixed scope X in INIT" or "auto_mode already selected Y"
45
54
  to justify narrowing — `auto_mode` only waives stage-boundary prompts under an explicit
46
55
  autonomous user request and carries NO scope or delivery-form decision whatsoever.
@@ -49,7 +58,8 @@ Communicate with the user in the user's language.
49
58
  execution.jsonl, test-strategy.md, memory files, generated reports, etc.) is FORBIDDEN in
50
59
  this table — those are process outputs, not "changes." The table MAY be empty, but ONLY
51
60
  when the user explicitly asked for a no-code delivery form (e.g. a pure documentation
52
- request); in that case declare the deliverable in 需求解析 > 输出. If the task type is a
61
+ request) and `task.json.type` is `doc`, `analysis`, or `report`; in that case declare the
62
+ deliverable in 需求解析 > 输出. If the task type is a
53
63
  code task (重构 / Bug 修复 / 新功能 / 性能优化) yet 改动范围 is empty, you have downgraded
54
64
  the task — this is a failed analysis.
55
65
 
@@ -82,22 +92,31 @@ You MUST execute these steps in exact order. Do not rearrange, skip, or combine
82
92
  1. **Write skeleton** — FIRST TWO tool calls:
83
93
  - Read `.easy-coding/templates/dev-spec-skeleton.md` (the template file).
84
94
  - Write its exact content to `.easy-coding/tasks/{task-id}/dev-spec.md`.
85
- This is a copy operation, not a generation task. Every section header and every `{待填写}`
86
- placeholder in the template must appear in the written file unchanged.
87
- 2. **Fill 项目模式 + 任务类型** edit dev-spec.md in place.
88
- 3. **Fill 需求解析** edit dev-spec.md: 目标 / 输入 / 输出 / 边界.
89
- 4. **Read source code, fill 现状** read the actual files, then edit dev-spec.md with
90
- evidence. Every claim must cite file:line. No file references = invalid section.
91
- 5. **Fill 冲突摘要 + 待用户决策**edit dev-spec.md.
92
- 6. **Fill 影响面分析 + 改动范围** edit dev-spec.md, fill the table with encoding evidence.
93
- 7. **Fill 修改方案 + 实施拆解** edit dev-spec.md, design approach and decompose units.
94
- 8. **Fill 测试策略 + 风险与注意事项** — edit dev-spec.md.
95
- 9. **Fill conditional sections** — edit dev-spec.md: 背景数据应用 / 核心改动明细 /
95
+ This is a copy operation, not a generation task. Every section header and every
96
+ `[[EC_TODO:...]]` marker in the template must appear in the written file unchanged.
97
+ 2. **Inspect before filling**load the required inputs in the order above and read the actual
98
+ source files. Do not edit dev-spec.md yet. Collect evidence and identify every decision that
99
+ could change technical direction, API, scope, delivery form, state flow, encoding, or
100
+ acceptance.
101
+ 3. **Resolve the decision gate**if any decision exists, ask it during ANALYSIS immediately,
102
+ using the native user-choice tool when available, then stop and wait. After the user answers,
103
+ repeat the evidence check and ask any newly exposed decision. Do not fill dev-spec.md,
104
+ execution.jsonl, or (for code tasks) test-strategy.md until the decision set is empty.
105
+ 4. **Fill 项目模式 + 任务类型** — edit dev-spec.md in place only after the decision gate clears.
106
+ 5. **Fill 需求解析** — edit dev-spec.md: 目标 / 输入 / 输出 / 边界.
107
+ 6. **Fill 现状 + 冲突摘要** — write evidence-backed conclusions. Every current-state claim
108
+ must cite file:line. No file references = invalid section.
109
+ 7. **Fill 影响面分析 + 改动范围** — edit dev-spec.md, fill the table with encoding evidence.
110
+ 8. **Fill 修改方案 + 实施拆解** — edit dev-spec.md, design approach and decompose units.
111
+ 9. **Fill 测试策略 + 风险与注意事项** — edit dev-spec.md.
112
+ 10. **Fill conditional sections** — edit dev-spec.md: 背景数据应用 / 核心改动明细 /
96
113
  前端实现映射 only if applicable. Remove inapplicable conditional sections entirely.
97
- 10. **Write execution.jsonl** — append the plan record (see section below).
98
- 11. **Write test-strategy.md** — write the testability table (see section below).
99
- 12. **Self-check** run the gates below. Fix any failure in the files.
100
- 13. **Present to user** — Read dev-spec.md back from disk and output exactly what you read as
114
+ 11. **Write execution.jsonl** — append the plan record (see section below).
115
+ 12. **Write test-strategy.md for code tasks only** — write the testability table (see section
116
+ below). For a read-only task, do not create this file; fill the dev-spec `测试策略` section
117
+ with `不适用:只读报告任务不进入 VERIFICATION`.
118
+ 13. **Self-check** — run the gates below. Fix any failure in the files.
119
+ 14. **Present to user** — Read dev-spec.md back from disk and output exactly what you read as
101
120
  your reply. Do not summarize, abbreviate, reformat, or reconstruct from memory. The
102
121
  dev-spec.md content on disk IS your reply.
103
122
 
@@ -114,7 +133,7 @@ If the hook injects `[easy-coding:analysis-template-drift:missing:...]`, you hav
114
133
  from the template. Re-read the template file, compare it against your dev-spec.md, and fix
115
134
  any missing or renamed section headers immediately.
116
135
 
117
- **Mandatory section headers** (all 13 must be present in the skeleton — the hook validates these):
136
+ **Mandatory section headers** (all 12 must be present in the skeleton — the hook validates these):
118
137
 
119
138
  1. `## 技术方案`
120
139
  2. `### 项目模式`
@@ -122,13 +141,12 @@ any missing or renamed section headers immediately.
122
141
  4. `### 需求解析`
123
142
  5. `### 现状`
124
143
  6. `### 冲突摘要`
125
- 7. `### 待用户决策`
126
- 8. `### 影响面分析`
127
- 9. `### 改动范围`
128
- 10. `### 修改方案`
129
- 11. `### 实施拆解`
130
- 12. `### 测试策略`
131
- 13. `### 风险与注意事项`
144
+ 7. `### 影响面分析`
145
+ 8. `### 改动范围`
146
+ 9. `### 修改方案`
147
+ 10. `### 实施拆解`
148
+ 11. `### 测试策略`
149
+ 12. `### 风险与注意事项`
132
150
 
133
151
  > **Encoding rule**: modified files keep their original encoding; new files declare the
134
152
  > project encoding with evidence; conflicting or unknown encoding → mark "需用户确认".
@@ -146,6 +164,7 @@ any missing or renamed section headers immediately.
146
164
  - Restating requirements without citing code evidence.
147
165
  - Listing "loaded information" without a concrete implementation approach.
148
166
  - Including conditional sections that are irrelevant to the current task.
167
+ - Including `[阶段:ANALYSIS]`, a `待用户决策` section, or any unresolved decision in the report.
149
168
 
150
169
  ## Implementation units → execution.jsonl
151
170
 
@@ -153,7 +172,7 @@ Decompose the work into units, then append ONE `plan` record to
153
172
  `.easy-coding/tasks/{task-id}/execution.jsonl`:
154
173
 
155
174
  ```json
156
- {"type":"plan","strategy":"parallel","units":[{"id":"U1","title":"...","type":"backend","files":["..."],"depends_on":[],"rules_sections":["naming","error-handling"],"abstract_modules":["user-service"]}],"parallel_groups":[{"level":0,"units":["U1","U2"]},{"level":1,"units":["U3"]}]}
175
+ {"type":"plan","strategy":"parallel","units":[{"id":"U1","title":"Implement service","type":"backend","files":["src/service.ts"],"depends_on":[],"rules_sections":["naming","error-handling"],"abstract_modules":["user-service"]},{"id":"U2","title":"Implement adapter","type":"backend","files":["src/adapter.ts"],"depends_on":[],"rules_sections":["naming"],"abstract_modules":["user-service"]},{"id":"U3","title":"Add integration tests","type":"test","files":["test/service.test.ts"],"depends_on":["U1","U2"],"rules_sections":["testing"],"abstract_modules":["user-service"]}],"parallel_groups":[{"level":0,"units":["U1","U2"]},{"level":1,"units":["U3"]}]}
157
176
  ```
158
177
 
159
178
  Strategy selection (drives ec-implementing's sub-agent orchestration shape — every strategy
@@ -168,7 +187,18 @@ Each unit carries `rules_sections` and `abstract_modules` so ec-implementing can
168
187
  precise task card without the sub-agent re-reading the whole repo. `depends_on` sets the
169
188
  parallel-group levels.
170
189
 
171
- ## Test strategy (presented with the plan, saved for VERIFICATION)
190
+ For an explicitly no-code `doc` / `analysis` / `report` task, use a `single` plan whose unit
191
+ has `files:[]`. The state API permits an empty file scope only for those task types. The unit
192
+ must still include `id`, `title`, `type`, `depends_on`, `rules_sections`, and
193
+ `abstract_modules`; its sub-agent returns the full read-only result in `deliverable` and must
194
+ not modify project files. After IMPLEMENT shows that full result, the task auto-completes without
195
+ REVIEW, VERIFICATION, MEMORY, or a memory write. Never use an empty `files` list for
196
+ feature/bugfix/refactor/perf code tasks.
197
+
198
+ ## Test strategy (code tasks only; presented with the plan, saved for VERIFICATION)
199
+
200
+ Read-only `doc` / `analysis` / `report` tasks skip this entire standalone artifact. Do not
201
+ create `test-strategy.md`; only mark the mandatory dev-spec `测试策略` section as not applicable.
172
202
 
173
203
  **1. Testability table** — classify every change:
174
204
 
@@ -193,33 +223,37 @@ owning unit and the verify command.
193
223
  **5. Cannot-verify items** — items that cannot be verified in the current environment,
194
224
  with reason (missing infra, data, credentials, or API contract).
195
225
 
196
- Write the confirmed strategy to `.easy-coding/tasks/{task-id}/test-strategy.md` (the
197
- VERIFICATION baseline).
226
+ For a code task, write the confirmed strategy to
227
+ `.easy-coding/tasks/{task-id}/test-strategy.md` (the VERIFICATION baseline).
198
228
 
199
229
  ## Self-check gates (ALL must pass — reject your own output if ANY fails)
200
230
 
201
231
  - [ ] `dev-spec.md` 文件是否已写入 `.easy-coding/tasks/{task-id}/`?
202
232
  - [ ] `execution.jsonl` 文件是否已写入?
203
- - [ ] `test-strategy.md` 文件是否已写入?
204
- - [ ] dev-spec.md 是否包含全部 13 个必填章节标题(参见上方清单)?
233
+ - [ ] 代码任务是否已写入 `test-strategy.md`?只读任务是否确认该文件不存在?
234
+ - [ ] dev-spec.md 是否包含全部 12 个必填章节标题(参见上方清单)?
205
235
  - [ ] 每个"现状"断言是否引用了真实文件/类/行号?
206
236
  - [ ] 是否有具体的修改方案,而非仅罗列"已加载的文件"?
207
237
  - [ ] 不适用的条件章节是否已完全省略(而非留空)?
208
238
  - [ ] 实施拆解的单元、依赖、策略是否与改动范围表一致?
209
239
  - [ ] 改动范围表中每行是否填写了文件编码及证据?
210
- - [ ] 所有 `{待填写}` 占位符是否已替换为实际内容?
240
+ - [ ] 所有 `[[EC_TODO:...]]` 占位标记是否已替换为实际内容?
211
241
  - [ ] 回复给用户的内容是否是 dev-spec.md 的完整内容(而非自创的缩略格式)?
212
242
  - [ ] 交付形态是否忠于用户原始需求?代码类任务(重构/修复/功能)是否规划了真实代码改动,而非降级为"仅出报告/分析清单/留作后续子任务"?
213
243
  - [ ] 「改动范围」是否只含真实项目源码/配置,且不含任何 `.easy-coding/` 下的 harness 产物(dev-spec/execution/test-strategy/记忆/报告)?
214
244
  - [ ] 若「改动范围」为空,是否确为用户明确要求的无代码交付形态,而非 AI 自行降级的结果?
215
- - [ ] 任何"本次不做全部 / 分批落地 / 范围收窄"的决定,是否已列入「待用户决策」交由用户拍板,而非自行拍板并假托既定?
245
+ - [ ] unit.files 为空,task.json.type 是否为 `doc` / `analysis` / `report`,且计划是否为 single 只读交付?
246
+ - [ ] 是否在填充方案前通过分析中的即时问答解决了全部用户决策项,且最终报告不含未决问题或 `[阶段:ANALYSIS]`?
247
+ - [ ] 任何"本次不做全部 / 分批落地 / 范围收窄"的决定,是否已在填充方案前询问并获得用户确认,而非自行拍板并假托既定?
216
248
 
217
249
  ## Revision handling
218
250
 
219
- > 修订同样受 HARD RULE 5/6 约束:用户的修订诉求若是扩大或细化代码改动,不得借机把任务降级为"出报告";范围收窄仍须作为 待用户决策 项由用户确认。
251
+ > 修订同样受 HARD RULE 5/6 约束:用户的修订诉求若是扩大或细化代码改动,不得借机把任务降级为"出报告";范围收窄必须在重写报告前即时询问并获得用户确认。
220
252
 
221
253
  On user revision or Other feedback while ANALYSIS has a pending transition, first cancel the
222
- pending edge. Do NOT reply with only a change summary.
254
+ pending edge. Re-run the pre-fill decision gate before editing the existing report. If the
255
+ revision exposes an unresolved decision, ask it immediately and wait without writing a partial
256
+ revision. Do NOT reply with only a change summary.
223
257
  Re-output the COMPLETE revised dev-spec.md:
224
258
 
225
259
  1. Prepend a `### 修订摘要` listing each user request and its impact on the plan. If the
@@ -227,7 +261,8 @@ Re-output the COMPLETE revised dev-spec.md:
227
261
  2. Re-output the full plan following the template above (核心必填 + applicable conditional
228
262
  sections), incorporating all revisions.
229
263
  3. Overwrite the `plan` record in execution.jsonl with the new strategy.
230
- 4. Update test-strategy.md if test scope changed.
264
+ 4. For code tasks, update test-strategy.md if test scope changed. For read-only tasks, keep the
265
+ file absent.
231
266
  5. Request ANALYSIS -> IMPLEMENT again and present the standard confirmation/handoff/Other gate.
232
267
 
233
268
  ## End state
@@ -67,7 +67,7 @@ design now?" Offer two options:
67
67
 
68
68
  1. **Start task now** — invoke `{{skill_trigger}}ec-workflow` with the design topic as the
69
69
  task prompt. ec-workflow will create the task and enter INIT. After INIT completes, it
70
- presents the standard confirmation/handoff/Other gate before entering ANALYSIS.
70
+ automatically enters ANALYSIS without a confirmation/handoff gate.
71
71
  ec-analysis will discover the design doc in `.easy-coding/spec/` and use it as input.
72
72
  2. **Later** — tell the user the design is saved and they can run
73
73
  `{{skill_trigger}}ec-workflow` whenever ready.
@@ -17,7 +17,7 @@ Communicate with the user in the user's language.
17
17
  |---|---|---|
18
18
  | `sessions/` | **never** | personal runtime state, differs per developer |
19
19
  | `config.yaml` | yes | shared team config |
20
- | `tasks/*/task.json` `dev-spec.md` `execution.jsonl` `test-strategy.md` | yes | per-task folders, no merge conflicts; team-readable decision record |
20
+ | `tasks/*/task.json` `dev-spec.md` `execution.jsonl` and code-task `test-strategy.md` | yes | per-task folders, no merge conflicts; team-readable decision record |
21
21
  | `SOUL.md` `RULES.md` `ABSTRACT.md` `TEST_STRATEGY.md` `CHANGELOG.md` | yes | shared project knowledge |
22
22
  | `memory/` | yes | shared knowledge sinks |
23
23
  | `spec/` | yes | spec store |
@@ -1,13 +1,14 @@
1
1
  ---
2
2
  name: ec-implementing
3
- description: IMPLEMENT-stage skill. Use when ec-workflow enters IMPLEMENT with a confirmed plan. Executes execution.jsonl units under strict file-scope control, enforces RULES compliance and encoding preservation, writes tests per strategy, and dispatches sub-agents for every unit regardless of strategy.
3
+ description: IMPLEMENT-stage skill. Use when ec-workflow enters IMPLEMENT with a confirmed plan. Executes code or explicit no-code execution.jsonl units under strict scope control, enforces RULES compliance and encoding preservation, writes code-task tests per strategy, and dispatches sub-agents for every unit regardless of strategy.
4
4
  ---
5
5
 
6
6
  # ec-implementing — execute the confirmed plan
7
7
 
8
- ec-workflow dispatches you when a confirmed task enters IMPLEMENT. You turn the plan into
9
- code without re-opening decisions. Inputs: `dev-spec.md` (confirmed), `execution.jsonl`
10
- (plan record), `.easy-coding/RULES.md`, `.easy-coding/ABSTRACT.md`, `test-strategy.md`.
8
+ ec-workflow dispatches you when a confirmed task enters IMPLEMENT. You execute the confirmed
9
+ delivery without re-opening decisions. Inputs: `task.json`, `dev-spec.md` (confirmed), `execution.jsonl`
10
+ (plan record), `.easy-coding/RULES.md`, `.easy-coding/ABSTRACT.md`, and `test-strategy.md` for
11
+ code tasks only. A read-only task has no test-strategy.md.
11
12
 
12
13
  Communicate with the user in the user's language.
13
14
 
@@ -28,8 +29,13 @@ Communicate with the user in the user's language.
28
29
  6. **Self-audit gate.** When the unit is done, audit: are all edits within scope? any
29
30
  undeclared dependency change? any leftover TODO/FIXME you introduced? Report failures;
30
31
  never skip silently.
31
- 7. **Tests (soft rule).** Write tests for [must-test]/[should-test] items per
32
+ 7. **Tests (code tasks only, soft rule).** Write tests for [must-test]/[should-test] items per
32
33
  test-strategy.md. Soft means: no project test infra → not forced; infra exists → required.
34
+ Read-only tasks have no test-strategy.md and write no tests.
35
+ 8. **No-code delivery is explicit and read-only.** Only a task whose `task.json.type` is
36
+ `doc`, `analysis`, or `report` may have `unit.files:[]`. Dispatch it with editable scope
37
+ `NONE — read-only deliverable`; the sub-agent modifies nothing and returns the full result
38
+ in `deliverable`. An empty scope on any code task is a gate failure, not permission to roam.
33
39
 
34
40
  ## Sub-agent dispatch
35
41
 
@@ -70,8 +76,14 @@ goes through a sub-agent — this isolates implementation context from the main
70
76
  await the level, then advance.
71
77
  Platform spawn rule: {{platform_spawn_instruction}}
72
78
  4. After each unit/level returns: check for file conflicts (two units touched the same file),
73
- collect `issues` and `needs_attention`. Resolve conflicts before advancing.
74
- 5. After all units/levels, summarize.
79
+ collect `issues` and `needs_attention`. Resolve conflicts before advancing. For a no-code
80
+ unit, additionally require `changed_files:[]` and a non-empty string `deliverable`; a missing
81
+ deliverable or any file modification is a unit failure and must be re-dispatched.
82
+ 5. After recording a successful no-code result, output the complete `deliverable` to the user
83
+ verbatim in the current response before any summary or completion action. Never replace,
84
+ truncate, or hide it behind the one-line `summary` or leave it only in execution.jsonl.
85
+ 6. After all units/levels, summarize. For no-code delivery, the summary is supplemental and
86
+ must appear after the full deliverable.
75
87
 
76
88
  ## Task card — the sub-agent contract
77
89
 
@@ -88,11 +100,13 @@ structured results. Reply content IS the return value, not a message to a human.
88
100
  - Modify only files in "Editable scope".
89
101
  - Make no stage-transition decisions.
90
102
  ## Task {unit description extracted from dev-spec}
91
- ## Editable scope {unit.files}
103
+ ## Delivery mode {code | no-code read-only, derived from task.type and unit.files}
104
+ ## Editable scope {unit.files | NONE — read-only deliverable}
92
105
  ## Coding rules {RULES.md sections selected by unit.rules_sections}
93
106
  ## Architecture {ABSTRACT.md sections selected by unit.abstract_modules}
94
107
  ## Output format
95
- Return: changed_files[], summary (one line), issues[], needs_attention[].
108
+ Return: changed_files[], summary (one line), deliverable (full no-code result or null),
109
+ issues[], needs_attention[].
96
110
  ```
97
111
 
98
112
  This enforces the three-layer escape guard: task boundary (only its files), stage boundary
@@ -107,9 +121,19 @@ let sub-agents re-dispatch each other.
107
121
 
108
122
  ## End state
109
123
 
110
- All units done and self-audited hand back to ec-workflow to request IMPLEMENT -> REVIEW and
111
- wait at the standard confirmation/handoff/Other gate. If something invalidates the plan,
112
- request IMPLEMENT -> ANALYSIS and wait at the same gate instead of improvising.
124
+ - **Code task:** after all units are done and self-audited, hand back to ec-workflow. It records
125
+ IMPLEMENT -> REVIEW as the recommended pending edge, then presents: (1) enter REVIEW,
126
+ (2) skip REVIEW and enter VERIFICATION, (3) hand off, plus native free-form Other.
127
+ - **No-code read-only task:** after recording the successful result and showing the complete
128
+ deliverable, call `auto-transition --stage COMPLETE` through ec-workflow. Do not request or
129
+ enter REVIEW, VERIFICATION, or MEMORY; do not write short or long memory. The state API only
130
+ accepts this terminal edge when the latest plan is `single` with `files:[]` and the latest
131
+ result has `changed_files:[]`, a non-empty `deliverable`, and no issues/needs_attention.
132
+ A matching `dispatch` record must immediately precede the accepted result among that unit's
133
+ execution records; an inline report without dispatch cannot complete.
134
+
135
+ If something invalidates the plan before completion, request IMPLEMENT -> ANALYSIS and wait at
136
+ the standard gate instead of improvising.
113
137
 
114
138
  ## Self-check gates (before handing back)
115
139
 
@@ -118,3 +142,7 @@ request IMPLEMENT -> ANALYSIS and wait at the same gate instead of improvising.
118
142
  - [ ] Each dispatched unit has a `dispatch` record in execution.jsonl?
119
143
  - [ ] Each returned unit has a `result` record?
120
144
  - [ ] No files modified outside the change-scope table?
145
+ - [ ] For a no-code unit: changed_files is empty, deliverable is non-empty, and the full
146
+ deliverable was output verbatim to the user before automatic completion?
147
+ - [ ] For a no-code task: IMPLEMENT -> COMPLETE was automatic, with no REVIEW, VERIFICATION,
148
+ MEMORY, or memory write?
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ec-memory
3
- description: MEMORY-stage skill — part of the archive flow, triggered only after user acceptance and a confirmed stage edge. Writes one schema-v2 short memory, then runs the authoritative conditional long-memory gate, performs optional distillation, and requests COMPLETE.
3
+ description: MEMORY-stage skill — part of the archive flow, triggered only after user acceptance and a confirmed stage edge. Writes one schema-v2 short memory, runs the authoritative conditional long-memory gate, performs optional distillation, and automatically completes the task.
4
4
  ---
5
5
 
6
6
  # ec-memory — archive what was learned
@@ -8,6 +8,8 @@ description: MEMORY-stage skill — part of the archive flow, triggered only aft
8
8
  ec-workflow dispatches you during MEMORY, which runs only after the user accepts the task and
9
9
  confirms entry. Inputs: the task's `dev-spec.md`, `execution.jsonl` (the `result` and
10
10
  `verify` records are precise source material), the changed-files list, existing memory files.
11
+ Read-only `doc` / `analysis` / `report` tasks auto-complete from IMPLEMENT and never enter
12
+ MEMORY or write task memory.
11
13
 
12
14
  Communicate with the user in the user's language. Memory file content follows the project's
13
15
  recorded comment/doc language.
@@ -132,11 +134,13 @@ For `distill`, it also rejects completion while any frozen candidate still exist
132
134
  frozen retained file is missing. A candidate checkpoint may disappear only because it is
133
135
  explicitly listed in `candidate_files`.
134
136
 
135
- ## Step 3 — request COMPLETE
137
+ ## Step 3 — automatically enter COMPLETE
136
138
 
137
- Only after `memory_progress.completed:true`, hand control to ec-workflow to request
138
- MEMORY -> COMPLETE. Present the standard confirmation/handoff/Other gate and stop. Do not
139
- mark the task COMPLETE automatically.
139
+ Only after `memory_progress.completed:true`, hand control to ec-workflow to call:
140
+ `{{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py auto-transition --session-file <P> --stage COMPLETE --agent <agent-id>`.
141
+ MEMORY -> COMPLETE is a mechanical edge: do not create `pending_transition`, present another
142
+ confirmation/handoff gate, or stop before closeout. Use the returned Ready status context and
143
+ emit the final task summary.
140
144
 
141
145
  ## ABSTRACT backfill / update
142
146
 
@@ -5,9 +5,10 @@ description: REVIEW-stage skill. Use when ec-workflow enters REVIEW. Reviews cha
5
5
 
6
6
  # ec-reviewing — graded, evidence-backed review
7
7
 
8
- ec-workflow dispatches you when IMPLEMENT finishes. You judge the change set and return a
9
- verdict that drives the next transition. Inputs: the changed files (from execution.jsonl
10
- `result` records), `dev-spec.md`, `.easy-coding/RULES.md`, `test-strategy.md`.
8
+ ec-workflow dispatches you when code IMPLEMENT finishes. Read-only `doc` / `analysis` / `report`
9
+ tasks auto-complete from IMPLEMENT and never enter REVIEW. You judge the code change set and
10
+ return a verdict that drives the next transition. Inputs: the changed files (from
11
+ execution.jsonl `result` records), `dev-spec.md`, `.easy-coding/RULES.md`, `test-strategy.md`.
11
12
 
12
13
  Communicate with the user in the user's language.
13
14
 
@@ -52,7 +52,7 @@ unless ec-workflow is explicitly invoked or the agent environment routes into it
52
52
  ### Create a task
53
53
 
54
54
  Create through the state API, never by hand-editing `task.json` or session files:
55
- `{{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py create-task --session-file <P> --task-id <MM-DD-short-name> --type <feature|bugfix|refactor|perf> --title "<one-line summary>" --agent <agent-id> --no-set-current`.
55
+ `{{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py create-task --session-file <P> --task-id <MM-DD-short-name> --type <feature|bugfix|refactor|perf|doc|analysis|report|workflow> --title "<one-line summary>" --agent <agent-id> --no-set-current`.
56
56
 
57
57
  If the user explicitly wants to start the task now, omit `--no-set-current`; otherwise leave
58
58
  the current workflow pointer untouched and tell them to run `{{skill_trigger}}ec-workflow`
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  name: ec-verification
3
- description: VERIFICATION-stage skill — the hard gate between REVIEW and archive. Use when ec-workflow enters VERIFICATION. Runs lint/typecheck/test in parallel, verifies coverage against test-strategy, gates on fresh evidence, then drives the user-acceptance and repair loop. Archive never happens without explicit user acceptance.
3
+ description: VERIFICATION-stage skill — the hard gate between implementation/review and archive. Use when ec-workflow enters VERIFICATION. Runs lint/typecheck/test in parallel, verifies coverage against test-strategy, gates on fresh evidence, then drives the user-acceptance and repair loop. Archive never happens without explicit user acceptance.
4
4
  ---
5
5
 
6
6
  # ec-verification — the hard gate
7
7
 
8
- ec-workflow dispatches you when REVIEW returns `accept`. You are the last gate before
9
- archive. Nothing passes on assumption.
8
+ ec-workflow dispatches you when REVIEW returns `accept` or the user explicitly skips REVIEW
9
+ after code IMPLEMENT. Read-only tasks auto-complete from IMPLEMENT and never enter this stage.
10
+ You are the last gate before code-task archive. Nothing passes on assumption.
10
11
 
11
12
  Communicate with the user in the user's language.
12
13
 
@@ -65,14 +66,16 @@ test manually. Their response routes:
65
66
 
66
67
  - **"accepted"** → request VERIFICATION -> MEMORY and present the standard boundary gate.
67
68
  - **"problem here"** → scope judgment against the dev-spec:
68
- - in scope → request VERIFICATION -> IMPLEMENT, then re-REVIEW re-VERIFICATION after
69
- the user confirms each stage edge.
69
+ - in scope → request VERIFICATION -> IMPLEMENT and wait for the user to confirm the return;
70
+ after repair, the IMPLEMENT completion choice decides whether REVIEW runs again or
71
+ VERIFICATION resumes directly.
70
72
  - out of scope → propose a new task (`spawned_from` = current task id); the current task
71
73
  may archive now (if already satisfactory) or stay suspended.
72
74
  - **"cancel"** → ec-task-close.
73
75
 
74
76
  Repair sizing: a trivial tweak is fixed and re-verified inside VERIFICATION; a logic/structure
75
- change formally returns to IMPLEMENT and re-walks REVIEW VERIFICATION.
77
+ change formally returns to IMPLEMENT. After repair, present the standard IMPLEMENT completion
78
+ choice again so the user may enter REVIEW or skip directly to VERIFICATION.
76
79
 
77
80
  ## 5. Archive entry (only after acceptance)
78
81
 
@@ -84,4 +87,5 @@ Acceptance does not mutate the stage directly. Hand control to ec-workflow to ca
84
87
 
85
88
  Only after confirmation may ec-workflow consume the pending edge and dispatch ec-memory.
86
89
  ec-memory owns both short-memory creation and the conditional long-memory gate inside the
87
- single MEMORY stage. It later requests MEMORY -> COMPLETE and waits for a separate confirmation.
90
+ single MEMORY stage. After memory processing completes, MEMORY -> COMPLETE advances
91
+ automatically without another confirmation or handoff gate.