@wwkit/harness 1.0.17 → 1.0.19

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 (43) hide show
  1. package/README.md +2 -2
  2. package/agents/fastcode.md +130 -0
  3. package/agents/scrum.md +65 -0
  4. package/package.json +4 -2
  5. package/readme/development.md +1 -1
  6. package/scripts/postinstall.js +41 -0
  7. package/skills/query/SKILL.md +112 -0
  8. package/skills/query/references/input.schema.json5 +25 -0
  9. package/skills/read-docs/references/superpowers/comparison.md +1 -1
  10. package/skills/read-docs/references/superpowers/index.md +1 -1
  11. package/agents/query.md +0 -42
  12. package/agents/work.md +0 -167
  13. package/plugins/work-bootstrap.js +0 -77
  14. package/scripts/work-review-package +0 -50
  15. package/scripts/work-task-brief +0 -27
  16. package/scripts/work-workspace +0 -31
  17. package/skills/work-dispatch/SKILL.md +0 -78
  18. package/skills/work-dispatch/references/dispatch-prompt.md +0 -87
  19. package/skills/work-dispatch/references/prepare.md +0 -25
  20. package/skills/work-dispatch/references/report-handling.md +0 -38
  21. package/skills/work-finalize/SKILL.md +0 -83
  22. package/skills/work-finalize/references/acceptance.md +0 -19
  23. package/skills/work-finalize/references/final-review.md +0 -53
  24. package/skills/work-finalize/references/handover.md +0 -28
  25. package/skills/work-ledger/SKILL.md +0 -73
  26. package/skills/work-ledger/references/bootstrap.md +0 -28
  27. package/skills/work-ledger/references/layout.md +0 -25
  28. package/skills/work-ledger/references/ledger-format.md +0 -57
  29. package/skills/work-plan/SKILL.md +0 -81
  30. package/skills/work-plan/references/plan-file.md +0 -29
  31. package/skills/work-plan/references/self-review.md +0 -18
  32. package/skills/work-plan/references/split-rules.md +0 -23
  33. package/skills/work-plan/references/task-fields.md +0 -44
  34. package/skills/work-recovery/SKILL.md +0 -80
  35. package/skills/work-recovery/references/budget.md +0 -40
  36. package/skills/work-recovery/references/replan.md +0 -21
  37. package/skills/work-recovery/references/rollback.md +0 -20
  38. package/skills/work-review/SKILL.md +0 -95
  39. package/skills/work-review/references/breaker.md +0 -26
  40. package/skills/work-review/references/fix-loop.md +0 -118
  41. package/skills/work-review/references/review-package.md +0 -24
  42. package/skills/work-review/references/reviewer-prompt.md +0 -77
  43. package/skills/work-review/references/verdict-handling.md +0 -25
@@ -1,73 +0,0 @@
1
- ---
2
- name: work-ledger
3
- description: |
4
- [work 专属 runbook] 仅供 work agent 通过 skill 工具显式调用(name=work-ledger),其他 agent / 普通对话禁止触发
5
- 运行会话管理技能:创建产物目录(doc_dir 树 + .gitignore)、生成/恢复 session_id、起始检查(git 仓库 / 工作树 stash / 运行元数据 branch+initial_base+merge_base)、
6
- 以及 Ledger(progress.md)的格式与读写恢复规则(短 SHA 7 位 + 大小写映射约定)。
7
- 适用:work agent 第三步「产物目录与 Ledger」及 compaction 后恢复进度。
8
- 不适用:规划阶段(用 work-plan);任务派发/审查正文;非 work 流程的普通文档管理。
9
- license: MIT
10
- metadata:
11
- workflow: sequential
12
- ---
13
-
14
- # work-ledger 技能
15
-
16
- ## 触发时机
17
-
18
- work agent 进入第三步「产物目录与 Ledger」时(创建运行时)、以及 compaction 后需要恢复进度时加载本技能。
19
-
20
- ## 输入
21
-
22
- 从 work.md 流程传入:
23
-
24
- | 输入 | 说明 |
25
- |------|------|
26
- | `root_dir` | 工程根目录,产物目录位于 `<root_dir>/.webwork/harness/work/<session_id>/` |
27
- | `target` | 目标摘要,写入 Ledger 首行命名、plan.md 标题 |
28
- | `constraints` | 约束(每个任务 brief 的 `forbidden` 至少包含其全部内容) |
29
- | git 状态 | 起始检查时读取的分支名、HEAD、工作树状态 |
30
-
31
- ## 工作流程
32
-
33
- ### 阶段 1:加载 references
34
-
35
- 用 `read` 工具加载本技能 `references/` 下的全部流程文件(相对路径基于本 skill 目录):
36
-
37
- - `references/layout.md` → 产物目录结构(doc_dir 树 + `.gitignore` + archive 约定)
38
- - `references/bootstrap.md` → session_id 生成与恢复、产物目录创建、起始检查、后续约束
39
- - `references/ledger-format.md` → Ledger(progress.md)格式、条目规则、恢复逻辑、短 SHA/大小写约定
40
-
41
- ### 阶段 2:创建产物目录
42
-
43
- 按 `references/layout.md` 与 `references/bootstrap.md`:生成 `session_id`,创建 `<root_dir>/.webwork/harness/work/<session_id>/`,写入 `<root_dir>/.webwork/harness/work/.gitignore`(内容 `*` + `!.gitignore`)。
44
-
45
- ### 阶段 3:起始检查(仅此一次)
46
-
47
- 按 `references/bootstrap.md`:确认在 Git 仓库内;检查工作树干净(非空则 `git stash push -u` 并把脏文件清单记入 Ledger,此为人工确认点之一);记录运行元数据 `branch`/`initial_base`/`merge_base` 并写入 Ledger 首行。
48
-
49
- ### 阶段 4:Ledger 读写维护
50
-
51
- 按 `references/ledger-format.md`:每次派发前写 `T<N>: base=` 与 `T<N>: session=`,review/re-review 后写 `T<N>: reviewed_head=`,implementer 返回后写状态行;恢复时按该文件的恢复逻辑执行(先读 `plan.md` 恢复计划,再读 `progress.md` 恢复进度)。
52
-
53
- ## 输出
54
-
55
- - `<root_dir>/.webwork/harness/work/` 目录树(`.gitignore` + `<session_id>/` 下的 plan.md/progress.md 等文件)
56
- - Ledger 首行元数据块(`doc_dir`/`branch`/`initial_base`/`merge_base`),作为恢复入口
57
- - 按阶段 4 维护的 `T<N>: key=value` 进度条目
58
-
59
- ## 约束
60
-
61
- - 唯一约束:Ledger 字段名与产物文件格式固定(对照 `references/ledger-format.md`),不得改动。
62
- - 短 SHA 一律取 7 位(`${sha:0:7}`);大小写映射约定(见 ledger-format):Ledger 元数据字段小写、任务条目 `T<N>: key=value`、内存/命令变量大写。
63
- - 产物目录绝对路径是恢复入口,compaction 后以 Ledger 首行 `doc_dir=` 为准,不以记忆为准。
64
- - 本技能只维护产物目录与 Ledger,不派发/审查任务、不写任务 brief。
65
-
66
- ## 资源目录
67
-
68
- ```
69
- references/
70
- ├── layout.md # 产物目录结构(doc_dir 树 + .gitignore + archive)
71
- ├── bootstrap.md # session_id 生成与恢复、创建产物目录、起始检查、后续约束
72
- └── ledger-format.md # Ledger 格式、条目规则、恢复逻辑、短 SHA/大小写约定
73
- ```
@@ -1,28 +0,0 @@
1
- # session_id 生成与恢复 + 起始检查(提取自 docs/plans/work-copy.md L225-249)
2
-
3
- ## session_id 生成与恢复(L225-234)
4
-
5
- `session_id` 唯一标识一次编排运行的产物目录,由创建时生成(要求:唯一、可排序、含时间戳)并**写入 Ledger 首行**作为恢复入口。
6
-
7
- **恢复规则**:
8
- - compaction 后从 Ledger 头部元数据块的 `doc_dir=` 读取绝对路径恢复;无法读取时退化为:定位 `<root_dir>/.webwork/harness/work/` 中时间戳最新的 `<session_id>` 目录。
9
- - **产物目录绝对路径是 Ledger 首条元数据**(见 Ledger 格式),恢复时以它为准,不以记忆为准。
10
- - 并发隔离:不同运行用不同 `session_id` 目录,天然隔离,无额外机制。
11
-
12
- **创建产物目录**:创建 `<root_dir>/.webwork/harness/work/<session_id>/` 目录,并写入 `<root_dir>/.webwork/harness/work/.gitignore`(内容为 `*` + `!.gitignore`:忽略所有中间产物,但保留 `.gitignore` 自身)。归档目录 `<root_dir>/.webwork/harness/archive/` **不写** `.gitignore`——保留审计产物,可纳入版本控制。
13
-
14
- ## 起始检查(仅一次,创建产物目录时执行,L236-245)
15
-
16
- 派发任何 subagent 前,先确认工作树安全并记录运行元数据:
17
-
18
- 1. **在 Git 仓库内**:非 Git 仓 → 报告用户并停止。
19
- 2. **工作树是否干净**(`git status --porcelain`):非空 → 默认 `git stash push -u` 后继续,并把 existing 文件清单记录到 Ledger。**这是人工确认点之一(另一处在范围闸门)**:若用户在场可询问 stash/保留,但全自动运行不因询问卡住。
20
- 3. **记录运行元数据**(写入 Ledger 首行,字段语义如下):
21
- - `branch` = 当前分支名
22
- - `initial_base` = 当前 HEAD
23
- - `merge_base` = `initial_base`(本次启动时的 HEAD;使 `MERGE_BASE..HEAD` 恰好覆盖**本次编排产出的提交**,不混入运行前已有提交)。仅当用户**显式要求审查整个分支**时才取 `git merge-base HEAD <main_branch>`。
24
-
25
- ## 后续约束(L247-249)
26
-
27
- - **脏文件不得被 implementer 一起提交**:每个任务 brief 的 `forbidden` 中追加「不得 add/commit 任何未在 `writable` 白名单中的文件」。
28
- - 回滚锚点:`initial_base` 是本运行所有提交的回滚参照(见「中断与回滚」)。
@@ -1,25 +0,0 @@
1
- # 产物目录(提取自 docs/plans/work-copy.md L204-223、L234)
2
-
3
- 所有中间产物统一存放在 `doc_dir`(`<root_dir>/.webwork/harness/work/<session_id>/`)目录:
4
-
5
- ```
6
- <root_dir>/.webwork/harness/work/
7
- .gitignore # 内容: * + !.gitignore(忽略所有产物,保留 .gitignore 自身)
8
- <session_id>/
9
- plan.md # 完整计划(第二步产出,compaction 后恢复用)
10
- progress.md # Ledger(进度持久化)
11
- task-<N>-brief.md # 任务 N 的完整文本(implementer 读取)
12
- task-<N>-report.md # 任务 N implementer 的报告(fix 追加到同一文件)
13
- task-<N>-review.md # 任务 N reviewer 的审查结果
14
- task-<N>-rereview-<R>.md # 任务 N 第 R 轮 re-review 结果
15
- task-<N>-review-<base7>..<head7>.diff # 任务 N 的 review package(diff 包)
16
- final-review.md # 全分支 final review 结果
17
- final-fix-report.md # final 阶段一次 fix 的 report(第七步)
18
- final-review-<merge_base7>..<head7>.diff # final review package
19
- final-fix-review-<final_review_head7>..<head7>.diff # 该 fix 的 scoped re-review diff
20
- ```
21
-
22
- ## .gitignore 约定
23
-
24
- - `<root_dir>/.webwork/harness/work/.gitignore`:内容为 `*` + `!.gitignore` —— 忽略所有中间产物,但保留 `.gitignore` 自身。
25
- - 归档目录 `<root_dir>/.webwork/harness/archive/` **不写** `.gitignore`——保留审计产物,可纳入版本控制。
@@ -1,57 +0,0 @@
1
- # Ledger 格式(提取自 docs/plans/work-copy.md L251-294;全局约束 L27)
2
-
3
- Ledger 是你的恢复地图——compaction 后你的 context 会丢失,但文件不会。Ledger 即 `<doc_dir>/progress.md`。
4
-
5
- ## 全局约束(L27)
6
-
7
- - 短 SHA 一律取 7 位(`${sha:0:7}`)。
8
- - **大小写映射约定**:
9
- - Ledger **元数据字段**小写(`doc_dir`/`branch`/`initial_base`/`merge_base`);
10
- - **任务条目**用 `T<N>: key=value` 形式(如 `T1: base=...`);
11
- - 内存/命令变量同名大写(`BASE`/`HEAD`/`FIX_BASE`/`MERGE_BASE`/`INITIAL_BASE`)。
12
- - 唯一约束:Ledger 字段名与产物文件格式固定,不得改动。
13
-
14
- ## 模板
15
-
16
- ```markdown
17
- # Work ledger — target: <target 摘要>
18
- doc_dir: <root_dir>/.webwork/harness/work/<session_id>
19
- branch: <branch name>
20
- initial_base: <sha — 启动时 HEAD>
21
- merge_base: <sha — 本次运行起点,= initial_base>
22
-
23
- T1: base=a1b2c3d
24
- T1: session=abc123
25
- T1: complete (commits a1b2c3d..d4e5f6a, review clean)
26
- T1: reviewed_head=d4e5f6a
27
- T2: base=d4e5f6a
28
- T2: session=def456
29
- T2: fix round 1/5 (2 addressed, 0 open; commits d4e5f6a..b7c8d9e)
30
- T2: reviewed_head=b7c8d9e
31
- T2: complete (commits d4e5f6a..b7c8d9e, review clean)
32
- T3: base=b7c8d9e
33
- T3: session=ghi789
34
- T3: reviewed_head=e8f9a0b
35
- T3: parked — <finding> — ruling: <why the code stands>
36
- T3: complete (commits b7c8d9e..e8f9a0b, 1 parked)
37
- ```
38
-
39
- ## 每条规则
40
-
41
- - 创建 `doc_dir` 时:写首行元数据块(`doc_dir`/`branch`/`initial_base`/`merge_base`),这是恢复入口。
42
- - 派发 implementer 前:写 `T<N>: base=<BASE_SHA>`(review 和 fix 依赖此 SHA)与 `T<N>: session=<session_ref>`(fix 复用 / 重派时更新)。
43
- - 每次 review / re-review 结束后:写 `T<N>: reviewed_head=<REVIEW_HEAD_SHA>`(供 FIX_BASE 取用)。
44
- - final review 结束后、final fix 派发前:写 `final_review_head=<sha>`(= final review 时的 HEAD,供 final fix 的 scoped re-review 作 `FIX_BASE`)。
45
- - implementer 返回后:立即写状态行(complete/fix round/blocked)。
46
- - compaction 后恢复:先读 `plan.md` 恢复计划,再读 `progress.md` 恢复进度,信任 Ledger 和 `git log` 胜过你的记忆。
47
-
48
- ## 恢复逻辑
49
-
50
- - 首行元数据 `doc_dir=` → 定位会话产物目录绝对路径(恢复入口)。
51
- - 首行命名 target → 确认归属。
52
- - `initial_base` → 启动时的 HEAD;`merge_base` → diff 的起点(默认 = `initial_base`)。
53
- - `T<N>: base=<sha>` → 该任务的 BASE SHA(用于生成 review package)。
54
- - `T<N>: reviewed_head=<sha>` → 该任务上次 review 看到的 HEAD(用于 fix 的 scoped re-review)。
55
- - `final_review_head=<sha>` → final review 时的 HEAD(final fix 的 `FIX_BASE`)。
56
- - `T<N>: complete` → 已完成,不重新派发。
57
- - 最后一行是 fix round → 中断在 loop 中,从下一轮恢复。
@@ -1,81 +0,0 @@
1
- ---
2
- name: work-plan
3
- description: |
4
- [work 专属 runbook] 仅供 work agent 通过 skill 工具显式调用(name=work-plan),其他 agent / 普通对话禁止触发
5
- 规划阶段技能:按 1.1 任务拆分把 target 拆成 ≤10 分钟、可布尔验收的任务,按 2.1 填写 11 字段任务计划,
6
- 按 2.2 写入 plan.md,按 2.3 自审(范围闸门 + 8 项),核对 2.4 并发硬规则(explore ≤5 并行 / general 串行 / BASE=上一 HEAD)。
7
- 适用:work agent 第一步规划到派发前的「规划 → 落单」环节。
8
- 不适用:执行/派发/审查/产物目录与 Ledger(用 work-ledger);非 work 流程的普通规划。
9
- license: MIT
10
- metadata:
11
- workflow: sequential
12
- ---
13
-
14
- # work-plan 技能
15
-
16
- ## 触发时机
17
-
18
- work agent 完成第一步解析用户输入(`target`/`root_dir`/`constraints` 三字段)后、派发任何 subagent 前加载本技能,执行「任务拆分 → 字段填写 → plan.md 落盘 → 计划自审」。
19
-
20
- ## 输入
21
-
22
- 从 work.md 流程传入三个贯穿全程的字段:
23
-
24
- | 字段 | 说明 | 默认 |
25
- |------|------|------|
26
- | `target` | 要达成的目标(定义验收标准,第五步按它判定成败) | 必填 |
27
- | `root_dir` | 工程根目录(所有任务路径、`writable`/`forbidden`、prompt 内路径、bash 命令的基准) | 当前工作目录 |
28
- | `constraints` | 约束(不改的文件、禁止的操作等;展开为全局禁改/禁操作清单,每个任务的 `forbidden` 至少包含它的全部内容) | 无 |
29
- | `doc_dir` | 产物目录绝对路径(来自 work-ledger,`plan.md` 写入其下) | 必填 |
30
-
31
- ## 工作流程
32
-
33
- ### 阶段 1:加载 references
34
-
35
- 用 `read` 工具加载本技能 `references/` 下的全部流程文件(相对路径基于本 skill 目录):
36
-
37
- - `references/split-rules.md` → 1.1 任务拆分规则(第一约束、拆分维度、3 个反模式、不需要拆分的情况)
38
- - `references/task-fields.md` → 2.1 任务 11 字段 + agent 类型选择 + 2.4 并发硬性规则
39
- - `references/plan-file.md` → 2.2 plan.md 持久化格式
40
- - `references/self-review.md` → 2.3 计划自审(范围闸门 + 8 项)
41
-
42
- ### 阶段 2:任务拆分
43
-
44
- 按 `references/split-rules.md` 的规则,把 `target` 拆成任务列表(可能仅 1 个任务)。
45
-
46
- ### 阶段 3:填写任务字段
47
-
48
- 按 `references/task-fields.md` 为每个任务填写全部 11 个字段:
49
- `task_id`/`goal`/`files`/`interfaces`/`accept`/`verify`/`agent`/`writable`/`forbidden`/`depends`/`budget`。`agent` 类型与并发安排按同一文件的规则与 2.4 硬性规则确定。
50
-
51
- ### 阶段 4:写 plan.md
52
-
53
- 按 `references/plan-file.md` 的模板,将完整计划写入 `<doc_dir>/plan.md`(`doc_dir` 的确定见 work-ledger skill)。
54
-
55
- ### 阶段 5:计划自审
56
-
57
- 按 `references/self-review.md` 先查范围闸门(任务数 >20 暂停向用户确认),再逐项自检 8 项;任何一项不通过则修正计划后再进入派发。
58
-
59
- ## 输出
60
-
61
- - 完整任务计划(写入 `<doc_dir>/plan.md`,compaction 后恢复用)
62
- - 每个任务的 11 字段已确定,可供派发 implementer / reviewer 使用
63
- - 本技能**不派发、不执行、不写任务 brief**(派发与 Ledger 属 work agent 流程的其他环节)
64
-
65
- ## 约束
66
-
67
- - 拆分第一约束:每个任务 ≤10 分钟可完成,且能独立写出可布尔判定的 `accept`;超预算必须继续拆,宁可多小任务串行。
68
- - 反模式禁止:按 TDD 步骤拆 / 按文件数硬拆 / 一个任务塞多个不相关目标。
69
- - 并发硬规则:`explore`(只读)可并行且 ≤5 个/轮;`general`(可写)必须串行,须在上一任务 review close 后才派发下一个;下一个 `general` 的 `BASE` 自动等于上一任务 `HEAD`。
70
- - 范围闸门:任务数 >20 或 `target` 无法在 ≤20 个独立验收单元内覆盖 → 暂停规划,向用户确认拆分范围。
71
- - 本技能不读写代码、不执行验证命令,只产出计划与 plan.md。
72
-
73
- ## 资源目录
74
-
75
- ```
76
- references/
77
- ├── split-rules.md # 1.1 任务拆分(第一约束/维度/反模式/不需拆分)
78
- ├── task-fields.md # 2.1 任务 11 字段 + 1.2 agent 类型选择 + 2.4 并发硬规则
79
- ├── plan-file.md # 2.2 plan.md 持久化格式
80
- └── self-review.md # 2.3 计划自审(范围闸门 + 8 项)
81
- ```
@@ -1,29 +0,0 @@
1
- # 2.2 计划文件持久化(提取自 docs/plans/work-copy.md L154-176)
2
-
3
- 规划完成后,将完整计划写入 `<doc_dir>/plan.md`(`doc_dir` 见 work-ledger 第三步,即 `<root_dir>/.webwork/harness/work/<session_id>/`)。
4
-
5
- ## plan.md 格式
6
-
7
- ```markdown
8
- # Plan — target: <target>
9
- ## Global Constraints
10
- <constraints 原文>
11
- ## Tasks
12
- ### T1: <goal>
13
- files: ...
14
- interfaces: ...
15
- accept: ...
16
- verify: ...
17
- agent: ...
18
- writable: ...
19
- forbidden: ...
20
- depends: ...
21
- budget: ...
22
- ### T2: ...
23
- ```
24
-
25
- 结构要点:`# Plan — target: <target>` 标题 + `## Global Constraints`(constraints 原文)+ `## Tasks`(下挂 `### T<N>: <goal>` 及全部任务字段)。
26
-
27
- ## 恢复约定
28
-
29
- compaction 后:先读 `plan.md` 恢复计划,再读 `progress.md` 恢复进度。
@@ -1,18 +0,0 @@
1
- # 2.3 计划自审(提取自 docs/plans/work-copy.md L178-191)
2
-
3
- ## 范围闸门(先于逐项自检,人工确认点之一)
4
-
5
- 若任务数 > 20,或 `target` 无法在 ≤20 个独立验收单元内覆盖 → **暂停规划**,向用户确认拆分范围(本次只做 A 部分,还是分批多次运行)。避免大 target 在规划期就写爆 plan、派出一堆任务,直到运行时总预算才触发。
6
-
7
- ## 逐项自检(8 项)
8
-
9
- 产出计划后逐项自检,**任何一项不通过则修正后再派发**:
10
-
11
- 1. **Spec 覆盖**:`target` 的每个要求是否有任务覆盖?列出未覆盖的 gap 并补任务。
12
- 2. **接口一致性**:跨任务的类型名、函数签名、属性名是否匹配?T1 Produces 的 `clearLayers()` 在 T3 中是否也叫 `clearLayers()` 而非 `clearFullLayers()`?
13
- 3. **占位符扫描**:有无 "TBD"、"加错误处理"、"类似 T1"、"按需实现" 等模糊描述?有则补具体。
14
- 4. **依赖完整性**:`depends` 引用的 `task_id` 是否存在?有无循环依赖?有依赖的任务是否串行?
15
- 5. **文件所有权分区**:可写任务(`general`)强制串行,故无并发写冲突;只读任务(`explore`)不产生文件变更。此条仅用于校验 `files`/`writable` 不落在 `constraints` 禁改范围之内。
16
- 6. **路径合规**:`writable`/`forbidden`/`files` 都落在 `root_dir` 内且不与 `constraints` 冲突。
17
- 7. **验收可判定**:每条 `accept` 是否可布尔判定?`verify` 命令是否具体可执行?
18
- 8. **工时约束**:每个任务的 `budget` 是否 ≤10 分钟?超过的必须继续拆。
@@ -1,23 +0,0 @@
1
- # 1.1 任务拆分(提取自 docs/plans/work-copy.md L65-82)
2
-
3
- 所有任务都必须经过规划→派发→review 流程,无论任务是 1 个还是多个。
4
-
5
- ## 拆分第一约束
6
-
7
- 每个任务必须在 10 分钟内可完成,且能独立写出可布尔判定的 `accept`。这是 subagent 的硬预算(implementer 最多 50 次工具调用);超过预算的任务必须继续拆,直到每个子任务都在预算内。宁可拆成多个小任务串行,也不要留 1 个超出预算的任务。若平台支持 `maxSteps`,用它作为工具调用次数的硬兜底。
8
-
9
- ## 拆分维度
10
-
11
- 按可独立验收的单元拆。一个任务拆出来后,必须能独立写出 `accept` 验收标准,reviewer 能不依赖其他任务的结果就判断它是否完成。如果 accept 必须引用其他任务的中间产物,说明拆错了边界。
12
-
13
- ## 拆分反模式(禁止)
14
-
15
- | 反模式 | 问题 |
16
- |--------|------|
17
- | 按 TDD 步骤拆(RED 一个任务、GREEN 一个任务) | TDD 是一个任务内的流程,拆开导致 RED 任务的测试代码无法独立验收 |
18
- | 按文件数硬拆(每个文件一个任务) | 一个验收单元可能跨多文件,强行按文件拆产生大量微依赖 |
19
- | 一个任务塞多个不相关目标 | subagent context 膨胀,focus 下降 |
20
-
21
- ## 不需要拆分的情况
22
-
23
- - 单一验收单元,预计 ≤10 分钟,不可再分(派 1 个 subagent)。
@@ -1,44 +0,0 @@
1
- # 2.1 任务字段(提取自 docs/plans/work-copy.md L133-151)
2
-
3
- 产出任务计划,每项含全部 11 个字段:
4
-
5
- ```
6
- task_id: T1 / T2 / ...
7
- goal: 目标,≤1 句话,可验收(必须服务于 target 的验收标准)
8
- files: Create: path/to/new.ts | Modify: path/to/existing.ts:120-145 | Touch: path/to/config.json
9
- (路径相对 root_dir;为空 ⇒ 该任务不涉及文件改动)
10
- interfaces: Consumes: funcA(x: string) → number(来自 T1,T2 需调用)
11
- Produces: class Foo { bar(): void }(本任务产出,供后续任务使用)
12
- (无跨任务接口依赖时填 无)
13
- accept: 验收标准,≤3 条,每条可布尔判定(如 "Foo.bar() 返回 true"、"npm test 通过")
14
- verify: 验证命令(如 `npm test -- src/foo.test.ts`;无测试时填 `无`)
15
- agent: explore(只读调研)| general(执行改动/多步)— 选择规则见下
16
- writable: 可写文件白名单(为空 ⇒ 该任务只读;路径相对 root_dir;须与 files 的 Create/Modify 一致)
17
- forbidden: 禁改文件清单(至少含 constraints 全部内容)
18
- depends: 依赖任务:T1, T3(必须先完成)| 无
19
- budget: 预计 ≤10 分钟
20
- ```
21
-
22
- ## 1.2 agent 类型选择(提取自 L84-100)
23
-
24
- | agent 类型 | 适用场景 | 工具权限 |
25
- |-----------|---------|---------|
26
- | `explore` | 只读调研:搜索代码、读取文件、理解结构、验证假设 | read/grep/glob(只读) |
27
- | `general` | 可写改动:编辑代码、执行命令、多步实现、写测试 | 全部工具 |
28
-
29
- **选择规则**:
30
- - 任务涉及任何文件创建/修改/删除 → `general`
31
- - 任务只读不改(调研、审查、验证) → `explore`
32
- - 不确定时按 `general`(权限更大不会卡住)
33
-
34
- **注意**:审查类 subagent 取 `general`(需写审查文件),以 prompt 强约束「只读源码 + 写白名单仅审查文件」;审查处于任务串行链上,天然满足串行。
35
-
36
- ## 2.4 并发硬性规则(提取自 L193-200)
37
-
38
- - **并发分型(Git 隔离的核心约束)**:
39
- - `explore`(只读)**绝不提交、绝不改写工作树/index/HEAD**,只做搜索/读取/理解;可并行,**≤ 5 个/轮**。
40
- - `general`(可写)**必须串行**,同一轮最多 1 个在跑,且须在上一任务的 review close 后才派发下一个;下一个 general 的 `BASE` 自动等于上一任务的 `HEAD`,保证 `BASE..HEAD` 恰好是本任务自己的改动。
41
- - 凡任务可能产生任何文件或 git 变更,一律 `general`(从而落入串行)。
42
- - 串行还是并行由 `depends` 字段 + agent 类型共同决定:有依赖必须串行;无依赖但写操作同样串行;仅只读任务可并行。
43
- - 一个 subagent 对应一个可独立验收的任务,不把多个不相关目标塞给一个 subagent。
44
- - 状态如需跨轮保留,把状态写进 Ledger/文件,不要依赖子代理记忆。
@@ -1,80 +0,0 @@
1
- ---
2
- name: work-recovery
3
- description: |
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 条。
6
- 适用:work agent 运行期遇到计划级失败 / 超时 / 中断 / 需回滚 / 防失控检查时加载。
7
- 不适用:单任务 review fix(用 work-review);最终交付(用 work-finalize);非 work 流程的普通恢复。
8
- license: MIT
9
- metadata:
10
- workflow: on-demand
11
- ---
12
-
13
- # work-recovery 技能
14
-
15
- ## 触发时机
16
-
17
- work agent 运行期遇到以下任一情况时加载本技能对应阶段:
18
-
19
- - 计划级失败(多任务失败 / 某任务反复失败且换模型拆任务均无效 / 计划自审结构性冲突在实现后成真)→ 加载 `references/replan.md`
20
- - 判定退出(target 验收 / 重规划超限 / 阻塞 / 预算超限 / ESCALATE)→ 加载 `references/budget.md` 退出条件段
21
- - 单任务超时 / 等待 child / 总预算护栏检查 → 加载 `references/budget.md` 预算段
22
- - 用户中断 / implementer 提交有误需回滚 / forbidden 文件被改 → 加载 `references/rollback.md`
23
- - 防失控周期自检 → 加载 `references/rollback.md` 护栏段
24
-
25
- ## 输入
26
-
27
- 从 work.md 流程传入:
28
-
29
- | 字段 | 说明 | 默认 |
30
- |------|------|------|
31
- | `target` | 要达成的目标(退出条件按其验收标准判定) | 必填 |
32
- | `root_dir` | 工程根目录 | 当前工作目录 |
33
- | `doc_dir` | 本次 session 产物目录(Ledger / plan.md 所在) | 必填 |
34
- | `session_id` | 本次 session id(重规划复用,不新开) | 必填 |
35
- | `initial_base` | 本次运行最初的 base(回滚绝不 reset 早于它) | 必填 |
36
- | `constraints` | 全局禁改/禁操作清单(forbidden 文件判定基准) | 无 |
37
-
38
- ## 工作流程
39
-
40
- ### 阶段 1:加载 references
41
-
42
- 用 `read` 工具按触发原因加载本技能 `references/` 下对应文件(相对路径基于本 skill 目录):
43
-
44
- - `references/replan.md` → 重规划(触发条件 3 种、规则=复用 session_id/增量调整/不重做已完成、上限 3 轮超限升级用户)
45
- - `references/budget.md` → 退出条件(5 种)+ 预算与超时(单任务超时 / 等待纪律 / 总预算护栏 4 项)
46
- - `references/rollback.md` → 中断与回滚(用户中断 / 回滚规则 / forbidden 强制 checkout)+ 防失控护栏 5 条
47
-
48
- ### 阶段 2:按触发分支执行
49
-
50
- - **重规划**:按 `references/replan.md` 复用同一 `session_id`/`doc_dir`/Ledger,只重走第二步对未完成目标重新拆分并更新 `plan.md`,已完成任务保留标记 done 不重派发;Ledger 记 `replan round <R>/3`;最多 3 轮,超限升级用户。
51
- - **退出判定**:按 `references/budget.md` 退出条件 5 种逐项检查,命中即停止派发并如实报告。
52
- - **预算与超时**:派发 subagent 时优先用平台 `timeout`/`cancel`/后台执行;不支持则用 prompt 软上限(implementer ≤50 / fix ≤20 / reviewer ≤15)+ `maxSteps` 硬兜底;等待期有界等待不静默阻塞;总预算护栏 4 项超限即停派发记 Ledger 报告用户。
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
- - **防失控自检**:按 `references/rollback.md` 护栏 5 条周期自检(并发分型 / task 预算 / scoped re-review / Round 5 后裁决 / 外部信息用 general+webfetch)。
55
-
56
- ## 输出
57
-
58
- - Ledger 条目(`replan round <R>/3` / `T<N>: timeout` / `T<N>: interrupted by user ...` / `T<N>: reverted to <sha>` / `T<N>: reverted forbidden <file>` / 总预算超限记录)
59
- - 更新后的 `plan.md`(重规划时)
60
- - 本技能**不派发新 subagent**(重规划后的派发由 work agent 主流程按新 plan.md 进行);**不 push / 不 merge / 不 reset 早于 initial_base**
61
-
62
- ## 约束
63
-
64
- - 重规划复用同一 `session_id`/`doc_dir`/Ledger,是针对失败与未完成部分的增量调整,不重做已完成任务;最多 3 轮,超限升级用户不再自动继续。
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 并报告,不静默续跑。
69
- - 用户中断保留现场,不删除产物目录。
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` 调研不嵌套再派发。
72
-
73
- ## 资源目录
74
-
75
- ```
76
- references/
77
- ├── replan.md # 重规划(触发 3 种/规则/上限 3 轮)
78
- ├── budget.md # 退出条件 5 种 + 预算与超时(单任务超时/等待纪律/总预算护栏 4 项)
79
- └── rollback.md # 中断与回滚(用户中断/回滚规则/forbidden 强制 checkout)+ 防失控护栏 5 条
80
- ```
@@ -1,40 +0,0 @@
1
- # 退出条件
2
-
3
- - 对照 `target` 验收标准,所有任务 `done`、review 通过 **且整体验收通过**
4
- - 重规划 ≤3 轮(整体步骤用平台最大步数配置兜底,如 `maxSteps`)
5
- - 阻塞无法解除(含与 `constraints` 不可调和)
6
- - 总预算超限(见「预算与超时」)
7
- - subagent 返回 ESCALATE 且无法通过拆分任务/换模型解决 → 如实向用户报告
8
-
9
- # 预算与超时(总预算 + 单任务超时)
10
-
11
- ## 单任务超时(技术强制优先)
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)是**硬兜底**,叠加使用。
16
-
17
- ## subagent 强制退出配置(实施细节)
18
-
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 恢复续跑。
22
-
23
- ## 等待纪律(不静默阻塞)
24
-
25
- - 派发后不停摆:等待期间继续做本地工作(写 Ledger、准备下一个 review package、读已返回的报告)。
26
- - 空闲等待用**有界等待**:不轮询短超时,也不长时间静默;间隔一段(如 5 分钟,若平台允许)列一次在途 subagent,追查「已结束但仍未上报」的——child 的结果可能丢失,而 timeout 抓不到这种「结果丢了」的失败。
27
- - 发现 child 卡死/丢失:按单任务超时处理,记 Ledger `T<N>: timeout` 并标 BLOCKED/ESCALATE。
28
-
29
- ## 总预算护栏(防失控)
30
-
31
- 主 agent 侧维护一份总预算,超限即停止派发、记 Ledger、报告用户:
32
-
33
- | 预算项 | 建议值 | 超限动作 |
34
- |--------|--------|---------|
35
- | 总任务数 | ≤ 20 | 规划期由 2.3 范围闸门拦截;运行时超限停止拆分,评估重规划或升级用户 |
36
- | 总运行时长 | ≤ 30 分钟 | 停止派发,记 Ledger,报告用户 |
37
- | 总工具调用 / token | 平台可观测时设上限 | 同上 |
38
- | 最大并行 explore | ≤ 5(见 2.4) | 等待,不超额派发 |
39
-
40
- 每项超限都**如实写进 Ledger** 并报告,不静默续跑。
@@ -1,21 +0,0 @@
1
- # 重规划(计划级失败恢复)
2
-
3
- 计划级失败时主 agent **自主重新规划**,只针对失败/未完成的目标,不打断用户、不重做已完成任务。
4
-
5
- ## 触发
6
-
7
- 单任务失败先走第四步的「换模型 / 拆任务」;当以下任一成立,进入重规划:
8
-
9
- - 一轮计划中多个任务失败,暴露计划本身的问题(任务边界 / 依赖 / 验收标准定义错误);
10
- - 某任务反复失败,且「换模型 / 拆任务」均无效;
11
- - 计划自审(2.3)发现的结构性冲突在实现后成真。
12
-
13
- ## 规则
14
-
15
- - 复用同一 `session_id` / `doc_dir` / Ledger:历史与已完成提交不丢;重规划是**针对失败与未完成部分的增量调整**。
16
- - 只重走第二步:重读 `target`,对未完成目标重新拆分,更新 `plan.md`;已完成任务条目保留并标记 done,不重新派发。
17
- - Ledger 记 `replan round <R>/3`(`<R>` = 第几轮);重规划后照常走派发 → review → fix 循环。
18
-
19
- ## 上限
20
-
21
- - 最多 3 轮重规划;超限 → 升级用户,如实报告,不再自动继续(见「退出条件」)。
@@ -1,20 +0,0 @@
1
- # 中断与回滚
2
-
3
- ## 用户中断
4
-
5
- - 收到用户中断后:立即停止派发新 subagent;对在途 subagent 发送 cancel(若平台支持 `cancel`);记 Ledger `T<N>: interrupted by user (commits <base7>..<head7>, uncommitted: <files>)`。
6
- - **保留现场**:不删除产物目录,便于续跑或复盘。
7
-
8
- ## 回滚
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>`。
11
- - **forbidden 文件被改**:reviewer 检测到 `writable` 白名单外的变更(含 `constraints` 禁改文件)→ 记 Critical finding,强制 `git checkout -- <file>` 恢复,并在 Ledger 记 `T<N>: reverted forbidden <file>`。
12
- - 回滚仅限本运行产生的提交,**绝不 `reset` 到早于 `initial_base`**。
13
-
14
- # 防失控护栏
15
-
16
- 1. 并发分型:只读 `explore` 可并行 ≤5;可写 `general` 必须串行(同一轮最多 1 个),杜绝并发写冲突与 review diff 污染。
17
- 2. 每个 task 预算 ≤10 分钟;worker 失败先换模型/拆任务重试,仍失败则重规划失败部分(见「重规划」)。
18
- 3. 每轮 fix 后必须 scoped re-review,未审查的 fix 是回归的来源。
19
- 4. Round 5 后才裁决,每条裁决都是 Ledger 条目,禁止静默丢弃。
20
- 5. 需要外部信息时用 `general` + `webfetch` 调研,不在子代理里嵌套再派发。