@wwkit/harness 1.0.16 → 1.0.18

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.
Files changed (45) hide show
  1. package/README.md +6 -6
  2. package/agents/todo.md +119 -0
  3. package/agents/work-explore.md +50 -0
  4. package/agents/work-general.md +44 -0
  5. package/agents/work.md +55 -34
  6. package/commands/pytest.md +11 -0
  7. package/package.json +1 -1
  8. package/readme/development.md +1 -1
  9. package/skills/extract/SKILL.md +90 -28
  10. package/{agents/pyit.md → skills/pytest/SKILL.md} +223 -64
  11. package/skills/pytest-env-ensure/references/config.md +2 -2
  12. package/skills/pytest-sample/SKILL.md +3 -3
  13. package/skills/read-docs/references/superpowers/comparison.md +1 -1
  14. package/skills/read-docs/references/superpowers/index.md +1 -1
  15. package/skills/revise/SKILL.md +86 -25
  16. package/skills/todo-dispatch/SKILL.md +211 -0
  17. package/skills/todo-finalize/SKILL.md +238 -0
  18. package/skills/todo-plan/SKILL.md +174 -0
  19. package/skills/todo-recovery/SKILL.md +179 -0
  20. package/skills/todo-review/SKILL.md +259 -0
  21. package/skills/work-dispatch/SKILL.md +15 -2
  22. package/skills/work-dispatch/references/dispatch-prompt.md +10 -1
  23. package/skills/work-dispatch/references/explore-prompt.md +74 -0
  24. package/skills/work-dispatch/references/report-handling.md +31 -4
  25. package/skills/work-finalize/SKILL.md +2 -2
  26. package/skills/work-finalize/references/final-review.md +5 -3
  27. package/skills/work-finalize/references/handover.md +8 -0
  28. package/skills/work-ledger/SKILL.md +1 -1
  29. package/skills/work-ledger/references/bootstrap.md +12 -4
  30. package/skills/work-plan/SKILL.md +2 -2
  31. package/skills/work-plan/references/self-review.md +1 -1
  32. package/skills/work-plan/references/split-rules.md +1 -1
  33. package/skills/work-plan/references/task-fields.md +10 -10
  34. package/skills/work-recovery/SKILL.md +8 -8
  35. package/skills/work-recovery/references/budget.md +10 -11
  36. package/skills/work-recovery/references/rollback.md +4 -4
  37. package/skills/work-review/SKILL.md +2 -2
  38. package/skills/work-review/references/fix-loop.md +14 -9
  39. package/skills/work-review/references/reviewer-prompt.md +1 -1
  40. package/skills/work-review/references/verdict-handling.md +1 -1
  41. package/agents/extract.md +0 -26
  42. package/agents/pyut.md +0 -347
  43. package/agents/revise.md +0 -28
  44. package/commands/pyit.md +0 -6
  45. package/commands/pyut.md +0 -6
@@ -0,0 +1,74 @@
1
+ # 4.3 只读调研 prompt 模板
2
+
3
+ 使用 `task` 工具,`subagent_type` 取 `work-explore`(只读)。
4
+
5
+ - **所有 task 派发必须传 `background=true`**:subagent 异步运行,主 agent 不阻塞,完成时自动通知。这是防止主 agent 卡死的硬性约束。
6
+
7
+ ## 自包含原则
8
+
9
+ > 派发前,prompt 中所有占位符(`<BRIEF_FILE>`、`<REPORT_FILE>`、`<doc_dir>/...` 等)一律展开为绝对路径,subagent 直接可读,不再含任何待解引用符号。
10
+
11
+ subagent 看不到主 agent 历史,prompt 必须自包含。
12
+
13
+ ## prompt 结构
14
+
15
+ ```
16
+ 你是一个被派发的只读调研者。你的任务是执行 T<N>: <task name>
17
+
18
+ ## 任务详情
19
+
20
+ 读取你的任务 brief:<BRIEF_FILE>
21
+ 它包含完整任务文本:goal、files、accept(验收标准)、verify、约束。
22
+ brief 是你的唯一需求来源——不要假设 brief 之外的任何上下文。
23
+
24
+ ## 上下文
25
+
26
+ <场景设置:任务在项目中的位置、依赖、架构上下文>
27
+ <接口信息:前序任务产出的接口、类型、签名——从 plan.md 的 interfaces 字段提取>
28
+
29
+ ## 约束
30
+
31
+ - 只读:绝不提交、绝不改写工作树/index/HEAD
32
+ - 工作目录:<root_dir>
33
+
34
+ ## 执行边界(硬约束)
35
+
36
+ - **最多 30 次工具调用**:每调用一次工具(read/grep/glob/bash 等)计一次。到 30 次仍未完成必须停止并报告 ESCALATE。
37
+ - **禁止无限循环**:同一个文件不要读超过 3 次;同一个搜索不要连续运行超过 3 次。
38
+ - **进度自检**:每 10 次工具调用后,评估剩余工作是否还能在剩余调用次数内完成。不能则立即停止并报告 ESCALATE。
39
+ - **范围**:只调研 brief 指定范围,不发散。
40
+ - **遇到以下情况立即停止并报告**:
41
+ - 无法理解代码(已读 3 次仍不明确)→ BLOCKED
42
+ - 调研范围超出 brief 预期 → BLOCKED
43
+ - 工具调用次数即将耗尽且未完成 → ESCALATE
44
+
45
+ ## 你的工作
46
+
47
+ 1. 按 brief 执行调研/搜索/验证
48
+ 2. 收集 file:line 证据
49
+ 3. 对照 brief 中的 accept 验收标准逐条自检
50
+ 4. 报告
51
+
52
+ ## 报告格式
53
+
54
+ 将完整报告写入 <REPORT_FILE>:
55
+ - 调研发现
56
+ - 关键 file:line 证据
57
+ - accept 逐条对照结果
58
+ - 顾虑或问题
59
+
60
+ 然后用 ≤10 行回报(详情在报告文件中):
61
+ - Status: DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT | ESCALATE
62
+ - 一行结论摘要
63
+ - 关键 file:line 证据(≤5 条)
64
+ - 工具调用次数(如 "used 12/30")
65
+ - 报告文件路径
66
+ ```
67
+
68
+ ## 禁止
69
+
70
+ - 黏贴计划全文到 prompt(brief 文件是单一来源)
71
+ - 黏贴之前任务的摘要到后续任务的 prompt
72
+ - 让 subagent 读整个计划文件
73
+ - 在 prompt 中重复 brief 的 accept/verify(implementer 自己读 brief)
74
+ - 写代码、改文件、跑测试(只读场景)
@@ -2,6 +2,18 @@
2
2
 
3
3
  implementer 返回后,**立即写入 Ledger** 状态行,然后按 status 处理。
4
4
 
5
+ ## 任务后工作区验证(强制)
6
+
7
+ > **explore 豁免**:`work-explore`(只读)返回时**跳过工作区验证**——explore 不产生任何 git 变更,无需检查 `git status --porcelain`。仅 `work-general`(可写)返回时执行以下工作区验证。
8
+
9
+ implementer 返回后、按 status 处理前,执行工作区干净检查:
10
+
11
+ 1. 检查 `git status --porcelain`:
12
+ - **空(干净)**:继续按 status 处理
13
+ - **非空(脏)**:
14
+ - 如果脏文件全部在 implementer 的 writable 白名单内 → implementer 忘记提交 → **主 agent 自动提交**(`git add <writable files> && git commit -m "<task_id>: auto-commit uncommitted writable files"`),记 Ledger `T<N>: auto-committed uncommitted writable`,继续按 status 处理
15
+ - 如果脏文件有不在 writable 白名单内的 → **forbidden 文件被改** → 记 Critical finding,强制 `git checkout -- <file>` 恢复,记 Ledger `T<N>: reverted forbidden <file>`
16
+
5
17
  ## status 处理表
6
18
 
7
19
  | Status | Ledger 记录 | 动作 |
@@ -12,6 +24,19 @@ implementer 返回后,**立即写入 Ledger** 状态行,然后按 status 处
12
24
  | `BLOCKED` | `T<N>: blocked (<reason>)` | 评估:上下文问题→补充重派;推理不足→换更强模型;任务过大→拆分;计划错误→重规划(见「重规划」节) |
13
25
  | `ESCALATE` | `T<N>: escalate (<reason>)` | 停止该分支。如实向用户说明为何超出边界/需人工介入,不再重试。如果是工具调用耗尽,考虑拆分任务后重新派发 |
14
26
 
27
+ ## explore 专用处理路径
28
+
29
+ `work-explore`(只读)的返回处理与 `work-general` 不同——explore 不产生 git 变更,无需 BASE/HEAD 记录:
30
+
31
+ | explore 返回 | 处理 |
32
+ |-------------|------|
33
+ | `DONE` | 直接进入 review(review 范围 = 报告内容,无 diff)。review 标准:brief 的 accept 是否满足 + 证据是否充分(file:line) |
34
+ | `DONE_WITH_CONCERNS` | 读报告中的顾虑段,正确性/范围问题先处理,观察类问题记录后进入 review |
35
+ | `NEEDS_CONTEXT` / `BLOCKED` / `ESCALATE` | 同 status 处理表 |
36
+
37
+ - explore **不生成 review package**(无 BASE/HEAD diff),review 直接基于报告文件内容。
38
+ - explore **无 Commits 字段**属正常(只读,不提交),不按"无 status"处理。
39
+
15
40
  ## 异常返回处理
16
41
 
17
42
  subagent 返回不符合预期时按以下表处理:
@@ -22,6 +47,8 @@ subagent 返回不符合预期时按以下表处理:
22
47
  | 无 status 行 | 返回文本不含 Status 关键字 | 计 Ledger `T<N>: no status`,从 report 文件读取实际状态;report 文件也无 → 按 BLOCKED 处理 |
23
48
  | 报告文件未写入 | report 文件不存在或为空 | 记 Ledger `T<N>: report missing`,按 BLOCKED 处理 |
24
49
  | task 工具返回错误 | task 工具返回 state="error" | 记 Ledger `T<N>: task error (<error>)`,评估错误类型后决定重派或升级 |
50
+ | explore 返回脏工作区 | `git status --porcelain` 非空且 subagent_type=work-explore | 不应发生(只读权限)。若发生记 Critical finding,强制 `git checkout -- <file>` 恢复,记 Ledger `T<N>: explore dirty workspace (reverted)` |
51
+ | explore 无 Commits 字段 | 返回文本不含 Commits 关键字且 subagent_type=work-explore | 正常(只读不提交),不按"无 status"处理,直接按 status 行处理 |
25
52
 
26
53
  ## 重试上限
27
54
 
@@ -29,10 +56,10 @@ subagent 返回不符合预期时按以下表处理:
29
56
 
30
57
  ## background 派发与串行衔接
31
58
 
32
- 派发后记 Ledger → 做本地工作 → 收到通知 → 处理 → review close 后才派下一个 general;等待期间不派下一个。
59
+ 派发后记 Ledger → 做本地工作 → 收到通知 → 处理 → review close 后才派下一个 `work-general`;等待期间不派下一个。
33
60
 
34
61
  - 派发后:立即写 Ledger `T<N>: session=` 与状态行,不要等返回。
35
- - 等待期间:可做不依赖该任务产物的本地工作(如准备下一任务 brief、整理 Ledger),但**不派发下一个 `general`**。
62
+ - 等待期间:可做不依赖该任务产物的本地工作(如准备下一任务 brief、整理 Ledger),但**不派发下一个 `work-general`**。
36
63
  - 收到通知:按上方 status 处理表分派动作。
37
- - review close 后:下一任务的 `BASE` 自动等于本任务 `HEAD`,才派发下一个 `general`。
38
- - `explore`(只读)可并行且 ≤5 个/轮,不受串行约束限制。
64
+ - review close 后:下一任务的 `BASE` 自动等于本任务 `HEAD`,才派发下一个 `work-general`。
65
+ - `work-explore`(只读)可并行且 ≤5 个/轮,不受串行约束限制。
@@ -41,7 +41,7 @@ work agent 所有任务 review close 后、向用户交付前加载本技能,
41
41
 
42
42
  ### 阶段 2:Final Review
43
43
 
44
- 按 `references/final-review.md` 取 `MERGE_BASE` = Ledger 首行 `merge_base`,生成全分支 review package 到 `<doc_dir>/final-review-<merge_base7>..<head7>.diff`;派发 final reviewer(`general`,唯一写操作 `<doc_dir>/final-review.md`,≤30 次工具调用,不重跑测试)让其 triage parked/minor 项;有 findings → 一次 fix dispatch + 一次 scoped re-review(`FIX_BASE` = `final_review_head`);残留 load-bearing → 报告用户。
44
+ 按 `references/final-review.md` 取 `MERGE_BASE` = Ledger 首行 `merge_base`,生成全分支 review package 到 `<doc_dir>/final-review-<merge_base7>..<head7>.diff`;派发 final reviewer(`work-general`,唯一写操作 `<doc_dir>/final-review.md`,≤30 次工具调用,不重跑测试)让其 triage parked/minor 项;有 findings → 一次 fix dispatch + 一次 scoped re-review(`FIX_BASE` = `final_review_head`);残留 load-bearing → 报告用户。
45
45
 
46
46
  ### 阶段 3:最终 target 验收
47
47
 
@@ -66,7 +66,7 @@ work agent 所有任务 review close 后、向用户交付前加载本技能,
66
66
  - final reviewer 最多 30 次工具调用,到 30 次仍未完成必须停止并报告未完成。
67
67
  - final reviewer 写操作白名单 = 仅 `<doc_dir>/final-review.md`:不修改源码、不 add、不 commit、不改工作树/index/HEAD/分支。
68
68
  - final reviewer 不重跑测试:信任 Ledger 记录的测试结果;整体验收由主 agent 在第八步执行。
69
- - 有 findings 时只做**一次** fix dispatch(不是 per-finding)+ **一次** scoped re-review;final fix 一律派新 `general`(findings 可能跨多任务,无原 session 可复用)。
69
+ - 有 findings 时只做**一次** fix dispatch(不是 per-finding)+ **一次** scoped re-review;final fix 一律派新 `work-general`(findings 可能跨多任务,无原 session 可复用)。
70
70
  - 派发 final fix 前必须写 Ledger 首段 `final_review_head=<sha>`;scoped re-review 的 `FIX_BASE` 取该值。
71
71
  - 最终 target 验收运行**强制**:任务级 accept 通过并不代表 target 整体可用;退出判据三者缺一不可(所有任务 done + review 通过 + 整体验收通过)。
72
72
  - 本 agent 不 push / merge;交付即当前分支上的提交串,是否推送到远端由用户决定。
@@ -5,14 +5,16 @@
5
5
  ## 流程
6
6
 
7
7
  1. 定义 `MERGE_BASE`:取 Ledger 首行元数据中的 `merge_base`(取值规则见「起始检查」)。生成全分支 review package(`${MERGE_BASE}..HEAD`)到 `<doc_dir>/final-review-<merge_base7>..<head7>.diff`
8
- 2. 派发 final reviewer(`subagent_type` 取 `general`;唯一写操作是 `<doc_dir>/final-review.md`,不得改源码/add/commit),指向 Ledger 的 parked/minor 项让它 triage
8
+ 2. 派发 final reviewer(`subagent_type` 取 `work-general`;唯一写操作是 `<doc_dir>/final-review.md`,不得改源码/add/commit),指向 Ledger 的 parked/minor 项让它 triage
9
9
  3. final reviewer 写入 `<doc_dir>/final-review.md`
10
10
  4. 有 findings → **一次** fix dispatch(不是 per-finding)+ **一次** scoped re-review:
11
- - **final fix 一律派新 `general`**(findings 可能跨多任务,无原 session 可复用)。
11
+ - **final fix 一律派新 `work-general`**(findings 可能跨多任务,无原 session 可复用)。
12
+ - final fix implementer 工具调用上限 ≤20(同 fix 标准,非 work-general 默认的 50)。
12
13
  - 派发前写 Ledger 首段 `final_review_head=<sha>`(= 上次 final review 时的 HEAD)。
13
14
  - fix report 写入 `<doc_dir>/final-fix-report.md`(不覆盖 final-review.md)。
15
+ - **final fix 返回后执行工作区验证**(同 work-dispatch 的任务后工作区验证):检查 `git status --porcelain`,脏文件在 fix 的 writable 内 → 主 agent 自动提交;不在 writable 内 → `git checkout` 恢复 + Critical finding。
14
16
  - fix 后 scoped re-review 的 `FIX_BASE` 取该 `final_review_head` 值,HEAD = 当前 HEAD,diff 写入 `<doc_dir>/final-fix-review-<final_review_head7>..<head7>.diff`。
15
- 5. 招留 load-bearing findings → 报告用户
17
+ 5. 残留 load-bearing findings → 报告用户
16
18
 
17
19
  ## final reviewer prompt
18
20
 
@@ -6,6 +6,14 @@
6
6
 
7
7
  **交付即当前分支上的这串提交;本 agent 不 push / merge(那是 worktree 外的副作用),是否推送到远端由用户自行决定。**
8
8
 
9
+ ## 3.1 残留改动自动提交
10
+
11
+ target 交付后检查 `git status --porcelain`,若有残留 tracked 改动,自动执行 `git add -A && git commit -m "[auto] target 交付后残留提交"`。
12
+
13
+ - 保证下一个 target 起始时工作区干净,无需用户确认。
14
+ - `.webwork/` 产物目录已被 `.gitignore` 忽略,不触发脏检查。
15
+ - 所有改动均为计划内、review 过的改动,自动 commit 即可。
16
+
9
17
  ## 4. 裁决清单(显式列出)
10
18
 
11
19
  向用户输出结果摘要:交付物 + **本运行全部裁决**(parked / ruled / blocked / escalate / reverted / interrupted / replan,按发生顺序,每条附理由)。
@@ -44,7 +44,7 @@ work agent 进入第三步「产物目录与 Ledger」时(创建运行时)
44
44
 
45
45
  ### 阶段 3:起始检查(仅此一次)
46
46
 
47
- 按 `references/bootstrap.md`:确认在 Git 仓库内;检查工作树干净(非空则 `git stash push -u` 并把脏文件清单记入 Ledger,此为人工确认点之一);记录运行元数据 `branch`/`initial_base`/`merge_base` 并写入 Ledger 首行。
47
+ 按 `references/bootstrap.md`:确认在 Git 仓库内;检查工作树干净(非空则**停止,不自动 stash**,向用户输出脏文件清单,要求用户先 commit 或 stash,用户确认工作树干净后才继续,此为人工确认点之一);记录运行元数据 `branch`/`initial_base`/`merge_base` 并写入 Ledger 首行。
48
48
 
49
49
  ### 阶段 4:Ledger 读写维护
50
50
 
@@ -11,12 +11,21 @@
11
11
 
12
12
  **创建产物目录**:创建 `<root_dir>/.webwork/harness/work/<session_id>/` 目录,并写入 `<root_dir>/.webwork/harness/work/.gitignore`(内容为 `*` + `!.gitignore`:忽略所有中间产物,但保留 `.gitignore` 自身)。归档目录 `<root_dir>/.webwork/harness/archive/` **不写** `.gitignore`——保留审计产物,可纳入版本控制。
13
13
 
14
- ## 起始检查(仅一次,创建产物目录时执行,L236-245)
14
+ ## 起始检查(每个 target 开始时执行)
15
15
 
16
- 派发任何 subagent 前,先确认工作树安全并记录运行元数据:
16
+ 派发任何 subagent 前,先确认工作树安全并记录运行元数据。区分**首次 target**(编排启动后的第一个 target)与**非首次 target**(后续 target 切换):
17
17
 
18
18
  1. **在 Git 仓库内**:非 Git 仓 → 报告用户并停止。
19
- 2. **工作树是否干净**(`git status --porcelain`):非空 → 默认 `git stash push -u` 后继续,并把 existing 文件清单记录到 Ledger。**这是人工确认点之一(另一处在范围闸门)**:若用户在场可询问 stash/保留,但全自动运行不因询问卡住。
19
+ 2. **工作树是否干净**(`git status --porcelain`)——按首次/非首次分别处理:
20
+
21
+ **首次 target**:
22
+ - **空(干净)**:继续。
23
+ - **非空(脏)**:**停止,不自动 stash**。向用户输出脏文件清单,要求用户先 commit 或 stash。这是人工确认点——用户确认工作树干净后才继续。在 `--auto --pure` 模式下(无交互用户),脏工作树直接报错终止并输出脏文件清单,不继续派发。
24
+ - 清理后再次检查 `git status --porcelain`,如果仍非空则继续等待用户确认。
25
+
26
+ **非首次 target**(上一步 handover 已自动 commit 残留改动,工作区应已干净):
27
+ - **空(干净)**:跳过 stash/用户确认流程,直接进入记录元数据。
28
+ - **非空(脏)**:**不应发生**——报错终止并输出脏文件清单,不继续派发。不等待用户确认,不自动 stash。
20
29
  3. **记录运行元数据**(写入 Ledger 首行,字段语义如下):
21
30
  - `branch` = 当前分支名
22
31
  - `initial_base` = 当前 HEAD
@@ -24,5 +33,4 @@
24
33
 
25
34
  ## 后续约束(L247-249)
26
35
 
27
- - **脏文件不得被 implementer 一起提交**:每个任务 brief 的 `forbidden` 中追加「不得 add/commit 任何未在 `writable` 白名单中的文件」。
28
36
  - 回滚锚点:`initial_base` 是本运行所有提交的回滚参照(见「中断与回滚」)。
@@ -3,7 +3,7 @@ name: work-plan
3
3
  description: |
4
4
  [work 专属 runbook] 仅供 work agent 通过 skill 工具显式调用(name=work-plan),其他 agent / 普通对话禁止触发
5
5
  规划阶段技能:按 1.1 任务拆分把 target 拆成 ≤10 分钟、可布尔验收的任务,按 2.1 填写 11 字段任务计划,
6
- 按 2.2 写入 plan.md,按 2.3 自审(范围闸门 + 8 项),核对 2.4 并发硬规则(explore ≤5 并行 / general 串行 / BASE=上一 HEAD)。
6
+ 按 2.2 写入 plan.md,按 2.3 自审(范围闸门 + 8 项),核对 2.4 并发硬规则(work-explore ≤5 并行 / work-general 串行 / BASE=上一 HEAD)。
7
7
  适用:work agent 第一步规划到派发前的「规划 → 落单」环节。
8
8
  不适用:执行/派发/审查/产物目录与 Ledger(用 work-ledger);非 work 流程的普通规划。
9
9
  license: MIT
@@ -66,7 +66,7 @@ work agent 完成第一步解析用户输入(`target`/`root_dir`/`constraints`
66
66
 
67
67
  - 拆分第一约束:每个任务 ≤10 分钟可完成,且能独立写出可布尔判定的 `accept`;超预算必须继续拆,宁可多小任务串行。
68
68
  - 反模式禁止:按 TDD 步骤拆 / 按文件数硬拆 / 一个任务塞多个不相关目标。
69
- - 并发硬规则:`explore`(只读)可并行且 ≤5 个/轮;`general`(可写)必须串行,须在上一任务 review close 后才派发下一个;下一个 `general` 的 `BASE` 自动等于上一任务 `HEAD`。
69
+ - 并发硬规则:`work-explore`(只读)可并行且 ≤5 个/轮;`work-general`(可写)必须串行,须在上一任务 review close 后才派发下一个;下一个 `work-general` 的 `BASE` 自动等于上一任务 `HEAD`。
70
70
  - 范围闸门:任务数 >20 或 `target` 无法在 ≤20 个独立验收单元内覆盖 → 暂停规划,向用户确认拆分范围。
71
71
  - 本技能不读写代码、不执行验证命令,只产出计划与 plan.md。
72
72
 
@@ -12,7 +12,7 @@
12
12
  2. **接口一致性**:跨任务的类型名、函数签名、属性名是否匹配?T1 Produces 的 `clearLayers()` 在 T3 中是否也叫 `clearLayers()` 而非 `clearFullLayers()`?
13
13
  3. **占位符扫描**:有无 "TBD"、"加错误处理"、"类似 T1"、"按需实现" 等模糊描述?有则补具体。
14
14
  4. **依赖完整性**:`depends` 引用的 `task_id` 是否存在?有无循环依赖?有依赖的任务是否串行?
15
- 5. **文件所有权分区**:可写任务(`general`)强制串行,故无并发写冲突;只读任务(`explore`)不产生文件变更。此条仅用于校验 `files`/`writable` 不落在 `constraints` 禁改范围之内。
15
+ 5. **文件所有权分区**:可写任务(`work-general`)强制串行,故无并发写冲突;只读任务(`work-explore`)不产生文件变更。此条仅用于校验 `files`/`writable` 不落在 `constraints` 禁改范围之内。
16
16
  6. **路径合规**:`writable`/`forbidden`/`files` 都落在 `root_dir` 内且不与 `constraints` 冲突。
17
17
  7. **验收可判定**:每条 `accept` 是否可布尔判定?`verify` 命令是否具体可执行?
18
18
  8. **工时约束**:每个任务的 `budget` 是否 ≤10 分钟?超过的必须继续拆。
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 拆分第一约束
6
6
 
7
- 每个任务必须在 10 分钟内可完成,且能独立写出可布尔判定的 `accept`。这是 subagent 的硬预算(implementer 最多 50 次工具调用);超过预算的任务必须继续拆,直到每个子任务都在预算内。宁可拆成多个小任务串行,也不要留 1 个超出预算的任务。若平台支持 `maxSteps`,用它作为工具调用次数的硬兜底。
7
+ 每个任务必须在 10 分钟内可完成,且能独立写出可布尔判定的 `accept`。这是 subagent 的硬预算(implementer 最多 50 次工具调用);超过预算的任务必须继续拆,直到每个子任务都在预算内。宁可拆成多个小任务串行,也不要留 1 个超出预算的任务。工具调用次数通过 prompt 软约束控制。
8
8
 
9
9
  ## 拆分维度
10
10
 
@@ -12,7 +12,7 @@ interfaces: Consumes: funcA(x: string) → number(来自 T1,T2 需调用
12
12
  (无跨任务接口依赖时填 无)
13
13
  accept: 验收标准,≤3 条,每条可布尔判定(如 "Foo.bar() 返回 true"、"npm test 通过")
14
14
  verify: 验证命令(如 `npm test -- src/foo.test.ts`;无测试时填 `无`)
15
- agent: explore(只读调研)| general(执行改动/多步)— 选择规则见下
15
+ agent: work-explore(只读调研)| work-general(执行改动/多步)— 选择规则见下
16
16
  writable: 可写文件白名单(为空 ⇒ 该任务只读;路径相对 root_dir;须与 files 的 Create/Modify 一致)
17
17
  forbidden: 禁改文件清单(至少含 constraints 全部内容)
18
18
  depends: 依赖任务:T1, T3(必须先完成)| 无
@@ -23,22 +23,22 @@ budget: 预计 ≤10 分钟
23
23
 
24
24
  | agent 类型 | 适用场景 | 工具权限 |
25
25
  |-----------|---------|---------|
26
- | `explore` | 只读调研:搜索代码、读取文件、理解结构、验证假设 | read/grep/glob(只读) |
27
- | `general` | 可写改动:编辑代码、执行命令、多步实现、写测试 | 全部工具 |
26
+ | `work-explore` | 只读调研:搜索代码、读取文件、理解结构、验证假设 | read/grep/glob(只读) |
27
+ | `work-general` | 可写改动:编辑代码、执行命令、多步实现、写测试 | 全部工具 |
28
28
 
29
29
  **选择规则**:
30
- - 任务涉及任何文件创建/修改/删除 → `general`
31
- - 任务只读不改(调研、审查、验证) → `explore`
32
- - 不确定时按 `general`(权限更大不会卡住)
30
+ - 任务涉及任何文件创建/修改/删除 → `work-general`
31
+ - 任务只读不改(调研、审查、验证) → `work-explore`
32
+ - 不确定时按 `work-general`(权限更大不会卡住)
33
33
 
34
- **注意**:审查类 subagent 取 `general`(需写审查文件),以 prompt 强约束「只读源码 + 写白名单仅审查文件」;审查处于任务串行链上,天然满足串行。
34
+ **注意**:审查类 subagent 取 `work-general`(需写审查文件),以 prompt 强约束「只读源码 + 写白名单仅审查文件」;审查处于任务串行链上,天然满足串行。
35
35
 
36
36
  ## 2.4 并发硬性规则(提取自 L193-200)
37
37
 
38
38
  - **并发分型(Git 隔离的核心约束)**:
39
- - `explore`(只读)**绝不提交、绝不改写工作树/index/HEAD**,只做搜索/读取/理解;可并行,**≤ 5 个/轮**。
40
- - `general`(可写)**必须串行**,同一轮最多 1 个在跑,且须在上一任务的 review close 后才派发下一个;下一个 general 的 `BASE` 自动等于上一任务的 `HEAD`,保证 `BASE..HEAD` 恰好是本任务自己的改动。
41
- - 凡任务可能产生任何文件或 git 变更,一律 `general`(从而落入串行)。
39
+ - `work-explore`(只读)**绝不提交、绝不改写工作树/index/HEAD**,只做搜索/读取/理解;可并行,**≤ 5 个/轮**。
40
+ - `work-general`(可写)**必须串行**,同一轮最多 1 个在跑,且须在上一任务的 review close 后才派发下一个;下一个 work-general 的 `BASE` 自动等于上一任务的 `HEAD`,保证 `BASE..HEAD` 恰好是本任务自己的改动。
41
+ - 凡任务可能产生任何文件或 git 变更,一律 `work-general`(从而落入串行)。
42
42
  - 串行还是并行由 `depends` 字段 + agent 类型共同决定:有依赖必须串行;无依赖但写操作同样串行;仅只读任务可并行。
43
43
  - 一个 subagent 对应一个可独立验收的任务,不把多个不相关目标塞给一个 subagent。
44
44
  - 状态如需跨轮保留,把状态写进 Ledger/文件,不要依赖子代理记忆。
@@ -2,7 +2,7 @@
2
2
  name: work-recovery
3
3
  description: |
4
4
  [work 专属 runbook] 仅供 work agent 通过 skill 工具显式调用(name=work-recovery),其他 agent / 普通对话禁止触发
5
- 恢复与护栏技能:覆盖重规划(触发条件 3 种、规则=复用 session_id/增量调整/不重做已完成、上限 3 轮超限升级用户)+ 退出条件(target 验收/重规划≤3/阻塞/预算超限/ESCALATE)+ 预算与超时(单任务超时=平台 timeout 优先/否则 prompt 软上限+maxSteps 硬兜底、等待纪律有界等待不静默阻塞、总预算护栏 4 项≤20 任务/≤30 分钟/并行≤5)+ 中断与回滚(用户中断保留现场、回滚限本任务 BASE..HEAD/工作树脏禁--hard/forbidden 文件强制 checkout/绝不 reset 早于 initial_base)+ 防失控护栏 5 条。
5
+ 恢复与护栏技能:覆盖重规划(触发条件 3 种、规则=复用 session_id/增量调整/不重做已完成、上限 3 轮超限升级用户)+ 退出条件(target 验收/重规划≤3/阻塞/预算超限/ESCALATE)+ 预算与超时(单任务超时=prompt 软上限硬兜底、等待纪律有界等待不静默阻塞、总预算护栏 3 项≤20 任务/≤30 分钟/并行≤5)+ 中断与回滚(用户中断保留现场、回滚限本任务 BASE..HEAD/工作树脏禁--hard/forbidden 文件强制 checkout/绝不 reset 早于 initial_base)+ 防失控护栏 5 条。
6
6
  适用:work agent 运行期遇到计划级失败 / 超时 / 中断 / 需回滚 / 防失控检查时加载。
7
7
  不适用:单任务 review fix(用 work-review);最终交付(用 work-finalize);非 work 流程的普通恢复。
8
8
  license: MIT
@@ -42,14 +42,14 @@ work agent 运行期遇到以下任一情况时加载本技能对应阶段:
42
42
  用 `read` 工具按触发原因加载本技能 `references/` 下对应文件(相对路径基于本 skill 目录):
43
43
 
44
44
  - `references/replan.md` → 重规划(触发条件 3 种、规则=复用 session_id/增量调整/不重做已完成、上限 3 轮超限升级用户)
45
- - `references/budget.md` → 退出条件(5 种)+ 预算与超时(单任务超时 / 等待纪律 / 总预算护栏 4 项)
45
+ - `references/budget.md` → 退出条件(5 种)+ 预算与超时(单任务超时 / 等待纪律 / 总预算护栏 3 项)
46
46
  - `references/rollback.md` → 中断与回滚(用户中断 / 回滚规则 / forbidden 强制 checkout)+ 防失控护栏 5 条
47
47
 
48
48
  ### 阶段 2:按触发分支执行
49
49
 
50
50
  - **重规划**:按 `references/replan.md` 复用同一 `session_id`/`doc_dir`/Ledger,只重走第二步对未完成目标重新拆分并更新 `plan.md`,已完成任务保留标记 done 不重派发;Ledger 记 `replan round <R>/3`;最多 3 轮,超限升级用户。
51
51
  - **退出判定**:按 `references/budget.md` 退出条件 5 种逐项检查,命中即停止派发并如实报告。
52
- - **预算与超时**:派发 subagent 时优先用平台 `timeout`/`cancel`/后台执行;不支持则用 prompt 软上限(implementer ≤50 / fix ≤20 / reviewer ≤15)+ `maxSteps` 硬兜底;等待期有界等待不静默阻塞;总预算护栏 4 项超限即停派发记 Ledger 报告用户。
52
+ - **预算与超时**:派发 subagent 时用 prompt 软上限(implementer ≤50 / fix ≤20 / reviewer ≤15)硬兜底;等待期有界等待不静默阻塞;总预算护栏 3 项超限即停派发记 Ledger 报告用户。
53
53
  - **中断与回滚**:用户中断立即停派发 + cancel 在途 + 记 Ledger + 保留现场;回滚限本任务 `BASE..HEAD`(BASE 从 Ledger `T<N>: base=` 读取),工作树脏禁 `--hard` 改用 `git revert` 或 `git reset --soft` + 手动 checkout,forbidden 文件强制 `git checkout -- <file>`,绝不 reset 早于 `initial_base`。
54
54
  - **防失控自检**:按 `references/rollback.md` 护栏 5 条周期自检(并发分型 / task 预算 / scoped re-review / Round 5 后裁决 / 外部信息用 general+webfetch)。
55
55
 
@@ -63,18 +63,18 @@ work agent 运行期遇到以下任一情况时加载本技能对应阶段:
63
63
 
64
64
  - 重规划复用同一 `session_id`/`doc_dir`/Ledger,是针对失败与未完成部分的增量调整,不重做已完成任务;最多 3 轮,超限升级用户不再自动继续。
65
65
  - 退出条件 5 种:target 验收通过 / 重规划 ≤3 轮 / 阻塞无法解除(含与 `constraints` 不可调和)/ 总预算超限 / subagent ESCALATE 且无法通过拆分任务/换模型解决。
66
- - 单任务超时:平台 `timeout`/`cancel` 优先(硬兜底),否则 prompt 软上限 + `maxSteps` 硬兜底叠加;超时立即记 Ledger `T<N>: timeout` 标 BLOCKED/ESCALATE,不无限同步等待。
67
- - 等待纪律:有界等待,不轮询短超时也不长时间静默;间隔(如 5 分钟)列一次在途 subagent 追查「已结束但仍未上报」的 child。
68
- - 总预算护栏 4 项:总任务数 ≤20 / 总运行时长 ≤30 分钟 / 总工具调用或 token 平台可观测时设上限 / 最大并行 explore ≤5;每项超限如实写进 Ledger 并报告,不静默续跑。
66
+ - 单任务超时:prompt 软上限(implementer ≤50 / fix ≤20 / reviewer ≤15)硬兜底;超时立即记 Ledger `T<N>: timeout` 标 BLOCKED/ESCALATE,不无限同步等待。
67
+ - 等待纪律:background 模式下主 agent 不阻塞,无需轮询;派发后继续做本地工作(写 Ledger、准备下一个 review package、读已返回的报告),收到 subagent 完成通知后处理返回。如果 subagent 异常长时间未返回(超过预算时间的 2 倍),记 Ledger `T<N>: timeout` 并标 BLOCKED/ESCALATE。
68
+ - 总预算护栏 3 项:总任务数 ≤20 / 总运行时长 ≤30 分钟 / 最大并行 work-explore ≤5;每项超限如实写进 Ledger 并报告,不静默续跑。
69
69
  - 用户中断保留现场,不删除产物目录。
70
70
  - 回滚仅限本任务 `BASE..HEAD`;工作树脏禁 `--hard`;forbidden 文件强制 `git checkout -- <file>` 恢复;**绝不 `reset` 到早于 `initial_base`**。
71
- - 防失控护栏 5 条:只读 explore 可并行 ≤5 / 可写 general 必须串行;每个 task ≤10 分钟,失败先换模型/拆任务再重规划;每轮 fix 后必须 scoped re-review;Round 5 后才裁决,每条裁决都是 Ledger 条目禁止静默丢弃;需要外部信息用 `general` + `webfetch` 调研不嵌套再派发。
71
+ - 防失控护栏 5 条:只读 work-explore 可并行 ≤5 / 可写 work-general 必须串行;每个 task ≤10 分钟,失败先换模型/拆任务再重规划;每轮 fix 后必须 scoped re-review;Round 5 后才裁决,每条裁决都是 Ledger 条目禁止静默丢弃;需要外部信息用 `work-general` + `webfetch` 调研不嵌套再派发。
72
72
 
73
73
  ## 资源目录
74
74
 
75
75
  ```
76
76
  references/
77
77
  ├── replan.md # 重规划(触发 3 种/规则/上限 3 轮)
78
- ├── budget.md # 退出条件 5 种 + 预算与超时(单任务超时/等待纪律/总预算护栏 4 项)
78
+ ├── budget.md # 退出条件 5 种 + 预算与超时(单任务超时/等待纪律/总预算护栏 3 项)
79
79
  └── rollback.md # 中断与回滚(用户中断/回滚规则/forbidden 强制 checkout)+ 防失控护栏 5 条
80
80
  ```
@@ -1,7 +1,7 @@
1
1
  # 退出条件
2
2
 
3
3
  - 对照 `target` 验收标准,所有任务 `done`、review 通过 **且整体验收通过**
4
- - 重规划 ≤3 轮(整体步骤用平台最大步数配置兜底,如 `maxSteps`)
4
+ - 重规划 ≤3 轮
5
5
  - 阻塞无法解除(含与 `constraints` 不可调和)
6
6
  - 总预算超限(见「预算与超时」)
7
7
  - subagent 返回 ESCALATE 且无法通过拆分任务/换模型解决 → 如实向用户报告
@@ -10,21 +10,21 @@
10
10
 
11
11
  ## 单任务超时(技术强制优先)
12
12
 
13
- - 派发 subagent 时,若 `task` 工具支持 `timeout` / `cancel` / 后台执行,必须显式带超时;超时后主 agent 立即记 Ledger `T<N>: timeout` 并标记 `BLOCKED`/`ESCALATE`,**不无限同步等待**(避免主 agent TUI 卡死)。
14
- - 若平台不支持超时/取消,仍以 prompt 级硬约束(implementer ≤50 / fix ≤20 / reviewer ≤15 次工具调用)为软上限,并在派发后主动推进,不静默阻塞。
15
- - 二者关系:prompt 中的工具调用上限是**软约束**,平台能力(timeout / maxSteps)是**硬兜底**,叠加使用。
13
+ - 所有 `task` 派发**必须**在 `task` 调用中显式传 `background=true` 参数——这是 agent 行为约束。环境变量 `OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true` 由 opm harness 自动注入,使 `background=true` 参数生效。agent 只需在 task 调用中传 `background=true`,环境变量由 opm harness 自动注入。
14
+ - background 模式下主 agent 不阻塞,subagent 异步运行,完成时自动通知注入结果。
15
+ - prompt 中的工具调用上限(implementer ≤50 / work-explore ≤30 / fix ≤20 / reviewer ≤15 / re-reviewer ≤10 / final reviewer ≤30)是**软约束**,是唯一的行为限制——没有平台级硬超时兜底。
16
+ - 如果 subagent 长时间未返回(超过预期时间),主 agent 可继续做本地工作,不阻塞。
16
17
 
17
18
  ## subagent 强制退出配置(实施细节)
18
19
 
19
- 1. **`steps` 配置位置**:应配在 **subagent 定义**上(`agent.general.steps=50` / `agent.explore.steps=30`),不是 work agent 上——"卡住"的是 subagent(foreground 下 work 被 block),steps 达限强制结束的是被配置方。work 自身可加 `steps`(如 200)防 runaway,但次要。
20
- 2. **background 模式启用**:在 opencode 配置中设 `OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true`,task 工具的 `background=true` 参数才生效——subagent 异步运行,主 agent 不 block,完成时自动通知注入结果。
21
- 3. **escape 中断语义**:TUI `session_interrupt`(escape)中断的是**整个 session**(含所有子 session),不是只中断子 session。中断后可通过 `git log` + Ledger 恢复续跑。
20
+ 1. **background 模式启用**:`OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true` 已由 opm harness 默认注入,task 工具的 `background=true` 参数直接生效——subagent 异步运行,主 agent 不 block,完成时自动通知注入结果。环境变量由 opm harness 自动注入,agent 只需在 task 调用中传 `background=true`。
21
+ 2. **escape 中断语义**:TUI `session_interrupt`(escape)中断的是**整个 session**(含所有子 session),不是只中断子 session。中断后可通过 `git log` + Ledger 恢复续跑。
22
+ 3. **subagent_depth**:限制嵌套深度(默认 1),防止 subagent 无限递归派发——限制的是嵌套层级,不是工具调用次数。
22
23
 
23
24
  ## 等待纪律(不静默阻塞)
24
25
 
25
- - 派发后不停摆:等待期间继续做本地工作(写 Ledger、准备下一个 review package、读已返回的报告)。
26
- - 空闲等待用**有界等待**:不轮询短超时,也不长时间静默;间隔一段(如 5 分钟,若平台允许)列一次在途 subagent,追查「已结束但仍未上报」的——child 的结果可能丢失,而 timeout 抓不到这种「结果丢了」的失败。
27
- - 发现 child 卡死/丢失:按单任务超时处理,记 Ledger `T<N>: timeout` 并标 BLOCKED/ESCALATE。
26
+ - background 模式下主 agent 不阻塞,无需轮询。派发后继续做本地工作(写 Ledger、准备下一个 review package、读已返回的报告),收到 subagent 完成通知后处理返回。
27
+ - 如果 subagent 异常长时间未返回(超过预算时间的 2 倍),记 Ledger `T<N>: timeout` 并标 BLOCKED/ESCALATE。
28
28
 
29
29
  ## 总预算护栏(防失控)
30
30
 
@@ -34,7 +34,6 @@
34
34
  |--------|--------|---------|
35
35
  | 总任务数 | ≤ 20 | 规划期由 2.3 范围闸门拦截;运行时超限停止拆分,评估重规划或升级用户 |
36
36
  | 总运行时长 | ≤ 30 分钟 | 停止派发,记 Ledger,报告用户 |
37
- | 总工具调用 / token | 平台可观测时设上限 | 同上 |
38
37
  | 最大并行 explore | ≤ 5(见 2.4) | 等待,不超额派发 |
39
38
 
40
39
  每项超限都**如实写进 Ledger** 并报告,不静默续跑。
@@ -2,19 +2,19 @@
2
2
 
3
3
  ## 用户中断
4
4
 
5
- - 收到用户中断后:立即停止派发新 subagent;对在途 subagent 发送 cancel(若平台支持 `cancel`);记 Ledger `T<N>: interrupted by user (commits <base7>..<head7>, uncommitted: <files>)`。
5
+ - 收到用户中断后:立即停止派发新 subagent;对在途 subagent 发送 cancel;记 Ledger `T<N>: interrupted by user (commits <base7>..<head7>, uncommitted: <files>)`。
6
6
  - **保留现场**:不删除产物目录,便于续跑或复盘。
7
7
 
8
8
  ## 回滚
9
9
 
10
- - implementer 提交有误:回滚限定在本任务 `BASE..HEAD`(BASE 从 Ledger `T<N>: base=` 读取)。**若工作树干净**可用 `git reset --hard <BASE>`;**若工作树脏**(含起始检查中用户选择保留的脏文件),禁止 `--hard`(会连同脏文件一起丢弃),改用 `git revert <task commits>` 或 `git reset --soft <BASE>` + 手动 checkout 目标文件。回滚后在 Ledger 记 `T<N>: reverted to <sha>`。
10
+ - implementer 提交有误:回滚限定在本任务 `BASE..HEAD`(BASE 从 Ledger `T<N>: base=` 读取)。起始检查已保证工作树干净(用户已 commit/stash),不存在起始脏文件。**若工作树干净**可用 `git reset --hard <BASE>`;**若工作树脏**(任务执行期间产生),禁止 `--hard`(会连同脏文件一起丢弃),改用 `git revert <task commits>` 或 `git reset --soft <BASE>` + 手动 checkout 目标文件。回滚后在 Ledger 记 `T<N>: reverted to <sha>`。
11
11
  - **forbidden 文件被改**:reviewer 检测到 `writable` 白名单外的变更(含 `constraints` 禁改文件)→ 记 Critical finding,强制 `git checkout -- <file>` 恢复,并在 Ledger 记 `T<N>: reverted forbidden <file>`。
12
12
  - 回滚仅限本运行产生的提交,**绝不 `reset` 到早于 `initial_base`**。
13
13
 
14
14
  # 防失控护栏
15
15
 
16
- 1. 并发分型:只读 `explore` 可并行 ≤5;可写 `general` 必须串行(同一轮最多 1 个),杜绝并发写冲突与 review diff 污染。
16
+ 1. 并发分型:只读 `work-explore` 可并行 ≤5;可写 `work-general` 必须串行(同一轮最多 1 个),杜绝并发写冲突与 review diff 污染。
17
17
  2. 每个 task 预算 ≤10 分钟;worker 失败先换模型/拆任务重试,仍失败则重规划失败部分(见「重规划」)。
18
18
  3. 每轮 fix 后必须 scoped re-review,未审查的 fix 是回归的来源。
19
19
  4. Round 5 后才裁决,每条裁决都是 Ledger 条目,禁止静默丢弃。
20
- 5. 需要外部信息时用 `general` + `webfetch` 调研,不在子代理里嵌套再派发。
20
+ 5. 需要外部信息时用 `work-general` + `webfetch` 调研,不在子代理里嵌套再派发。
@@ -52,7 +52,7 @@ work agent 完成第四步派发、implementer 返回 `DONE` 或 `DONE_WITH_CONC
52
52
 
53
53
  ### 阶段 3:派发 reviewer
54
54
 
55
- 按 `references/reviewer-prompt.md` 渲染两阶段审查 prompt(Spec Compliance + Code Quality),用 `task` 工具派发,`subagent_type` 取 `general`(需写入 REVIEW_FILE)。reviewer 写入 `<doc_dir>/task-<N>-review.md`。
55
+ 按 `references/reviewer-prompt.md` 渲染两阶段审查 prompt(Spec Compliance + Code Quality),用 `task` 工具派发,`subagent_type` 取 `work-general`(需写入 REVIEW_FILE)。reviewer 写入 `<doc_dir>/task-<N>-review.md`。
56
56
 
57
57
  ### 阶段 4:处理结论
58
58
 
@@ -80,7 +80,7 @@ work agent 完成第四步派发、implementer 返回 `DONE` 或 `DONE_WITH_CONC
80
80
  - reviewer 不重跑测试:信任 Ledger 记录的测试结果。
81
81
  - fix prompt 引用 review 文件路径,不内联 findings——compaction 后 findings 可能丢失,文件不会。
82
82
  - fix 轮次硬上限 5 轮;Breaker 绝不在 Round 5 前提前裁决(6.5 即时 ESCALATE/BLOCKED 是技术与边界问题,不属「提前裁决 finding 正确性」)。
83
- - 能力假设退化:若平台不支持 session 续接,每轮新 implementer;若不支持模型切换,退化为「新 implementer + 更详细 brief」,不许静默失效。
83
+ - 能力假设退化:每轮新 implementer;不假定模型可切换,退化为「新 implementer + 更详细 brief」,不许静默失效。
84
84
  - 本技能只审查与 fix,不规划、不派发初次 implementer、不改源码。
85
85
 
86
86
  ## 资源目录
@@ -6,14 +6,20 @@ Review 报告 Spec ❌、任何 Critical/Important finding、或你确认的 ⚠
6
6
 
7
7
  ## 6.2 Fix 轮次策略
8
8
 
9
- | 轮次 | 策略 | 理由 |
10
- |------|------|------|
11
- | Round 1-3 | 恢复原 implementer(传 session_ref) | context 完整,知道自己的代码和选择 |
12
- | Round 4-5 | 新 implementer + 更强模型 | fresh eyes + capability bump |
9
+ | 轮次 | 正常策略 | 理由 |
10
+ |------|----------|------|
11
+ | Round 1-3 | 复用原 implementer session(传 `task_id` 续接) | context 完整,知道自己的代码和选择 |
12
+ | Round 4-5 | 新 implementer + 更强模型(若平台支持模型切换) | fresh eyes + capability bump |
13
13
 
14
- **能力假设**(不符则退化,不许静默失效):
15
- - 「传 `session_ref` 续接同一 subagent 会话」依赖平台 `task` 工具支持会话续接;若不支持,改为每轮**新 implementer**(附完整 brief + report + review 文件路径,prompt 自包含)。
16
- - 「更强模型」为可选项:若 `task` 调用支持指定模型则用之;否则退化为「新 implementer + 更详细 brief」,**不假定模型可切换**。
14
+ **平台能力分支**(正常策略依赖平台能力;若缺失则退化,不许静默失效):
15
+
16
+ **正常策略**(平台能力完整时):
17
+ - Round 1-3:复用原 implementer session,传 `task_id` 续接(同一 session 内 context 完整)。
18
+ - Round 4-5:新 implementer + 更强模型(若平台支持模型切换)。
19
+
20
+ **退化策略**(平台能力不完整时,按缺失项退化):
21
+ - 若不支持 session 续接(`task_id` 不生效):每轮新 implementer,附完整 brief + report + review 文件路径,prompt 自包含。
22
+ - 若不支持模型切换:退化为「新 implementer + 更详细 brief」,Round 4-5 仍用新 implementer 但不切换模型。
17
23
 
18
24
  ### 每轮 fix 的 prompt
19
25
 
@@ -49,7 +55,7 @@ Review 报告 Spec ❌、任何 Critical/Important finding、或你确认的 ⚠
49
55
 
50
56
  每轮 fix 后,取 Ledger 中该任务**最后一条** `reviewed_head=` 的值作为 `FIX_BASE`,`HEAD` = 当前 HEAD,生成 scoped review package 到 `<doc_dir>/task-<N>-review-<fix_base7>..<head7>.diff`(结构同 5.1)。
51
57
 
52
- 派发 re-reviewer(`subagent_type` 取 `general`;唯一写操作是 `<REREVIEW_FILE>`,不得改源码/add/commit):
58
+ 派发 re-reviewer(`subagent_type` 取 `work-general`;唯一写操作是 `<REREVIEW_FILE>`,不得改源码/add/commit):
53
59
 
54
60
  ```
55
61
  你是一个 scoped re-reviewer。验证上一轮 review 的 findings 是否被解决,检查 fix diff 是否引入新问题。
@@ -115,4 +121,3 @@ fix 过程中出现的非正常返回按以下状态表处理(不分轮次,
115
121
  - `FIX_BASE` 语义:取 Ledger 中该任务**最后一条** `reviewed_head=` 的值(不是初始 `base=`),保证 scoped re-review 只看 fix diff。
116
122
  - re-reviewer 工具调用上限 10 次;写白名单仅 `<REREVIEW_FILE>`。
117
123
  - fix prompt 引用 review 文件路径,不内联 findings。
118
- - 能力假设退化不许静默失效:不支持 session 续接 → 每轮新 implementer;不支持模型切换 → 退化「新 implementer + 更详细 brief」。
@@ -1,6 +1,6 @@
1
1
  # 5.2 派发 task reviewer
2
2
 
3
- 使用 `task` 工具,`subagent_type` 取 `general`(reviewer 需写入 REVIEW_FILE,explore 无写工具)。**只读约束写在 prompt 里,不体现在工具权限**:唯一允许的写操作是写入 `<REVIEW_FILE>`,不得改源码、不得 add/commit。
3
+ 使用 `task` 工具,`subagent_type` 取 `work-general`(reviewer 需写入 REVIEW_FILE,explore 无写工具)。**只读约束写在 prompt 里,不体现在工具权限**:唯一允许的写操作是写入 `<REVIEW_FILE>`,不得改源码、不得 add/commit。
4
4
 
5
5
  ## prompt 结构
6
6
 
@@ -8,7 +8,7 @@
8
8
  |------|------|
9
9
  | **Spec ✅ + Approved** | 写 Ledger `T<N>: reviewed_head=<head7>`、`T<N>: complete (commits <base7>..<head7>, review clean)`,勾单,下一任务 |
10
10
  | **Spec ❌ 或有 Critical/Important** | 先写 Ledger `T<N>: reviewed_head=<head7>`,再进入 fix loop(第六步) |
11
- | **⚠️ Cannot verify from diff** | 你自己核查(你持有计划和跨任务上下文);若核查需读文件超过 3 次,改为派 `explore` 子任务核查,避免污染 context |
11
+ | **⚠️ Cannot verify from diff** | 你自己核查(你持有计划和跨任务上下文);若核查需读文件超过 3 次,改为派 `work-explore` 子任务核查,避免污染 context |
12
12
 
13
13
  ## Minor findings
14
14
 
package/agents/extract.md DELETED
@@ -1,26 +0,0 @@
1
- ---
2
- description: 从网页 HTML/文本源码提取结构化内容(list/detail/text/navi),
3
- 通过 extract 技能生成 JSON 数组并写入输出文件。
4
- mode: subagent
5
- temperature: 0.2
6
- permission: allow
7
- ---
8
-
9
- 你是内容提取编辑。收到任务消息后,提取其中的参数执行:
10
-
11
- 1. 用 `skill` 工具加载 `extract` 技能,并用 `read` 读取技能目录下的 `references/input.schema.json5`(入参字段清单)。
12
- 2. 解析入参。任务消息可能含以下任一形态:
13
- - **JSON 对象**:如 `{format, source, url}`,直接取字段值;
14
- - **key=value**:如 `format=list, source=xxx`,拆分为字段;
15
- - **纯文本 prose**:不做格式推断。此时用 `read` 读取技能目录下的 `references/format-aliases.json5`(format 别名映射表),仅当文本命中其中某 format 的 `terms`(如"列表/导航/详情/纯文本")时才翻译为该 format 标准值。
16
- 之后的 `format`(必填,经别名表翻译;list 由技能自动检测 source 是 HTML 还是 JSON)、`source`(必填,HTML/文本或文件路径,原样透传由技能解析)、`url`(可选,相对路径转绝对)、`output`(可选)。其他参数(如 count/max_length/max_image_count/language)被技能忽略。若无法解析出必填的 `format` 或 `source`,将错误信息输出到 stderr 并结束,**禁止**调用技能。
17
- 3. 技能只负责提取:按 format 执行对应 references 流程,返回 JSON 数组(含 schema 校验与重试),**不写任何文件**;`format` 以技能标准值透传。
18
- 4. `output` 为可选参数:提供了 `output` 时,将数组写入该文件(禁止创建其他文件)并在 stdout 输出路径;**未提供 `output` 时,不写任何文件,直接把 JSON 数组输出到 stdout**。
19
- 5. 若技能校验失败未能产出数组,则不写文件/不输出数组,将错误信息输出到 stderr 并结束。
20
- 6. 禁止访问外部网络;除技能校验/本地提取所需 node 外,禁止执行其他 shell。
21
-
22
- ## 工具使用约束
23
-
24
- - 写文件一律用 `write` 工具;读文件用 `read` 工具。
25
- - 需要中间数据时,用 `write` 工具写入临时文件,再以 stdin 重定向传给 node。
26
- - 禁止使用未授权的 `cp`/`rm`/`mv` 等命令;需要复制、移动或删除临时文件时,一律用允许的 `node -e` 的 fs 模块完成(如 `require('fs').copyFileSync(...)`、`require('fs').unlinkSync(...)`)。