@cyning/harness 2.8.0 → 2.10.0

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
@@ -4,6 +4,40 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [2.10.0] - 2026-07-25
8
+
9
+ ### Added
10
+
11
+ - **`lifecycle dry-run`(方向二 · 转移引擎最小骨架 · Post-G4 Epic T2)**:消费 `harness/lifecycle.yaml` 做资格判定(结构 + 薄守卫 adapter)。
12
+ - CLI:`lifecycle dry-run --transition <id> --from <state> [--task PATH] [--json] [--allow-no-review]…`
13
+ - 本波接线(`--task` + `to_30`):`HG-AUDIT-R1` · `reviews_retention`;其余守卫显式 `unevaluated`
14
+ - exit:`0` 无 block fail(允许 unevaluated)· `2` 结构非法或 block fail · `1` 用法/yaml
15
+ - **旁路报告**:不替代 `verify` / gate-check 作为 30 硬闸;**无** `--apply` / runner / G7
16
+ - 语义护栏:yaml 头与 schema 注明「登记真值 · 由 dry-run 消费 · yaml ≠ 引擎」
17
+ - **`harness/discipline-coverage.yaml`(方向一 · 机械化率资产 · Post-G4 Epic T3)**:Starter 子集 statements + gaps;schema `discipline-coverage.v1`;`npm test` 锁形状。**无** `audit --discipline` UI。种子自 rethink 02/03 转录并刷新 G1–G4/N 闸状态;03 md 改为历史叙事,SoT=本 YAML。
18
+
19
+ ### Notes
20
+
21
+ - SPEC:`docs/spec/SPEC-lifecycle-engine-min_v1.md` · `docs/spec/SPEC-discipline-coverage-yaml_v1.md`
22
+ - Epic 统一发版窗 · 维护者 publish 前复检
23
+ - minor · `lifecycle show` 行为不变
24
+
25
+ ## [2.9.0] - 2026-07-25
26
+
27
+ ### Changed
28
+
29
+ - **⚠ 行为变更 · 裸 `verify`(无 `--task`/`--spec`)纳入 reviews 留档闸(N4 · G2 residual)**:gate-check 通过后对每个 active 跑 `findReview`;任一缺失 → `VERIFY: BLOCKED · missing R<n> review(n/m tasks · basename…)` exit 2。豁免:`--allow-no-review`(WARN 放行)。
30
+ - **active 发现双路径**:`listActiveTasks` 与 `gate-check.sh` 同步扫描 `docs/tasks/active` ∪ `docs/harness/tasks/active`(同 basename 优先 Starter)。
31
+ - 全量 `--json`:每 task 的 `may_start_30` / `verify_ok` 纳入 `review_found`(与 `--task` 同构)。
32
+ - `lifecycle.yaml` `to_30` / `reviews_retention`:描述覆盖「`--task` 与全量」。
33
+
34
+ ### Notes
35
+
36
+ - 全量模式仍**不**跑 task lint / audit D5(维持 N2)。
37
+ - SPEC:`docs/spec/SPEC-verify-full-reviews-gate_v1.md`
38
+ - minor · 行为更严 · 存量「闸表可 30 但无审查文」将被挡(可补审或 `--allow-no-review`)
39
+ - **已发布**:`@cyning/harness@2.9.0`(npm `latest` · 2026-07-25)· tag `v2.9.0` 已推送
40
+
7
41
  ## [2.8.0] - 2026-07-25
8
42
 
9
43
  ### Added
@@ -18,6 +52,7 @@
18
52
  - 与 `--task` 互斥;**不**改 task 侧 verify/close。
19
53
  - SPEC:`docs/spec/SPEC-spec-reviews-retention-gate_v1.md`
20
54
  - minor · 行为新增(新模式)
55
+ - **已发布**:`@cyning/harness@2.8.0`(npm `latest` · 2026-07-25)· tag `v2.8.0` 已推送
21
56
 
22
57
  ## [2.7.0] - 2026-07-24
23
58
 
@@ -45,11 +45,13 @@ cd your-project
45
45
  `npx @cyning/harness verify` 在 30 执行前聚合扫描人工闸与测试声明,确保 ICVO 公理可机械检查:
46
46
 
47
47
  ```bash
48
- # 30 前聚合验证(gate-check + audit D5 + reviews + S5 warn + 可选 --graph)
48
+ # 30 前聚合验证(gate-check + reviews + S5 warn + 可选 --graph)
49
+ # 无 --task:双路径 active(docs/tasks/active ∪ docs/harness/tasks/active)+ 全量 reviews(v2.9+)
49
50
  npx @cyning/harness verify --target /path/to/your-repo
51
+ # 缺审查文豁免:--allow-no-review
50
52
  npx @cyning/harness verify --target /path/to/your-repo \
51
53
  --task docs/tasks/active/task_xxx.md
52
- # --task 另跑 task lint(v2.7+ · E 级仅 WARN,不挡 may_start_30)
54
+ # --task 另跑 audit D5 + task lint(v2.7+ · E 级仅 WARN,不挡 may_start_30)
53
55
  # 抑制 lint WARN:加 --allow-lint-fail
54
56
 
55
57
  # SPEC→00 前:审查文存在性(v2.8+ · 与 --task 互斥)
@@ -57,9 +59,14 @@ npx @cyning/harness verify --spec docs/spec/SPEC-xxx_v1.md \
57
59
  --workspace-root /path/to/Projects
58
60
  # 豁免:--allow-no-spec-review · 或 SPEC track=bugfix / skip_spec_audit
59
61
 
60
- # 只读生命周期登记(方向二 · 非引擎)
62
+ # 只读生命周期登记(方向二 · harness/lifecycle.yaml · 非引擎)
61
63
  npx @cyning/harness lifecycle show
62
64
  npx @cyning/harness lifecycle show --json
65
+ # 转移资格 dry-run(v2.10+ · 旁路报告 · 不替代 verify)
66
+ npx @cyning/harness lifecycle dry-run --transition to_30 --from draft \
67
+ --task docs/tasks/active/task_xxx.md
68
+ # 无 --task:仅结构 + 守卫清单 unevaluated
69
+ npx @cyning/harness lifecycle dry-run --transition to_30 --from draft
63
70
 
64
71
  # 仅人工闸
65
72
  npx @cyning/harness gate-check --target /path/to/your-repo
@@ -76,11 +83,15 @@ npx @cyning/harness sync index --target /path/to/your-repo
76
83
  | 公理 | 检查项 | 行为 |
77
84
  |------|--------|------|
78
85
  | **D3** | 30 前置人闸 | 复用 `gate-check.sh`,HG-AUDIT-R1 非 approved 时 verify 非 0 |
79
- | **D5** | 改码任务测试声明 | `test_strategy=required` 但无测试/CI 引用时 verify 非 0 |
86
+ | **D5** | 改码任务测试声明 | 仅 `--task`:`test_strategy=required` 但无测试/CI 引用时 verify 非 0 |
87
+ | **reviews** | R&lt;n&gt; 审查文存在 | `--task` 与全量(v2.9+)· 缺文 BLOCKED · `--allow-no-review` |
88
+ | **active** | 任务发现 | 双路径 `docs/tasks/active` ∪ `docs/harness/tasks/active`(v2.9+) |
80
89
  | **S5** | Git 工作区干净 | dirty 时 warn(不直接 fail verify,但 apply 须 `--force`) |
81
90
  | **lint** | task 结构(仅 `--task`) | v2.7+ E 级 → `WARN: task lint`(不改 exit / `may_start_30`) |
82
91
 
83
- 生命周期真值:[`harness/lifecycle.yaml`](../harness/lifecycle.yaml)(`lifecycle show` 只读)。
92
+ 生命周期真值:[`harness/lifecycle.yaml`](../harness/lifecycle.yaml)(`lifecycle show` 只读 · `lifecycle dry-run` 资格判定 v2.10+)。
93
+
94
+ 机械化率覆盖资产(Starter):[`harness/discipline-coverage.yaml`](../harness/discipline-coverage.yaml)(SoT · 随版本改 statements/gaps;**无** audit UI)。
84
95
 
85
96
  Audit **不替代** 维护者最终判断;Agent 首输出仍须人工复核。
86
97
 
@@ -111,7 +111,11 @@ npx @cyning/harness@1.0.1 init --preset harness-only --ide cursor,agents --yes
111
111
  **原则**:Agent 可以写 task 和 review,**人工闸只有维护者能签**。
112
112
 
113
113
  ```bash
114
- # 30 前聚合验证(gate-check + audit D5 + reviews + task lint WARN + S5 · 可选 --graph
114
+ # 全量(无 --task):双路径 active + 闸表 + reviews(v2.9+ · 不跑 lint/D5
115
+ npx @cyning/harness verify --target .
116
+ # 缺审查文豁免:--allow-no-review
117
+
118
+ # 单 task:gate-check + audit D5 + reviews + task lint WARN + S5 · 可选 --graph
115
119
  npx @cyning/harness verify --target . --task docs/tasks/active/task_xxx.md
116
120
  # lint FAIL 仅 WARN(v2.7+ · 不挡 30);抑制:--allow-lint-fail
117
121
 
@@ -126,8 +130,11 @@ npx @cyning/harness verify --target . \
126
130
  [--json] [--agent-hint] \
127
131
  [--workspace-root /path/to/Projects]
128
132
 
129
- # 只读生命周期登记(方向二 · harness/lifecycle.yaml · 非引擎)
133
+ # 只读生命周期登记(方向二 · harness/lifecycle.yaml · 登记真值)
130
134
  npx @cyning/harness lifecycle show [--json]
135
+ # 转移资格 dry-run(v2.10+ · 引擎消费 yaml · 旁路报告 · 非 runner / 非 G7)
136
+ npx @cyning/harness lifecycle dry-run --transition to_30 --from draft \
137
+ [--task docs/tasks/active/task_xxx.md] [--json] [--allow-no-review]
131
138
 
132
139
  # 仅人工闸
133
140
  npx @cyning/harness gate-check --target . --task docs/tasks/active/task_xxx.md
@@ -146,6 +153,7 @@ npx @cyning/harness gate-check --graph --target . # Inform 图谱闸
146
153
  | `HG-GRAPH-MODULES` | 架构模块表人签 | pending → 拒改码 30 |
147
154
  | `HG-RELEASE` | 发版闸(产品仓) | 一般业务仓不涉及 |
148
155
  | `task_lint`(v2.7+) | `verify --task` 结构检查 | **仅 WARN** · 不改 `may_start_30` |
156
+ | `reviews`(全量 v2.9+) | 裸 verify 亦查 R&lt;n&gt; 文 | 缺文 → BLOCKED · `--allow-no-review` |
149
157
 
150
158
  ### 5.1 Agent handoff(v2.0.2+)
151
159
 
@@ -153,7 +161,8 @@ npx @cyning/harness gate-check --graph --target . # Inform 图谱闸
153
161
 
154
162
  | JSON 字段 | 含义 |
155
163
  | --- | --- |
156
- | `may_start_30` | 等价 gate-check「可 30 |
164
+ | `may_start_30` | 闸表可 30 **且** `review_found`(或豁免) |
165
+ | `review_found` | R&lt;n&gt; 审查文是否存在(全量与 `--task` 同构 · v2.9+) |
157
166
  | `blocked_reason` | 阻塞时 D2/D3 文案 |
158
167
  | `review_path` | 最新 `*_audit_R1_*.md`(相对 target) |
159
168
  | `entry_invoke_30` | task 表原始路径 |
@@ -177,8 +186,10 @@ Schema:[`schema/verify_result.v1.schema.json`](../schema/verify_result.v1.sche
177
186
  | `npx @cyning/harness init` | 首次安装模板与 manifest(可选 `--with-scripts`) |
178
187
  | `npx @cyning/harness upgrade` | 同步产品包更新(可加 `--gate-check` 先 audit) |
179
188
  | `npx @cyning/harness check` | 检查是否有新版本 |
180
- | `npx @cyning/harness verify` | `--task`:30 前聚合;`--spec`:SPEC→00 审查文闸(v2.8+ · 互斥)· `--allow-no-spec-review` |
181
- | `npx @cyning/harness lifecycle show` | 只读展示 `harness/lifecycle.yaml`(状态/转移/守卫 · v2.7+ · 非引擎) |
189
+ | `npx @cyning/harness verify` | 全量:双路径 + reviews(v2.9+);`--task`:30 前聚合;`--spec`:SPEC→00v2.8+ · 互斥) |
190
+ | `npx @cyning/harness lifecycle show` | 只读展示 `harness/lifecycle.yaml`(登记 · v2.7+) |
191
+ | `npx @cyning/harness lifecycle dry-run` | 转移资格判定(引擎消费 yaml · v2.10+ · 旁路 · 非 G7) |
192
+ | 机械化率资产 | 包内 `harness/discipline-coverage.yaml`(SoT · v2.10+ · 无 audit UI) |
182
193
  | `npx @cyning/harness gate-check` | 仅人工闸(`--graph` / `--json`) |
183
194
  | `npx @cyning/harness audit` | ICVO 机械审计(D3/D5/S5) |
184
195
  | `npx @cyning/harness sync index` | 生成 `.cyning-harness/invoke_index.json` |
@@ -57,5 +57,7 @@ description: 机械化率统计矩阵 + 缺口聚类 + 候选闸优先级排序
57
57
 
58
58
  ## 5. 数字的诚实边界
59
59
 
60
- - 26 条是**人工盘点**(2026-07-24),分类判断含主观成分(尤其 🟡/❌ 边界);矩阵本身应落盘为 YAML 成为可维护资产,后续随版本更新(→ 04 建议);
61
- - 「mechanical」只代表**存在**机制,不代表机制**有效**(如 D5 只探测测试文件存在而非真失败驱动)——下一层是机制质量审计,本轮不做。
60
+ - **运行时真值(SoT)**:[`harness/discipline-coverage.yaml`](../../harness/discipline-coverage.yaml)(schema:[`schema/discipline-coverage.v1.schema.json`](../../schema/discipline-coverage.v1.schema.json) · `@cyning/harness` 版本维护 · v2.10+)
61
+ - 下文 26 条统计表是 **2026-07-24 人工盘点快照**(历史/叙事);分类含主观成分。**勿再把本 md 表当唯一真值**——查覆盖请读 YAML(`as_of_package_version`)
62
+ - 「mechanical」只代表**存在**机制,不代表机制**有效**(如 D5 只探测测试文件存在)——预留 `mechanism_quality`;本轮不做质量审计
63
+ - SPEC:[`SPEC-discipline-coverage-yaml_v1.md`](../spec/SPEC-discipline-coverage-yaml_v1.md)
@@ -52,9 +52,10 @@ description: 结论与立项建议 · 缺口到 SPEC/task 的转化路径 + 与
52
52
 
53
53
  ## 4. 机械化率矩阵的资产化
54
54
 
55
- - 03 的矩阵落成 `discipline-coverage.yaml`(语句 id / 出处 / 状态 / 机制 / 缺口 / 备注),随版本维护;
56
- - 每个新闸落地 = 矩阵里一行 ❌→✅——这就是方向一承诺的「改进路线自动生成」的实体;
57
- - 远期可给 `harness audit` 加 `--discipline` 视图直接渲染该 YAML(机制质量审计也挂这里)。
55
+ - **已落地(v2.10.0 · Epic T3)**:[`harness/discipline-coverage.yaml`](../../harness/discipline-coverage.yaml) + [`schema/discipline-coverage.v1.schema.json`](../../schema/discipline-coverage.v1.schema.json) · SPEC [`SPEC-discipline-coverage-yaml_v1.md`](../spec/SPEC-discipline-coverage-yaml_v1.md)
56
+ - 每个新闸落地 = 更新 YAML 对应 `statements[].status` / `gaps[]` / `as_of_package_version`
57
+ - 远期可给 `harness audit` 加 `--discipline` 视图(**本波不做** UI)
58
+ - 03 md 表保留为历史叙事;SoT = YAML
58
59
 
59
60
  ## 5. 不做什么(本轮明确排除)
60
61
 
@@ -0,0 +1,204 @@
1
+ # SPEC:discipline-coverage.yaml 资产化(Post-G4 · T3)(v1)
2
+
3
+ > **状态**:`signed`(维护者签收 2026-07-25 · 对话「签收」)
4
+ > **track**:`feature`(docs-first · 可 docs-only 发版)
5
+ > **关联图谱**:无(纯 Harness 过程轨 / 机械化率资产)
6
+ > **上游**:Epic [`EPIC_post_g4_menu_serial_t1t2t3_v1_zh.md`](../../../docs/harness/guides/EPIC_post_g4_menu_serial_t1t2t3_v1_zh.md) · RETRO 点菜 #3 · rethink [`03_coverage_matrix`](../rethink/2026-07-mechanization-rate/03_coverage_matrix.md) / [`04_next_steps`](../rethink/2026-07-mechanization-rate/04_next_steps.md) §4
7
+ > **串行**:T1 CLOSE ✅ → T2 CLOSE ✅ → **本棒 T3** → 发版前复检
8
+ > **下游**:00 已起草 task(HG-TASK-DRAFT pending)→ 10-task(可选)→ 20-task-audit → HG-AUDIT-R1 → 30(Open Folder:`cyning-harness/`)
9
+
10
+ ---
11
+
12
+ ## Harness 元信息
13
+
14
+ | 字段 | 值 |
15
+ |------|-----|
16
+ | **spec_slug** | `discipline-coverage-yaml` |
17
+ | **test_strategy** | `required` |
18
+ | **test_strategy_note** | schema 正反例 + 包内 YAML 必须通过 schema;无 CLI 时仍以 `npm test` 锁形状,避免静默漂移 |
19
+ | **entry_invoke_10_spec** | `Projects/docs/harness/invokes/by-task/cyning-harness-discipline-coverage-yaml/invoke_20260725_10_spec_discipline_coverage_yaml.md` |
20
+ | **entry_invoke_00_draft** | `Projects/docs/harness/invokes/by-task/cyning-harness-discipline-coverage-yaml/invoke_20260725_00_draft_discipline_coverage_yaml.md` |
21
+ | **拟发版窗口** | **`@cyning/harness@2.10.0`**(与 Epic T2 同窗;本棒无 CLI 亦可 docs/asset-only 记入同 CHANGELOG) |
22
+ | **Open Folder(实现)** | `cyning-harness/`(产品仓 · 资产 + schema + test + 文档) |
23
+ | **epic_serial** | T3(T1 dogfood → T2 lifecycle dry-run → **本棒**) |
24
+
25
+ ---
26
+
27
+ ## 1. 背景与目标
28
+
29
+ 机械化率审计(2026-07)把 Starter 子集 **26 条**规范语句聚成矩阵(rethink 03),并写明:矩阵应落盘为 YAML,随版本维护,使「每个新闸落地 = 一行 ❌→✅」成为可版本化资产(04 §4)。G1–G4 / N1–N4 已关账后,03 正文仍是 **人工快照 md**——数字与状态会相对 `@2.9.0` 现实漂移,且无法被 schema / CI 钉住。
30
+
31
+ **一句话目标**:把 rethink 03 矩阵 **资产化** 为包内 `discipline-coverage.yaml`(+ schema + 文档挂点),成为方向一「改进路线可版本化」的实体;**不**在本波做全量重盘周,**不**做 `audit --discipline` 大 UI。
32
+
33
+ ---
34
+
35
+ ## 2. 范围
36
+
37
+ ### D1 · 真值 YAML(随包分发)
38
+
39
+ - 路径:**`harness/discipline-coverage.yaml`**(与 `harness/lifecycle.yaml` 同级 · 进 npm `files`)
40
+ - 内容至少含:
41
+ - `version`(资产 schema 版本,如 `"1"`)
42
+ - `as_of_package_version`(快照对齐的包版本,首发填拟发布版或基线 `2.9.0`→发版时改 `2.10.0`)
43
+ - `scope`:声明 **Starter 子集**(`harness/prompts/` · 与 rethink README 范围一致)
44
+ - `statements[]`:每条至少 `id` · `source`(prompt/模板文件名)· `summary` · `status`(`mechanical` \| `partial` \| `prompt-only`)· `mechanism`(可空 · M1–M10 等)· `gap`(可空 · G1/G2/…)· `notes`(可空)
45
+ - 预留字段:`mechanism_quality`(可空 · 本波不填实质审计)
46
+ - 可选:`gaps[]` 汇总(id / title / status open|closed|deferred / closed_in / note)——便于一眼看缺口进度;若省略则须能从 statements 推导
47
+ - **种子策略(非重盘)**:以 rethink **02 条目 + 03 聚合** 为转录源;对已落地闸(G1–G4 及 PLAN §0 已列项)**更新 status/mechanism/gap 为当前现实**(反映 `@2.9.0` 已关闭项),**不**重新通读全部 prompt 做第二轮人工盘点周
48
+
49
+ ### D2 · Schema
50
+
51
+ - **`schema/discipline-coverage.v1.schema.json`**
52
+ - 非法 fixture(缺 `statements` / 非法 `status` / 缺 `id`)须可失败定位
53
+
54
+ ### D3 · 测试(无 CLI 亦必有)
55
+
56
+ - `test/discipline-coverage*.test.js`(或等价):包内 YAML **通过** schema;至少 1 个非法 fixture **不通过**
57
+ - 建议轻断言:`statements.length >= 20`(防空文件)· 已知已关闭缺口(如 G1/G2)在 `gaps` 或 statements 映射中不为「仍 open 且无 closed_in」的自相矛盾(具体断言由 30 按 fixture 实现,SPEC 要求「不自相矛盾」可测)
58
+
59
+ ### D4 · 文档挂点
60
+
61
+ - rethink **03** §5(或文首):标明矩阵**运行时真值** → `harness/discipline-coverage.yaml`;md 表保留为历史/叙事,不再假装 SoT
62
+ - rethink **04** §4:链到本 SPEC / YAML 路径
63
+ - 产品仓 README 或 ONBOARDING / USER_GUIDE **一小节**:「机械化率覆盖资产」· 如何读 YAML · 新闸落地时须改哪一行
64
+ - CHANGELOG:**2.10.0** 条目(可与 T2 合并叙述;本棒无 CLI 则写 asset + schema)
65
+
66
+ ### D5 · 维护约定(写进文档,非另开 task)
67
+
68
+ - 新闸合入 → 同 PR 或同版本更新对应 `statements[].status`(及 `gaps[]` / `as_of_package_version`)
69
+ - **禁止**本波要求「每周全量重盘」流程
70
+
71
+ ---
72
+
73
+ ## 3. 非范围
74
+
75
+ | 项 | 说明 |
76
+ |----|------|
77
+ | **全量人工重盘周** | 不重跑 02 式通读;不扩盘工作区 Extended 帽(00/10-spec/20-*/50) |
78
+ | **`harness audit --discipline` 大 UI / 视图** | 04 远期;本波不做渲染与 CLI 子命令(见 R2) |
79
+ | **机制质量审计** | `mechanical ≠ effective`(如 D5 只探文件存在);仅预留 `mechanism_quality` |
80
+ | **改 `harness/prompts/` 纪律正文** | 非本棒;措辞随各闸 task |
81
+ | **T2 lifecycle 引擎 / G7 / G6 / N2-C** | 属其它棒或暂缓项 |
82
+ | **代发版 / 代签 human_gate** | Epic 级禁止 |
83
+
84
+ ---
85
+
86
+ ## 4. 验收标准
87
+
88
+ - [ ] `harness/discipline-coverage.yaml` 存在且通过 `discipline-coverage.v1` schema
89
+ - [ ] 种子覆盖 Starter 盘点主表条目(与 02 的 A–F 编号可对照;允许合并对照组 G 节为 notes,不要求逐字复制 03 统计表)
90
+ - [ ] 已落地缺口(至少 **G1、G2、G4** 及 PLAN 已 ✅ 的文档闸)在资产中体现为 **非**「仍纯 prompt-only 且 gap 未关闭」的过时叙述(status/gap/closed_in 之一须反映已机械)
91
+ - [ ] 非法 YAML fixture → 测试失败且信息可定位
92
+ - [ ] 文档挂点:从 rethink 03(或 README)可链到 YAML;CHANGELOG 有 **2.10.0** 叙述
93
+ - [ ] `npm test` 全绿
94
+ - [ ] **无** `audit --discipline` UI;**无**强制重盘脚本/周程
95
+
96
+ ---
97
+
98
+ ## 5. failure_paths
99
+
100
+ | 触发条件 | 系统行为 | 可重试 |
101
+ |----------|----------|--------|
102
+ | YAML 不符 schema | 测试 /(若将来 CLI)校验 exit ≠0 · 指出路径/字段 | 修 YAML |
103
+ | 种子与 02 编号明显漏行(空或极少) | 验收失败(length / 抽样 id) | 补转录 |
104
+ | 文档仍把 03 md 表当唯一真值 | 验收挂点失败 | 改 03/README 指针 |
105
+ | 误把本波做成 audit UI | 超出非范围 · 20/40 拒收 | 回退 UI |
106
+ | T2 未 CLOSE 却开 T3 改码 | Epic 串行违纪 · 00/人闸拦截 | 等 T2 CLOSE |
107
+ | 仅改 docs、未进 `harness/` 包路径 | 资产不可随 npm 分发 · 验收失败 | 移入 `harness/` |
108
+
109
+ ---
110
+
111
+ ## 6. 依赖与引用
112
+
113
+ - Epic:`docs/harness/guides/EPIC_post_g4_menu_serial_t1t2t3_v1_zh.md`
114
+ - RETRO 点菜 #3:`docs/harness/guides/RETRO_post_g4_n1n4_debt_v1_zh.md` §4
115
+ - rethink:`cyning-harness/docs/rethink/2026-07-mechanization-rate/{02,03,04,README}.md`
116
+ - 形态先例:`harness/lifecycle.yaml` + `schema/lifecycle.v1.schema.json`(本波 **可不**镜像 `lifecycle show` CLI)
117
+ - 机制编号:rethink README M1–M10
118
+ - 当前包版本基线:`@cyning/harness@2.9.0`
119
+
120
+ ---
121
+
122
+ ## 7. 思考轮(10-spec 回填 · R0–R5)
123
+
124
+ ### R0 · 读入与约束
125
+
126
+ 读入:Epic T3 行(`discipline-coverage.yaml` + 文档挂点)· RETRO #3 不做清单 · rethink 03 §5 / 04 §4 · PLAN closed 已落地表 · lifecycle 资产先例。
127
+ 约束:串行 T3;发版窗 **2.10.0**;可为无 CLI;**early_stop=no**;禁止重盘周与 audit UI。
128
+
129
+ ### R1 · 范围 / 非范围 / 场景
130
+
131
+ **场景**:
132
+
133
+ 1. **S1 维护者**:发版前问「Starter 还有哪些 prompt-only?」→ 打开 YAML / 将来工具读同一文件。
134
+ 2. **S2 补闸作者**:合入新闸 PR 时改一行 status(❌→✅),CHANGELOG 与矩阵同步。
135
+ 3. **S3 Agent/评审**:验收「资产是否在包内且 schema 绿」,而非再开一周盘点。
136
+
137
+ **范围**:D1–D5(YAML + schema + test + 文档 + 维护约定)。
138
+ **非范围**:重盘 Extended、audit UI、机制质量、改 prompts、T2/G7 等。
139
+
140
+ ### R2 · 方案对比
141
+
142
+ | 决策点 | 选项 | 裁定 | 理由 |
143
+ |--------|------|------|------|
144
+ | 落点 | 仅 rethink md 更新 / `docs/` 下 YAML / **`harness/` 包内 YAML** | **`harness/discipline-coverage.yaml`** | 与 lifecycle 同构;进 npm `files`;业务仓 upgrade 可见 |
145
+ | 消费者 | 无 / schema+test / + `discipline show` / + `audit --discipline` | **schema + npm test + 文档挂点** | 满足「资产化」与可测;CLI/UI 属膨胀;Lead 允许 docs-only |
146
+ | 种子方法 | 全量重盘周 / **转录 02+03 并刷新已落地状态** / 只写空壳 | **转录 + 状态刷新** | RETRO 禁止重盘;空壳无验收意义 |
147
+ | 与 03 md 关系 | 双真值并行 / **YAML=SoT·md 指针** / 删除 03 | **YAML SoT · 03 改指针** | 保留思考叙事;消漂移 |
148
+ | 发版 | 独立 patch / **同窗 2.10.0(T2)** | **2.10.0** | Epic 统一复检;无 CLI 亦不单开无意义版本号 |
149
+ | CLI show | 本波做 / **不做** | **不做(本波)** | 降低 T3 与 T2 抢实现带宽;预留下波 mirror lifecycle |
150
+
151
+ **弃选**:audit UI(Epic/RETRO 明文);仅 md 统计不加 YAML(违背 04 §4)。
152
+
153
+ ### R3 · 边界 / 失败语义 / 安全
154
+
155
+ - **挂点**:资产在「新闸已存在之后」更新(合入闸的同版本)——符合 03 反模式「挂点晚于产物」。
156
+ - **误报**:schema 只锁形状与枚举,不锁「status 是否政治正确」;内容对错靠 20/人审与 dogfood。
157
+ - **泄压**:无 BLOCKING 运行时闸;坏 YAML 只挡本仓 `npm test` / 发版复检。
158
+ - **安全**:只读资产;不写用户仓;不含密钥。
159
+ - **串行**:T3 30 须 T2 CLOSE(Epic);SPEC/task 起草可先行,**改码合入**遵守串行。
160
+ - **兼容**:旧版包无此文件 · 行为不变。
161
+
162
+ ### R4 · 验收 / 可测性 / test_strategy
163
+
164
+ `test_strategy: required`:schema 正反例 + 包内文件必过。
165
+ 可观测:路径存在、校验绿、文档链接、CHANGELOG、无 UI 命令。
166
+ 不要求:覆盖率百分比与 03 历史数字逐格相等(因已落地闸会改写占比——以 YAML 新快照为准,03 可保留旧数字并注明过时)。
167
+
168
+ ### R5 · SPEC 签收就绪 · 是否可交 00 出 task
169
+
170
+ SPEC 自足:D 包清晰、R2 弃选写死、非范围与 Epic 对齐、发版窗 2.10.0。
171
+ **可交 00** 起草 task:`task_slug` 建议 `cyning-harness-discipline-coverage-yaml`;Open Folder `cyning-harness/`;`lightweight_task` 可由 00 裁量(投影清晰时可 yes + 10-task early_stop 理由)。
172
+ 图谱无需 bootstrap。
173
+ **下一棒**:可选轻量 **20-spec-audit** → **HG-SPEC-SIGNOFF** → 00 draft task(若维护者直接签收可跳过书面审,链纪律上推荐轻量 20)。
174
+
175
+ ### 思考轮控制
176
+
177
+ | 字段 | 值 |
178
+ |------|-----|
179
+ | `actual_last_round` | `R5` |
180
+ | `early_stop` | `no` |
181
+ | `early_stop_reason` | — |
182
+ | `residual_risks` | ① 转录时 status 刷新可能与个别 prompt 细读不一致(非重盘的诚实边界,03 §5 同类);② 无 CLI 时发现性弱,依赖文档挂点;③ 与 T2 同窗 2.10.0 时 CHANGELOG 合并叙述易漏写本资产——发版复检须勾;④ `gaps[]` 与 statements 双写可能漂移——30 宜单测一致性或只保留一层真值 |
183
+ | `round_extension_note` | — |
184
+
185
+ ---
186
+
187
+ ## 8. 给 00 的 task 投影提示(非 task 正文)
188
+
189
+ | 项 | 建议 |
190
+ |----|------|
191
+ | task_slug | `cyning-harness-discipline-coverage-yaml` |
192
+ | Open Folder | `cyning-harness/` |
193
+ | 交付文件 | `harness/discipline-coverage.yaml` · `schema/discipline-coverage.v1.schema.json` · `test/…` · 文档指针 · CHANGELOG |
194
+ | 依赖 | Epic:T2 CLOSE 后方可本棒 30;SPEC 本文件 signed |
195
+ | 版本 | 记入 **2.10.0**(可与 T2 同 PR 或同 tag 窗口) |
196
+
197
+ ---
198
+
199
+ ## 修订记录
200
+
201
+ | 日期 | 摘要 |
202
+ |------|------|
203
+ | 2026-07-25 | 10-spec R0–R5 · Post-G4 Epic T3 · early_stop=no · draft |
204
+ | 2026-07-25 | 维护者签收(对话「签收」)→ `signed` · 00 起草 task · N3 纸链审查文 |
@@ -0,0 +1,246 @@
1
+ # SPEC:lifecycle 转移引擎最小骨架(Post-G4 Epic T2)(v1)
2
+
3
+ > **状态**:`signed`(维护者签收 2026-07-25 · 对话「签收」)
4
+ > **track**:`feature`
5
+ > **关联图谱**:无(纯 Harness 工具链 / 过程轨)
6
+ > **上游**:工作区 Epic [`EPIC_post_g4_menu_serial_t1t2t3_v1_zh.md`](../../../docs/harness/guides/EPIC_post_g4_menu_serial_t1t2t3_v1_zh.md) · RETRO [`RETRO_post_g4_n1n4_debt_v1_zh.md`](../../../docs/harness/guides/RETRO_post_g4_n1n4_debt_v1_zh.md) §4 点菜 **#2** · PLAN 方向二
7
+ > **前置**:N1 `@cyning/harness@2.7.0`(`lifecycle.yaml` + `lifecycle show` 只读)· 当前产品仓 **2.9.0** · Epic **T1 CLOSE ✅**
8
+ > **下游**:00 已起草 task(HG-TASK-DRAFT pending)→ 10-task(可选)→ 20-task-audit → HG-AUDIT-R1 → 30(Epic:T1 已 CLOSE,闸链仍须人签)
9
+ > **目标版本**:Epic 统一发版建议 **`@cyning/harness@2.10.0`**(与 T3 同波复检后 publish;本 SPEC 可写目标版本,不代发)
10
+
11
+ ---
12
+
13
+ ## Harness 元信息
14
+
15
+ | 字段 | 值 |
16
+ |------|-----|
17
+ | **spec_slug** | `lifecycle-engine-min` |
18
+ | **invoke_slug** | `cyning-harness-lifecycle-engine-min` |
19
+ | **test_strategy** | `required` |
20
+ | **test_strategy_note** | 引擎:结构合法/非法 · 守卫 adapter 通过/block/unevaluated · CLI dry-run exit 码;既有 `lifecycle show` / verify / close 回归 |
21
+ | **entry_invoke_10_spec** | `Projects/docs/harness/invokes/by-task/cyning-harness-lifecycle-engine-min/invoke_20260725_10_spec_lifecycle_engine_min.md` |
22
+ | **entry_invoke_00_draft** | `Projects/docs/harness/invokes/by-task/cyning-harness-lifecycle-engine-min/invoke_20260725_00_draft_lifecycle_engine_min.md` |
23
+ | **Open Folder(实现)** | `cyning-harness/`(产品仓改码) |
24
+ | **epic_serial** | T2(T1 dogfood 卫生 → **本棒** → T3 discipline-coverage) |
25
+
26
+ ---
27
+
28
+ ## 1. 背景与目标
29
+
30
+ N1(v2.7)已落地 **`harness/lifecycle.yaml`** 与 **`lifecycle show [--json]`**:状态 / 转移 / 守卫的**登记真值**可校验、可展示。yaml 文件头与 schema 均明示「只读登记 · 不由引擎执行」。
31
+
32
+ 方向二下一台阶(RETRO #2 / Epic T2):在登记之上增加 **转移引擎最小骨架**——能对指定转移做 **dry-run 资格判定**(结构 + 部分守卫求值报告),让「补闸 / 开工前检查」从临场拼 CLI 变为**消费 lifecycle 真值**。
33
+
34
+ **一句话目标**:YAML 仍是登记;**引擎是消费方**。禁止把 N1「已有 yaml」说成「已是引擎」。
35
+
36
+ **消费者(本波)**:维护者 / Agent 在 30 前或联调时跑 `lifecycle dry-run`,得到可机读的转移资格报告(非 spawn Agent、非 G7 执行证据)。
37
+
38
+ ---
39
+
40
+ ## 2. 范围
41
+
42
+ ### D1 · 引擎库(最小 API)
43
+
44
+ - 新增(或扩展)`lib/lifecycle*.js` 导出至少:
45
+ - `dryRunTransition({ transitionId, fromState, taskPath?, harnessRoot?, flags? })`
46
+ - 返回稳定结构(人读与 `--json` 同源字段),至少含:
47
+ - `transition_id` · `from` · `to` · `hat?`
48
+ - `structure_ok`(transition 存在且 `fromState ∈ from[]`)
49
+ - `guards[]`:`{ id, severity, status: pass|fail|warn|unevaluated, detail?, allow_flag? }`
50
+ - `blocked`(任一 `severity=block` 且 `status=fail` → true)
51
+ - `unevaluated_count`
52
+ - `engine: "lifecycle-dry-run"` · `lifecycle_doc_version`(yaml `version`)
53
+ - **默认不写盘**;本波 **无** `--apply` / 无改 task `status` / 无写 invoke。
54
+
55
+ ### D2 · CLI · `lifecycle dry-run`
56
+
57
+ - `npx @cyning/harness lifecycle dry-run --transition <id> --from <state> [--task PATH] [--json] [--allow-no-review] [--allow-lint-fail] …`
58
+ - 复用既有 allow 旗名(与 verify/close 对齐);未知旗 → 明确错误
59
+ - **exit**:
60
+ - `0`:结构合法且无 block 级 `fail`(允许存在 `unevaluated` / warn;stdout 须标明 unevaluated)
61
+ - `2`:结构非法或存在 block 级 `fail`
62
+ - `1`:用法 / yaml 损坏等(与 `lifecycle show` 一致风格)
63
+ - `lifecycle show` **行为不变**;help 文案区分:show=登记只读 · dry-run=引擎资格判定
64
+
65
+ ### D3 · 守卫 adapter(薄 · 可扩展表)
66
+
67
+ - 维护 `GUARD_ADAPTERS`(或等价):`guard.id → evaluator`
68
+ - **本波必须接线**(当 `--task` 给出且 transition=`to_30` 时):
69
+ - `HG-AUDIT-R1`(复用 gate-check / 既有 human_gate 读取)
70
+ - `reviews_retention`(复用 `findReview` / verify 同语义)
71
+ - **本波允许 `unevaluated`**(须在报告中显式列出,禁止静默当 pass):
72
+ - `HG-TASK-DRAFT` · `audit_D5` · `task_lint` · `close_*` · `spec_reviews_retention` 等未接线守卫
73
+ - 无 `--task` 时:除结构外,全部守卫 → `unevaluated`(仍可 exit 0,但人读/JSON 醒目提示「未求值」)
74
+ - **禁止**本波实现「spawn 子进程跑完整 verify 再盲映射」作为唯一路径;优先 **库内复用** 既有函数。允许 30 实现时微调接线细节,但验收须可测。
75
+
76
+ ### D4 · 文档与登记语义护栏
77
+
78
+ - `harness/lifecycle.yaml` 文件头注释修订:明确「登记真值 · **由 `lifecycle dry-run` 引擎消费** · yaml 本身不是引擎」
79
+ - `schema/lifecycle.v1.schema.json` description 同步(仍不强制改字段;本波 **不**为引擎扩 schema 必填项,除非 30 发现缺字段阻塞)
80
+ - USER_GUIDE / ONBOARDING / README 短节:dry-run 用法 · 与 show 对比 · **非** G7 / **非** runner
81
+ - CHANGELOG:**2.10.0**(或 Epic 复检时实际版本号)条目
82
+
83
+ ### D5 · 测试
84
+
85
+ - 单元:结构 pass/fail;`to_30` + fixture task 下 HG-AUDIT-R1 / reviews adapter 三态;unevaluated 计数
86
+ - CLI:dry-run `--json` 字段稳定;show 回归;非法 transition id → exit ≠0
87
+ - 既有 `test/lifecycle.test.js` · verify · close 不回归
88
+
89
+ ### D6 · 版本与 Epic 对齐
90
+
91
+ - 目标版本挂 Epic 统一发版 **`2.10.0`**
92
+ - 本棒 CLOSE 后 **不**单独强制 publish;等 T3 CLOSE → 00 发版前复检 → 维护者 publish
93
+ - 若 T3 无产品 diff 且仅本棒有码:仍建议同 tag **2.10.0**(Epic 约定),由维护者裁定
94
+
95
+ ---
96
+
97
+ ## 3. 非范围
98
+
99
+ - **完整 runner**(`harness run` · Agent spawn · 帽链自动推进)
100
+ - **同波硬塞 G7**(40「真跑过」执行证据)—— 附录观察项;宜跟本引擎之后另开
101
+ - 声称 / 文档暗示 **N1 YAML「已是引擎」**
102
+ - **`--apply` / 写回 task status / 事件溯源 / 持久化转移日志**
103
+ - 把全部 yaml 守卫一次性接线完毕(本波允许 unevaluated 清单)
104
+ - N2-C lint→block · G6 · HGM · discipline-coverage(T3)· dogfood 缺审补文(T1)
105
+ - 改变既有 `verify` / `task close` 的闸语义(引擎是**旁路报告**,不替换 verify 作为 30 硬闸;除非未来另 SPEC 规定「dry-run 替代」——本波不做)
106
+
107
+ ---
108
+
109
+ ## 4. 验收标准
110
+
111
+ - [ ] `lifecycle dry-run --transition to_30 --from draft --task <fixture>`:结构 ok;至少 `HG-AUDIT-R1` 与 `reviews_retention` 出现非 `unevaluated` 的 `pass|fail`(按夹具)
112
+ - [ ] 非法 `transition` id 或 `from` 不在 `from[]` → `structure_ok=false` · exit 2(或 1,须在实现/自检写死并测)
113
+ - [ ] 无 `--task`:可 exit 0(结构合法时)但 JSON/`unevaluated_count` > 0 且人读标明未求值
114
+ - [ ] block 守卫 adapter 返回 fail → `blocked=true` · exit 2
115
+ - [ ] `lifecycle show` 仍只读登记 · 行为与 v2.7+ 兼容
116
+ - [ ] 文档明确:**yaml ≠ 引擎**;dry-run ≠ runner / ≠ G7
117
+ - [ ] `npm test` 全绿
118
+ - [ ] CHANGELOG 含 2.10.0(或 Epic 实发版本)条目;Epic / RETRO #2 可回链本 SPEC
119
+
120
+ ---
121
+
122
+ ## 5. failure_paths
123
+
124
+ | 触发条件 | 系统行为 | 可重试 |
125
+ |----------|----------|--------|
126
+ | lifecycle.yaml 缺失/损坏 | dry-run 失败 · 信息可定位(同 show) | 修 yaml / 升级包 |
127
+ | 未知 `--transition` | exit ≠0 · 列出已知 id 或提示 `lifecycle show` | 改参数 |
128
+ | `--from` ∉ transition.from | `structure_ok=false` · blocked | 改 from 或选对 transition |
129
+ | `--task` 路径不可读 | exit ≠0 · 可定位 | 修路径 |
130
+ | 守卫 adapter 内部依赖失败(如 gate 文件缺失) | 该守卫 `fail` 或显式 `detail`;不伪装 pass | 补闸表 / 修 task |
131
+ | 用户误以为 unevaluated=已通过 | 文档 + JSON `unevaluated_count` + 人读 WARN 行 | — |
132
+ | 用户误以为 dry-run 可替代 verify 进 30 | 文档醒目:旁路报告;30 仍以既有 verify/gate 为准 | — |
133
+ | 业务仓未升级到含 dry-run 的版本 | 无子命令 | upgrade |
134
+
135
+ ---
136
+
137
+ ## 6. 依赖与引用
138
+
139
+ - 产品仓:`harness/lifecycle.yaml` · `lib/lifecycle.js` · `lib/cli.js` `cmdLifecycle` · `schema/lifecycle.v1.schema.json` · `test/lifecycle.test.js`
140
+ - 守卫复用候选:`lib/verify.js` · gate-check / human_gate · `findReview`(与 v2.5+/v2.9 语义对齐)
141
+ - 上游 SPEC:[`SPEC-lifecycle-and-verify-lint_v1.md`](./SPEC-lifecycle-and-verify-lint_v1.md)(N1 非范围「状态机引擎」→ 本 SPEC 承接)
142
+ - Epic 串行:T1 CLOSE 后才允许本 task **HG-AUDIT-R1 → 30**;SPEC 签收与 00 起草 task **可在 T1 完成前并行**(不挡文档轨)
143
+
144
+ ---
145
+
146
+ ## 7. 思考轮(10-spec 回填 · R0–R5)
147
+
148
+ ### R0 · 读入与约束
149
+
150
+ 读入:Epic T2 · RETRO #2(方向二转移引擎最小骨架)· N1 SPEC(yaml+show · **明确不做引擎**)· 现状 `lifecycle.yaml` / `lib/lifecycle.js`(load+validate+format · 无转移 API)· CLI 仅 `lifecycle show` · 产品仓 **2.9.0** · 统一发版建议 **2.10.0**。
151
+
152
+ 硬约束:
153
+
154
+ 1. 不做完整 runner;不同波硬塞 G7
155
+ 2. 不声称 N1 YAML 已是引擎
156
+ 3. early_stop=no(无充分理由裁轮)
157
+ 4. Open Folder 实现 = `cyning-harness/`;本 10-spec 只写 SPEC/invoke
158
+
159
+ ### R1 · 范围 / 非范围 / 场景
160
+
161
+ **场景**:
162
+
163
+ 1. Agent/人:`lifecycle dry-run --transition to_30 --from draft --task path` → 得资格报告,再决定是否跑 verify / 开 30
164
+ 2. 无 task:只验证「该转移在 yaml 里从该状态是否合法」+ 守卫清单 unevaluated
165
+ 3. 维护者对照 show vs dry-run:登记 vs 求值
166
+
167
+ **范围边界**:引擎 = dry-run 资格判定 + 薄 adapter;**非**状态写回、**非**帽执行、**非** G7。
168
+ **非范围**:见 §3。与 T1/T3 切分清晰。
169
+
170
+ ### R2 · 方案对比
171
+
172
+ | 方案 | 内容 | 利 | 弊 | 裁定 |
173
+ |------|------|----|----|------|
174
+ | **A** | 仅结构 dry-run(from∈from[] · id 存在),守卫一律打印不求值 | 极小 diff | 相对 show 增量弱;难称「引擎」 | **弃** |
175
+ | **B** | 结构 + 薄 adapter(本波接线 to_30 核心 block 子集)+ 其余 `unevaluated`;**无 apply** | 真消费 yaml;边界清;可测;不撞 G7/runner | 守卫覆盖不全须文档说清 | **推荐 · 本波** |
176
+ | **C** | B + `--apply` 写 task status | 「可执行转移」字面更满 | 易与 close/verify 双写;半成品状态机;超最小骨架 | **弃(residual)** |
177
+ | **D** | 完整 runner / `harness run` / G7 同波 | 方向二终局感 | Epic 明禁;无消费者契约 | **禁** |
178
+
179
+ **CLI 命名**:`lifecycle dry-run`(相对 `transition --dry-run`)—— 默认语义即 dry-run,降低误触 apply。
180
+ **与 verify 关系**:旁路报告,**不**在本波把 dry-run 设为 `may_start_30` 唯一真值。
181
+ **版本**:挂 **2.10.0**(Epic 统一),不拆 2.10 docs / 2.11 engine。
182
+
183
+ ### R3 · 边界 / 失败语义 / 安全
184
+
185
+ - **挂点**:dry-run 在「读 yaml + 可选读 task」时刻求值;不修改仓库文件。
186
+ - **误报**:unevaluated 不得计为 pass;block fail 必须挡 exit。
187
+ - **泄压**:复用 `--allow-no-review` / `--allow-lint-fail` 等**已存在**旗(仅当对应 adapter 接线后生效;未接线则旗可忽略或 WARN「无效果」——实现时选一并测)。
188
+ - **安全**:无网络;无任意 shell(`command_or_check` 字段本波仍是**描述串**,不当 shell 执行)。
189
+ - **兼容**:旧仓无 dry-run 子命令;show 不变。
190
+ - **串行**:SPEC/task 文档可先行;**30 改码**受 Epic「T1 CLOSE」约束。
191
+
192
+ ### R4 · 验收 / 可测性 / test_strategy
193
+
194
+ `test_strategy: required`。夹具覆盖:结构失败、adapter pass/fail、无 task 的 unevaluated、JSON 字段、show 回归。验收清单 §4 均可自动化或 CLI 断言。图谱无需 bootstrap。
195
+
196
+ ### R5 · SPEC 签收就绪 · 是否可交 00 出 task
197
+
198
+ SPEC 自足:D1–D6、非范围、failure_paths、R2 裁定(方案 B)已写死。
199
+ **可交人签** → 签后 **00 起草 task**(slug `cyning-harness-lifecycle-engine-min`)。
200
+ 建议:可选轻量 **20-spec-audit R1**;维护者亦可用对话「签收」直接 HG-SPEC-SIGNOFF。
201
+ **提醒 00**:task 元信息注明 Epic T2 · `target_version: 2.10.0` · Open Folder=`cyning-harness/` · `human_gate` 进 30 前核对 T1 CLOSE。
202
+
203
+ ### 思考轮控制
204
+
205
+ | 字段 | 值 |
206
+ |------|-----|
207
+ | `actual_last_round` | `R5` |
208
+ | `early_stop` | `no` |
209
+ | `early_stop_reason` | — |
210
+ | `residual_risks` | ① adapter 覆盖不全 → 用户误读 unevaluated;② 未来 `--apply` / G7 边界需另 SPEC;③ dry-run 与 verify 双轨可能短期认知负担;④ Epic 发版节奏依赖 T3,本棒 CLOSE≠立即 npm publish |
211
+ | `round_extension_note` | — |
212
+
213
+ ---
214
+
215
+ ## 8. 下一棒可复制 Prompt(人签后 · 00 task)
216
+
217
+ ```text
218
+ 你是 Harness 00 编排 Agent,当前相位:起草 task(不写产品代码)。
219
+
220
+ 输入:
221
+ - SPEC 已签收:cyning-harness/docs/spec/SPEC-lifecycle-engine-min_v1.md(状态须为 signed / HG-SPEC-SIGNOFF)
222
+ - Epic:docs/harness/guides/EPIC_post_g4_menu_serial_t1t2t3_v1_zh.md · 串行 T2
223
+ - slug:cyning-harness-lifecycle-engine-min
224
+ - Open Folder(实现):cyning-harness/
225
+ - target_version:2.10.0(Epic 统一发版;不代 publish)
226
+ - 约束:方案 B(dry-run + 薄 adapter · 无 apply · 无 G7/runner);T1 CLOSE 前不得签 HG-AUDIT-R1 进 30
227
+
228
+ 【交付 · 须落盘】
229
+ 1) task:docs/harness/tasks/active/task_cyning_harness_lifecycle_engine_min_v1.md
230
+ - 投影 SPEC §2–§5;test_strategy=required;human_gate 表完整
231
+ - §4 预留 10-task 思考轮槽
232
+ 2) invoke:docs/harness/invokes/by-task/cyning-harness-lifecycle-engine-min/invoke_*_00_draft_*.md(可选快照)
233
+ 3) 勿改产品仓 lib/;勿 commit(除非维护者要求)
234
+
235
+ 【下一棒】
236
+ 10-task:回填 task §5 R0–R5 → 20-task-audit → 人签 HG-AUDIT-R1(且 T1 CLOSE)→ 30
237
+ ```
238
+
239
+ ---
240
+
241
+ ## 修订记录
242
+
243
+ | 日期 | 摘要 |
244
+ |------|------|
245
+ | 2026-07-25 | 10-spec R0–R5 · Epic T2 / RETRO #2 · draft 落盘 · early_stop=no |
246
+ | 2026-07-25 | 维护者签收(对话「签收」)→ `signed` · 00 起草 task · N3 纸链审查文 |