@cyning/harness 2.12.0 → 2.12.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
@@ -4,6 +4,25 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [2.12.1] - 2026-07-26
8
+
9
+ ### Fixed
10
+
11
+ - **invoke 文件名 hat 扫描**:改为日期后的**前缀 hat run**;slug 中的 `10`/`40` 等不再误计为已覆盖;去掉整名 `/CLOSE/i` 裸匹配。
12
+ - `lifecycle.yaml`:删除 `invoke_hats_retention` 别名守卫,仅保留 `close_invoke`。
13
+
14
+ ### Changed
15
+
16
+ - `verify` / 单测收紧:缺口 WARN 用例断言 exit 0;补误计负例与 lint **W6**。
17
+ - USER_GUIDE §6.0 · TEMPLATE_invoke 命名约束 · 10-task 提及 W6。
18
+ - `discipline-coverage.yaml` `as_of` → **2.12.1**。
19
+
20
+ ### Notes
21
+
22
+ - patch · 对规范命名无影响;依赖 slug 误计的畸形文件名 close 可能新 BLOCK
23
+ - 迁移指引:[`docs/USER_GUIDE_v1.0_zh.md`](docs/USER_GUIDE_v1.0_zh.md) §6.0(不另造 RUNBOOK)
24
+ - **已发布**:tag `v2.12.1` 已推送(2026-07-26)· npm publish 后将 `@cyning/harness@2.12.1` 标为 `latest`
25
+
7
26
  ## [2.12.0] - 2026-07-26
8
27
 
9
28
  ### Added
@@ -15,14 +34,15 @@
15
34
 
16
35
  ### Changed
17
36
 
18
- - `lifecycle.yaml` close 守卫登记 `invoke_hats_retention`;`discipline-coverage.yaml` `as_of` → **2.12.0** · gaps `INVOKE-HATS`。
37
+ - `lifecycle.yaml` close 守卫升级 `close_invoke`(集合覆盖);`discipline-coverage.yaml` `as_of` → **2.12.0** · gaps `INVOKE-HATS`。
19
38
  - TASK_TEMPLATE / TEMPLATE_invoke / 10·20·30 帽文同步字段与纪律。
20
39
 
21
40
  ### Notes
22
41
 
23
42
  - SPEC:`docs/spec/SPEC-invoke-hats-retention-gate_v1.md`
24
43
  - **破坏性(close)**:无字段时按 default 要求 10+30+40;存量仅 30 的 active 须补档、改 `minimal` 或 `--allow-invoke-gap`
25
- - minor · 建议业务仓 upgrade 后按 RUNBOOK 勾选 invoke 集合
44
+ - minor · 建议业务仓 upgrade 后按 [`USER_GUIDE` §6.0](docs/USER_GUIDE_v1.0_zh.md) 勾选 invoke 集合
45
+ - **已发布**:`@cyning/harness@2.12.0`(npm `latest` · 2026-07-26)· tag `v2.12.0` 已推送
26
46
 
27
47
  ## [2.11.1] - 2026-07-25
28
48
 
@@ -207,6 +207,20 @@ Schema:[`schema/verify_result.v1.schema.json`](../schema/verify_result.v1.sche
207
207
 
208
208
  Audit **不替代** 维护者判断;22 内容质量仍须人读 review。详见 [`ONBOARDING.md`](./ONBOARDING.md) §2.2。
209
209
 
210
+ ### 6.0 多帽 invoke 留档(v2.12+)
211
+
212
+ `task close` 按 task 元信息校验 `by-task/<slug>/` 下 invoke 文件名所覆盖的 **hat 集合**(缺省要求 `10,30,40`)。
213
+
214
+ | 字段 / 手段 | 说明 |
215
+ | --- | --- |
216
+ | `invoke_retention_profile` | `default`=`10,30,40` · `minimal`=`30` · `full`=`00,10,20,30,40,CLOSE` |
217
+ | `required_invoke_hats` | 显式列表,**优先于** profile |
218
+ | 命名 | `invoke_YYYYMMDD_<hat>[_<hat>...]_<slug>.md`;hat 只在日期后连续前缀(例 `30_40` 可双计);**slug 段勿夹** `10`/`40` 等(v2.12.1 起不误计) |
219
+ | `--allow-invoke-gap` | close / `verify --task` 缺帽豁免并留痕 |
220
+ | 存量仅 30 | upgrade 后:补 `10`/`40` 档、或改 `minimal`、或显式 `--allow-invoke-gap` |
221
+
222
+ `verify --task` 对缺口仅 **WARN**,不挡 `may_start_30`;硬闸在 close。
223
+
210
224
  ### 6.1 SDD-Compliance bench(维护者 · 可选)
211
225
 
212
226
  > **业务仓日常不必跑**;用于验证 `gate-check` / `sync` 公理行为,或对照 README「试点证据」中的 bench 数字。
@@ -6,7 +6,7 @@
6
6
  # 禁止:把本文件当「每周全量重盘」流程;不做 audit --discipline UI(本波)
7
7
 
8
8
  version: "1"
9
- as_of_package_version: "2.12.0"
9
+ as_of_package_version: "2.12.1"
10
10
  scope: "Starter · harness/prompts (10/22/30/40 + FRAGMENT)+ TEMPLATE_invoke"
11
11
  source_audit: "rethink/2026-07-mechanization-rate · 02 转录 + 03 聚合 · 状态已按 G1–G4/N1–N4 刷新(非第二轮通读盘点)"
12
12
 
@@ -114,7 +114,7 @@ statements:
114
114
  status: mechanical
115
115
  mechanism: "M5 close evaluateInvokeHatsRetention + M6 lint-done"
116
116
  gap: null
117
- notes: "v2.12.0 默认 10,30,40;profile minimal/full;--allow-invoke-gap"
117
+ notes: "v2.12.0 默认 10,30,40;profile minimal/full;--allow-invoke-gap;v2.12.1 前缀 hat run"
118
118
  mechanism_quality: null
119
119
  - id: A7
120
120
  source: 30-execute-code.md
@@ -274,7 +274,7 @@ statements:
274
274
  status: mechanical
275
275
  mechanism: "M5 evaluateInvokeHatsRetention / M6"
276
276
  gap: null
277
- notes: "v2.12.0 文件名 hat token · 合并 30_40 可双计"
277
+ notes: "v2.12.0+ 文件名 hat token · 合并 30_40 可双计 · v2.12.1 前缀 run 防 slug 误计"
278
278
  mechanism_quality: null
279
279
  - id: F2
280
280
  source: TEMPLATE_invoke.md
@@ -45,7 +45,7 @@
45
45
  | 打回重开 | 新文件或 `_r2` 后缀 |
46
46
  | 与 reviews 分工 | reviews = 结论;invoke = **当时指令** |
47
47
  | close 机械闸 | `harness task close` 按 task 元信息 `required_invoke_hats` / `invoke_retention_profile` 校验帽集合覆盖(v2.12+;缺省 `10,30,40`;文件名含 `30_40` 可双计;`--allow-invoke-gap` 豁免) |
48
- | 命名 | `invoke_YYYYMMDD_<hat>_<slug>.md` `invoke_YYYYMMDD_30_40_<slug>.md` |
48
+ | 命名 | `invoke_YYYYMMDD_<hat>[_<hat>...]_<slug>.md`(hat token **仅**在日期后、slug 前连续段;slug 勿夹 `10`/`40` 等白名单段 · v2.12.1) |
49
49
  | commit | 落盘 + task 回填后再 commit(见 HANDOFF) |
50
50
 
51
51
  ---
@@ -69,11 +69,7 @@ transitions:
69
69
  command_or_check: "task close 检查1 · invoke hats 集合覆盖(required_invoke_hats / profile · v2.12+)"
70
70
  severity: block
71
71
  allow_flag: "--allow-invoke-gap"
72
- note: "缺省 default=10,30,40;minimal=30;full 含 CLOSE;40 可与 30 合并文件名"
73
- - id: invoke_hats_retention
74
- command_or_check: "evaluateInvokeHatsRetention · 同 close_invoke(登记别名)"
75
- severity: block
76
- allow_flag: "--allow-invoke-gap"
72
+ note: "缺省 default=10,30,40;minimal=30;full 含 CLOSE;40 可与 30 合并文件名;v2.12.1 去掉 invoke_hats_retention 别名"
77
73
  - id: close_self_check
78
74
  command_or_check: "task close 检查2 · 自检结论已回填"
79
75
  severity: block
@@ -33,7 +33,7 @@
33
33
  ## 交接物
34
34
 
35
35
  - 可粘贴进 `docs/tasks/active/task_*.md` 的正文块;并注明建议 `test_strategy`。
36
- - 产出 task 须 `npx @cyning/harness task lint --file <task>` PASS(v2.3+ · 结构闸 E1–E7 / W1–W3)。
36
+ - 产出 task 须 `npx @cyning/harness task lint --file <task>` PASS(v2.3+ · 结构闸 E1–E7 / W1+;v2.12+ 含 **W6** invoke 留档字段提醒)。
37
37
  - 承接 **20-task-audit 审查**:按 `docs/harness/reviews/*_audit_*.md` 回填 task。
38
38
 
39
39
  ## OSS 阶段 C · 思考轮(Starter 摘要)
package/lib/task-meta.js CHANGED
@@ -456,18 +456,15 @@ export function resolveRequiredInvokeHats(meta = {}) {
456
456
  }
457
457
 
458
458
  /**
459
- * 从 invoke 文件名提取 hat token 集合。
459
+ * 从 invoke 文件名提取 hat token 集合(v2.12.1+:前缀 hat run)。
460
460
  * 兼容:invoke_YYYYMMDD_30_slug.md · invoke_YYYYMMDD_30_40_slug.md · invoke_*_CLOSE_*.md
461
+ * 只消费日期后的**连续前缀** hat token;遇第一个非 hat 段即停(其后为 slug,不误计)。
461
462
  * 亦认 22→20(V2 改名等价,计为 20)。
462
463
  */
463
464
  export function extractHatsFromInvokeFilename(fileName) {
464
465
  const base = path.basename(fileName, '.md');
465
466
  const hats = new Set();
466
467
 
467
- if (/CLOSE/i.test(base)) {
468
- hats.add('CLOSE');
469
- }
470
-
471
468
  // 去 invoke_ 前缀与可选日期段
472
469
  let rest = base.replace(/^invoke[_-]?/i, '');
473
470
  rest = rest.replace(/^\d{8}[_-]?/, '');
@@ -482,7 +479,10 @@ export function extractHatsFromInvokeFilename(fileName) {
482
479
  }
483
480
  if (KNOWN_INVOKE_HAT_TOKENS.has(p)) {
484
481
  hats.add(normalizeHatToken(p));
482
+ continue;
485
483
  }
484
+ // 首个非 hat 段起视为 slug · 停止扫描(防 slug 含 10/40 误计)
485
+ break;
486
486
  }
487
487
 
488
488
  // V2:22 与 20 等价(审 task)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyning/harness",
3
- "version": "2.12.0",
3
+ "version": "2.12.1",
4
4
  "description": "cyning-harness discipline package · init / upgrade / check CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",