agentic-flow-kit 1.8.1 → 1.8.7

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 (74) hide show
  1. package/README.md +1 -1
  2. package/modules/hosts/claude/commands/wf-build.md +1 -1
  3. package/modules/hosts/claude/commands/wf-design.md +1 -1
  4. package/modules/hosts/claude/commands/wf-new-task.md +1 -0
  5. package/modules/hosts/claude/commands/wf-review.md +1 -1
  6. package/modules/hosts/codex/commands/wf-build.md +1 -1
  7. package/modules/hosts/codex/commands/wf-design.md +1 -1
  8. package/modules/hosts/codex/commands/wf-new-task.md +1 -0
  9. package/modules/hosts/codex/commands/wf-review.md +1 -1
  10. package/modules/hosts/cursor/commands/wf-build.md +1 -1
  11. package/modules/hosts/cursor/commands/wf-design.md +1 -1
  12. package/modules/hosts/cursor/commands/wf-new-task.md +1 -0
  13. package/modules/hosts/cursor/commands/wf-review.md +1 -1
  14. package/modules/hosts/opencode/commands/wf-build.md +1 -1
  15. package/modules/hosts/opencode/commands/wf-design.md +1 -1
  16. package/modules/hosts/opencode/commands/wf-new-task.md +1 -0
  17. package/modules/hosts/opencode/commands/wf-review.md +1 -1
  18. package/modules/hosts/trae/commands/wf-build.md +1 -1
  19. package/modules/hosts/trae/commands/wf-design.md +1 -1
  20. package/modules/hosts/trae/commands/wf-new-task.md +1 -0
  21. package/modules/hosts/trae/commands/wf-review.md +1 -1
  22. package/package.json +1 -1
  23. package/src/jscpd-drift.test.mjs +3 -2
  24. package/templates/AGENTS.md +1 -0
  25. package/templates/_agents/commands/build.md +1 -1
  26. package/templates/_agents/commands/design.md +1 -1
  27. package/templates/_agents/commands/new-task.md +1 -0
  28. package/templates/_agents/commands/review.md +1 -1
  29. package/templates/_agents/engine-lock.json +32 -24
  30. package/templates/_agents/hooks/commit-check.cjs +57 -30
  31. package/templates/_agents/mechanism-registry.md +8 -0
  32. package/templates/_agents/notes/engine-internals.md +17 -0
  33. package/templates/_agents/rule-budgets.txt +10 -2
  34. package/templates/_agents/scripts/agg-judgments.mjs +77 -1
  35. package/templates/_agents/scripts/agg-judgments.test.mjs +49 -1
  36. package/templates/_agents/scripts/archive-sweep.mjs +3 -1
  37. package/templates/_agents/scripts/check-convergence.mjs +8 -3
  38. package/templates/_agents/scripts/check-lane-surface.mjs +9 -2
  39. package/templates/_agents/scripts/check-lane-surface.test.mjs +17 -3
  40. package/templates/_agents/scripts/check-ledger-invariant.mjs +109 -24
  41. package/templates/_agents/scripts/check-ledger-invariant.test.mjs +29 -1
  42. package/templates/_agents/scripts/check-loop-rev.test.mjs +8 -14
  43. package/templates/_agents/scripts/check-loop.mjs +41 -3
  44. package/templates/_agents/scripts/check-loop.test.mjs +37 -0
  45. package/templates/_agents/scripts/check-scope.test.mjs +4 -1
  46. package/templates/_agents/scripts/check-scripts-syntax.mjs +33 -10
  47. package/templates/_agents/scripts/closeout-l1.mjs +217 -0
  48. package/templates/_agents/scripts/closeout-l1.test.mjs +105 -0
  49. package/templates/_agents/scripts/commit-check-trigger.test.mjs +49 -0
  50. package/templates/_agents/scripts/confirm-doc.mjs +27 -8
  51. package/templates/_agents/scripts/confirm-doc.test.mjs +68 -9
  52. package/templates/_agents/scripts/gen-workflow-metrics.mjs +158 -9
  53. package/templates/_agents/scripts/gen-workflow-metrics.test.mjs +119 -0
  54. package/templates/_agents/scripts/lane-surface-audit.test.mjs +1 -1
  55. package/templates/_agents/scripts/ledger-shards.mjs +42 -5
  56. package/templates/_agents/scripts/ledger-shards.test.mjs +17 -0
  57. package/templates/_agents/scripts/mechanism-retire-watch.mjs +183 -0
  58. package/templates/_agents/scripts/mechanism-retire-watch.test.mjs +114 -0
  59. package/templates/_agents/scripts/pre-push.test.mjs +27 -11
  60. package/templates/_agents/scripts/rule-budget.mjs +14 -1
  61. package/templates/_agents/scripts/rule-budget.test.mjs +118 -0
  62. package/templates/_agents/scripts/solidify-task.mjs +3 -1
  63. package/templates/_agents/scripts/solidify-task.test.mjs +10 -10
  64. package/templates/_agents/scripts/trust-mode.test.mjs +1 -1
  65. package/templates/_agents/scripts/verify.mjs +237 -78
  66. package/templates/_agents/scripts/verify.test.mjs +44 -0
  67. package/templates/_agents/scripts-test-exempt.txt +2 -1
  68. package/templates/_agents/skills/review-method/SKILL.md +3 -0
  69. package/templates/_githooks/pre-commit +9 -4
  70. package/templates/_githooks/pre-merge-commit +4 -3
  71. package/templates/_githooks/pre-push +129 -75
  72. package/templates/workflow/README.md +2 -1
  73. package/templates/workflow/intents/_TEMPLATE.md +5 -0
  74. package/templates/workflow/specs/_TEMPLATE.md +1 -1
@@ -1,82 +1,136 @@
1
- #!/bin/sh
2
- # Git 原生 pre-push hook(经 core.hooksPath 挂载,git push 时触发)
3
- # 跑 .agents/scripts/check-loop.sh:扫 workflow/ 闭环骨架断档(2026-10-13 分道——默认只扫硬门,源仓同款)
4
- # - 硬阻断(exit 1)= 配对断裂 / 回路断档 等硬门违例 → push 立即阻断
5
- # - 卫生项(索引/宿主/词表/体积预算等 WARN 面)不进 push 门——要看时手跑 check-loop.mjs --hygiene
6
- # (--all 两面都跑 = 分道前的裸跑全量)
7
- # stdin 有行时,每个非删除的本地 sha 用 --rev 扫那棵树。没有行时(手跑钩子)仍无参数扫工作区。
8
- #
9
- # experiment/* 泳道(2026-09-30 hybrid-governance-explore-hardening):**目标分支**为 experiment/* 时,
10
- # 闭环扫描降级 advisory(报告不阻断)——快速 PoC 推送不因闭环断档被拦;转正(目标为 main)由加固门兜底。
11
- # 加固门(同日;2026-10-01 v09-review-defects 修正判定键):推送**目标**为 refs/heads/main 时以
12
- # --hardening 运行(无论来源分支——experiment/* 直推 main 同样覆盖),exploring 任务须先收口
13
- # (intent approved/done + 同名 plan 在场 + L2/L3 另须同名 spec;判据见 check-loop.mjs 加固门段),
14
- # hard 失败即阻断 push,防「未文档化的探索件」进 main。
15
- #
16
- # 机器门:本地钩子跑 check-loop.sh。装户仓的远端门是随包下发的 .github/workflows/kit-ci.yml(verify.mjs)。
17
- # kit 源仓:.github/workflows/ci.yml 于 push main / 全部 PR 跑 npm test(lint + 全量套件)。
18
- # 装户仓无包源 templates/:sync-hosts 等包源命令不适用。本地钩子仍是提交时刻的机器门。
19
- # 不要用 `git push --no-verify` 绕开——发现 hard-block 应先修 workflow 文档再推。
1
+ #!/usr/bin/env node
2
+ // Git 原生 pre-push hook(经 core.hooksPath 挂载,git push 时触发)— agentic-flow-kit 通用编排
3
+ // 2026-10-16 node 化(自源仓 2ff869a9/13f67ef7 回灌 pre-push 面):钩子体不再含 sh 逻辑——git 仍以自带
4
+ // sh 启动本文件(钩子机制要求),但 shebang 即 node,PATH 无 sh 不影响任何逻辑。写法为 CommonJS——
5
+ // 无扩展名文件 node 缺省按 CJS 解析,不依赖 ≥22.7 的 ESM 语法探测。
6
+ // 跑 .agents/scripts/check-loop.mjs:扫 workflow/ 闭环骨架断档(默认只扫硬门)
7
+ // - 硬阻断(exit 1)= 配对断裂 / 回路断档 / 证据与确认链 / 发版未收口 → push 立即阻断
8
+ // - 卫生段(模板占位 / 引用漂移 / 宿主副本 / 索引)不在本钩子。要看时跑 --hygiene 或 --all
9
+ // stdin 有行时,每个非删除的本地 sha 用 --rev 扫那棵树。没有行时(手跑钩子)仍无参数扫工作区。
10
+ //
11
+ // 构建门(2026-10-16 自 pre-commit 后移):另跑 commit-check.cjs --range <old> <new> 按推送范围条件构建
12
+ // (常规提交时刻只做敏感扫描——提交内环提速;构建执法集中到推送与关单)。范围匹配逻辑单源 =
13
+ // commit-check.cjs。experiment/* 目标降级 advisory。手动运行(无 stdin 推送行)无范围事实,构建门跳过。
14
+ //
15
+ // experiment/* 泳道:**目标分支**为 experiment/* 时,闭环扫描与构建门降级 advisory(报告不阻断)——
16
+ // 快速 PoC 推送不因闭环断档/构建失败被拦;转正(目标为 main)由加固门兜底。
17
+ // 加固门(2026-10-01 v09-review-defects):推送**目标**为 refs/heads/main 时以 --hardening 运行
18
+ // (无论来源分支——experiment/* 直推 main 同样覆盖),exploring 任务须先收口(intent approved/done +
19
+ // 同名 plan 在场 + L2/L3 另须同名 spec;判据见 check-loop.mjs 加固门段),hard 失败即阻断 push。
20
+ //
21
+ // 回路日检(2026-10-16 自源仓 13f67ef7 回灌):退役催办与 papercut 报债此前无调度,机制空转。每个
22
+ // 本地日在推送成功路径跑一次,advisory,失败不改退出码。摘要落 .agents/cache/loop-watch.jsonl(gitignore)。
23
+ //
24
+ // 机器门:本地钩子跑 check-loop.mjs。装户仓的远端门是随包下发的 .github/workflows/kit-ci.yml(verify.mjs)。
25
+ // kit 源仓:.github/workflows/ci.yml 于 push main / 全部 PR 跑 npm test(lint + 全量套件)。
26
+ // 不要用 `git push --no-verify` 绕开——发现 hard-block 应先修 workflow 文档再推。
27
+ const { spawnSync } = require('node:child_process');
28
+ const fs = require('node:fs');
20
29
 
21
- cd "$(git rev-parse --show-toplevel)" || exit 1
30
+ const top = spawnSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' });
31
+ if (top.status !== 0 || !top.stdout.trim()) {
32
+ console.error('pre-push: 无法定位仓库根——推送已阻止');
33
+ process.exit(1);
34
+ }
35
+ process.chdir(top.stdout.trim());
36
+
37
+ const LOOP = '.agents/scripts/check-loop.mjs';
38
+ if (!fs.existsSync(LOOP)) {
39
+ console.error(`pre-push: 未找到 ${LOOP}——闭环扫描无法执行,推送已阻止(脚本随包下发;flow-kit sync 恢复后重试)`);
40
+ process.exit(1);
41
+ }
42
+ // 构建门脚本(2026-10-16 自 pre-commit 后移):缺失 fail-closed
43
+ const BUILD_CHECK = '.agents/hooks/commit-check.cjs';
44
+ if (!fs.existsSync(BUILD_CHECK)) {
45
+ console.error(`pre-push: 未找到 ${BUILD_CHECK}——构建门无法执行,推送已阻止(脚本随包下发;git checkout -- ${BUILD_CHECK} 恢复后重试)`);
46
+ process.exit(1);
47
+ }
22
48
 
23
- SCRIPT=".agents/scripts/check-loop.sh"
24
- if [ ! -f "$SCRIPT" ]; then
25
- echo "pre-push: 未找到 $SCRIPT,跳过闭环扫描" >&2
26
- exit 0
27
- fi
49
+ const runLoop = (args = []) => spawnSync(process.execPath, [LOOP, ...args], { stdio: 'inherit' });
50
+ // 范围参数:远端全零 sha(新分支首推)→ 全量构建语义(commit-check 认全零 old)
51
+ const rangeArgsOf = (remoteSha, localSha) => ['--range', remoteSha && !/^0+$/.test(remoteSha) ? remoteSha : '0'.repeat(40), localSha];
28
52
 
29
- run_loop() {
30
- if command -v sh >/dev/null 2>&1; then
31
- sh "$SCRIPT" "$@"
32
- else
33
- bash "$SCRIPT" "$@"
34
- fi
53
+ let stdinText = '';
54
+ try { stdinText = fs.readFileSync(0, 'utf8'); } catch { stdinText = ''; }
55
+
56
+ let saw = 0;
57
+ let rc = 0;
58
+ for (const line of stdinText.split(/\r?\n/)) {
59
+ if (!line.trim()) continue;
60
+ const parts = line.trim().split(/\s+/);
61
+ if (parts.length < 4) continue;
62
+ const [localRef, localSha, remoteRef, remoteSha] = parts;
63
+ saw = 1;
64
+ if (/^0+$/.test(localSha)) continue; // 删除推送不扫
65
+ // 按目标分支分派(判定键 = remote_ref):
66
+ // main → 加固门(必带 --hardening);experiment/* → advisory(报告不阻断);其他 → 全量扫描(硬门)
67
+ if (/^refs\/heads\/main$|^main$/.test(remoteRef)) {
68
+ const r = runLoop(['--rev', localSha, '--hardening']);
69
+ if (r.status !== 0 && rc === 0) rc = r.status === null ? 1 : r.status;
70
+ const rb = spawnSync(process.execPath, [BUILD_CHECK, ...rangeArgsOf(remoteSha, localSha)], { stdio: 'inherit' });
71
+ if (rb.status !== 0 && rc === 0) rc = rb.status === null ? 1 : rb.status;
72
+ } else if (/^refs\/heads\/experiment\/|^experiment\//.test(remoteRef)) {
73
+ console.error(`pre-push: experiment/* 目标分支(${remoteRef})——闭环扫描与构建门降级 advisory,不阻断`);
74
+ const adv = spawnSync(process.execPath, [LOOP, '--rev', localSha], { stdio: 'inherit' });
75
+ if (adv.status !== 0) console.error('pre-push: (advisory)闭环断档已在上方列出——experiment 泳道可推送,转正(推 main)须过加固门');
76
+ const advB = spawnSync(process.execPath, [BUILD_CHECK, ...rangeArgsOf(remoteSha, localSha)], { stdio: 'inherit' });
77
+ if (advB.status !== 0) console.error('pre-push: (advisory)构建门未过已在上方列出——experiment 泳道不阻断推送');
78
+ } else {
79
+ const r = runLoop(['--rev', localSha]);
80
+ if (r.status !== 0 && rc === 0) rc = r.status === null ? 1 : r.status;
81
+ const rb = spawnSync(process.execPath, [BUILD_CHECK, ...rangeArgsOf(remoteSha, localSha)], { stdio: 'inherit' });
82
+ if (rb.status !== 0 && rc === 0) rc = rb.status === null ? 1 : rb.status;
83
+ }
35
84
  }
36
85
 
37
- saw=0
38
- rc=0
39
- while read -r local_ref local_sha remote_ref _remote_sha; do
40
- saw=1
41
- case "$local_sha" in
42
- *[!0]*) ;;
43
- *) continue ;;
44
- esac
45
- # 按目标分支三态分派(2026-10-01 v09-review-defects:判定键从 local_ref 改为 remote_ref——
46
- # 修复 experiment/*→main 直推被 advisory continue 吞掉加固门的漏口):
47
- # main → 加固门(必带 --hardening)
48
- # experiment/* → advisory(报告不阻断)
49
- # 其他 → 全量扫描
50
- case "$remote_ref" in
51
- refs/heads/main|main)
52
- run_loop --rev "$local_sha" --hardening
53
- ;;
54
- refs/heads/experiment/*|experiment/*)
55
- echo "pre-push: experiment/* 目标分支($remote_ref)——闭环扫描降级 advisory,不阻断" >&2
56
- if command -v sh >/dev/null 2>&1; then
57
- sh "$SCRIPT" --rev "$local_sha" >&2 || echo "pre-push: (advisory)闭环断档已在上方列出——experiment 泳道可推送,转正(推 main)须过加固门" >&2
58
- else
59
- bash "$SCRIPT" --rev "$local_sha" >&2 || echo "pre-push: (advisory)闭环断档已在上方列出——experiment 泳道可推送,转正(推 main)须过加固门" >&2
60
- fi
61
- ;;
62
- *)
63
- run_loop --rev "$local_sha"
64
- ;;
65
- esac
66
- one=$?
67
- if [ "$one" -ne 0 ] && [ "$rc" -eq 0 ]; then
68
- rc=$one
69
- fi
70
- done
86
+ if (saw === 0) {
87
+ const r = runLoop();
88
+ if (r.status !== 0) rc = r.status === null ? 1 : r.status;
89
+ console.error('pre-push: 手动运行无推送范围——构建门跳过(真实推送时按 old..new 范围执法)');
90
+ }
71
91
 
72
- if [ "$saw" -eq 0 ]; then
73
- run_loop
74
- rc=$?
75
- fi
92
+ if (rc !== 0) {
93
+ console.error('pre-push: 闭环骨架断档 / 构建未过(hard-block)未通过,push 已阻断。修 workflow 文档 / 构建错误后重推——不要用 --no-verify 绕过(本钩子是唯一机器门,无服务端兜底,见头部说明)');
94
+ console.error('pre-push: 若为「加固未过」= experiment 泳道件转正前须收口:intent approved/done + 同名 plan(L2/L3 另须 spec)且状态非 draft');
95
+ process.exit(rc);
96
+ }
76
97
 
77
- if [ "$rc" -ne 0 ]; then
78
- echo "pre-push: 闭环骨架断档(hard-block)未通过,push 已阻断。修 workflow 文档后重推——不要用 --no-verify 绕过(本钩子是唯一机器门,无服务端兜底,见头部说明)" >&2
79
- echo "pre-push: 若为「加固未过」= experiment 泳道件转正前须收口:intent approved/done + 同名 plan(L2/L3 另须 spec)且状态非 draft" >&2
80
- exit "$rc"
81
- fi
82
- exit 0
98
+ // 回路日检(2026-10-16 自源仓 13f67ef7 回灌):每个本地日在推送成功路径跑一次,advisory,失败不改退出码。
99
+ try {
100
+ const cacheDir = '.agents/cache';
101
+ const stampPath = `${cacheDir}/loop-watch-stamp`;
102
+ const ledgerPath = `${cacheDir}/loop-watch.jsonl`;
103
+ const now = new Date();
104
+ const today = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
105
+ let prev = '';
106
+ try { prev = fs.readFileSync(stampPath, 'utf8').trim(); } catch { /* 首跑 */ }
107
+ if (prev !== today) {
108
+ fs.mkdirSync(cacheDir, { recursive: true });
109
+ // 退役催办:mechanism-retire-watch(--json 产 actions);papercut 报债:kit 复用 sensor --json 取 debt
110
+ const jobs = [
111
+ ['retire-watch', '.agents/scripts/mechanism-retire-watch.mjs'],
112
+ ['papercut-report', '.agents/scripts/papercut-debt-sensor.mjs'],
113
+ ];
114
+ const runs = [];
115
+ for (const [id, script] of jobs) {
116
+ if (!fs.existsSync(script)) { runs.push({ id, missing: true }); continue; }
117
+ const r = spawnSync(process.execPath, [script, '--json'], { encoding: 'utf8', maxBuffer: 8 * 1024 * 1024 });
118
+ let summary = {};
119
+ try { summary = JSON.parse(r.stdout || '{}'); } catch { summary = { parseError: true }; }
120
+ runs.push({
121
+ id,
122
+ exit: r.status,
123
+ actions: Array.isArray(summary.actions) ? summary.actions.length : null,
124
+ debt: typeof summary.debt === 'number' ? summary.debt : null,
125
+ });
126
+ }
127
+ fs.appendFileSync(ledgerPath, `${JSON.stringify({ ts: now.toISOString(), day: today, runs })}\n`);
128
+ fs.writeFileSync(stampPath, `${today}\n`);
129
+ const retire = runs.find((x) => x.id === 'retire-watch');
130
+ const paper = runs.find((x) => x.id === 'papercut-report');
131
+ console.error(`pre-push: (advisory)回路日检已记 ${ledgerPath}(退役动作 ${retire && retire.actions != null ? retire.actions : '?'},papercut debt ${paper && paper.debt != null ? paper.debt : '?'})`);
132
+ }
133
+ } catch (e) {
134
+ console.error(`pre-push: (advisory)回路日检跳过——${e.message}`);
135
+ }
136
+ process.exit(0);
@@ -32,8 +32,9 @@
32
32
  - **验证**:`.agents/commands/test.md`(静态门 + 实测;项目自有验证脚本/门禁如有,见 `.agents/hooks/local-pre-commit` 与根 `AGENTS.md`「项目适配区」)
33
33
  - **评审**:`.agents/commands/review.md`(按 P0 / P1 / P2 分级:机器兜底 + AI 自查出清单,用户决策定性与合入)
34
34
  - **上线**:`.agents/commands/deploy.md`(上线前必跑清单)
35
- - **量化**:委派/自做结果记 `delegations.md`,聚合跑 `node .agents/scripts/agg-delegations.cjs`(**并发扩容门槛见该文件——数字达标前不扩并发**);语料与常驻面体积的**月度快照**跑 `node .agents/scripts/gen-workflow-metrics.mjs`(每月一行落 `metrics.md`,同月重跑即更新;明细看 stdout)
35
+ - **量化**:委派/自做结果记 `delegations.md`,聚合跑 `node .agents/scripts/agg-delegations.cjs`(**并发扩容门槛见该文件——数字达标前不扩并发**);语料与常驻面体积的**月度快照**跑 `node .agents/scripts/gen-workflow-metrics.mjs`(每月一行落 `metrics.md`,同月重跑即更新;明细看 stdout);独立复核的**意见级处置**记 `workflow/reviews.d/<YYYY-MM>.md`(一行 = 一次复核事件,八列 `日期|对象|复核员|意见数|采纳|拒绝|误报|备注`,采纳+拒绝+误报=意见数,月度聚合进 metrics「复核效果」表——口径详见 `.agents/commands/review.md` 落账子项)
36
36
  - **归档**:终态件滚动归档跑 `node .agents/scripts/archive-sweep.mjs`(缺省 dry-run 预览;`--window 21 --execute` 执行 git mv)——归档单位 = **同名家族**(intent/spec/plan/incident 同进同退:任一成员非终态 / 未满窗 / 被活跃引用 / 无日期,整族留守);终态时间三级锚 = 确认台账终态行 ts → 内容 last-touch(frontmatter-only 提交不刷新)→ 文件名日期;落点 `workflow/archive/<家族最晚终态月>/<类型>/`
37
+ - **spec 生命周期口径(spec-anchored + 长期维护)**:spec 是**持续对照的事实源,交付后不失效**——代码改动触及某 spec 覆盖的行为时须对照该 spec(含归档件):行为漂移要么改代码回到 spec,要么同一提交回改 spec;有争议立 incident 裁决。**归档是容量治理不是失效**:归档只把终态件移出活跃扫描面(INDEX 活跃行 / check-loop 四目录扫描 / 月度快照采集),事实源地位与修订权不变——归档 spec 可原地修订,修订不改归档位置。体积治理先观察后设限:spec 行数/验收条数分布由 `gen-workflow-metrics.mjs` 的「spec 体积观察」表采集(advisory 上限显式延后,先让体积可见)
37
38
  - **papercut 回路(存量债清偿,手动触发)**:命令/技能卡壳记 `workflow/papercuts.md` 攒成的未升级条目 = 存量债;要清时跑 `node .agents/scripts/papercut-debt-sensor.mjs`(测 debt)→ `node .agents/scripts/papercut-debt-controller.mjs`(确定性选本轮唯一目标;源码/数据库面条目被 scope gate 拦下等授权)→ 按 `.agents/skills/papercut-fix/SKILL.md` 执行(改完 debt 应恰好 -1)。判定与排序口径单源 `.agents/loop/papercut-debt/DESIGN.md`,改口径先改设计文件
38
39
  - **追溯**:git 即审计——文档随代码同 commit、上线打 `release/<日期>` tag,`git log` 全链路可查;多人评审暂缓,git 历史即评审记录
39
40
  - **级别**:L1 实现级(未命中 L2/L3;新需求的入口是 plan)| L2 规则 / 契约(编码权威 / 共享契约 / 既有接口语义 / 全局横切口径,触达面闭集见 `.agents/commands/new-task.md` §级别判断)| L3 数据与运行时结构(schema / 迁移 SQL / DI 链 / 认证与中间件管线);混合改动就高不就低
@@ -12,6 +12,11 @@
12
12
  <!-- frontmatter 受限子集(2026-09-13):每行 `键: 值`;状态∈draft/approved/done/superseded/cancelled(严格枚举,附注写备注键);级别∈L1/L2/L3;check-loop 只扫 frontmatter 取机器字段,正文不再写状态/级别行 -->
13
13
  <!-- 探索泳道(可选,2026-09-30 hybrid-governance-explore-hardening):experiment/ 前缀分支上的 PoC 任务在 frontmatter 加「阶段: exploring」——提交/推送门降级 advisory,spec/plan 可先于本入口确认起草(限 L1);转正合入 main 前须收口(本档 approved/done + 同名 plan/spec 在场,check-loop --hardening 加固门),或显式放弃(superseded/cancelled) -->
14
14
  <!-- 预判(可选,2026-10-13 自 Shipyard 回灌 prejudgment-ledger):定级时先做结构化预判,结果如实写「预判: kind=<require|fix|verify|review|deploy> level=<L1|L2|L3>」——intents≡require、incidents≡fix;与实际落位不符时 check-loop 路由预判一致性检查(B6b 落地后编号以 check-loop.mjs 头部清单为准)出 WARN 留账。缺字段零告警(存量宽容不回填,不做强制前置)——advisory 灰度口径 -->
15
+ <!-- 待澄清标记(2026-10-12 needs-clarification;2026-10-18 立项跳对称化扩到本模板):起草时
16
+ 不确定的地方照实写一行 `- 待澄清:<你卡在哪>`,不要猜一个填上去——立项是后链全部文档的种子,
17
+ 「我不知道」是负责,猜是失职。起草门不拦(不阻塞继续写);但 draft→approved 确认时仍挂着
18
+ 未澄清项会被 confirm-doc 拒绝落账。解决后把行首改成 `- 已澄清:…`(保留该行留痕)或直接删行。
19
+ 判据单源:stage-gates.mjs#openClarifications / clarifyGateFor。存量 intent 无标记零回溯。 -->
15
20
 
16
21
  ## 背景与问题
17
22
  <为什么做;写明需求来源(工单 / 沟通记录 / 待办事项)>
@@ -44,7 +44,7 @@ THEN 行是机器对账断言:声明了场景却缺「- THEN <可观测结果>
44
44
  - 前端:路由 / 组件 / store / api
45
45
 
46
46
  ## 约束遵守映射(对照 AGENTS.md 触达红线)
47
- | 红线(按本项目 AGENTS.md 实际红线逐行填,没有的行删除) | 本 spec 如何满足 |
47
+ | 红线 / 工程原则(按本项目 AGENTS.md 红线与「工程原则」节实际行逐行填,没有的行删除) | 本 spec 如何满足 |
48
48
  |------|------------------|
49
49
  | <示例:分层依赖约束 / 编码权威归属 / 数据迁移方式> | <通过 XXX,不引入 YYY;是否触及(触及即 L2 定级依据)> |
50
50
  | <示例:schema / 迁移路径约束> | <涉及路径与处理方式> |