agentic-flow-kit 1.8.0 → 1.8.2
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/modules/hosts/claude/commands/wf-new-task.md +1 -0
- package/modules/hosts/claude/commands/wf-review.md +1 -1
- package/modules/hosts/codex/commands/wf-new-task.md +1 -0
- package/modules/hosts/codex/commands/wf-review.md +1 -1
- package/modules/hosts/cursor/commands/wf-new-task.md +1 -0
- package/modules/hosts/cursor/commands/wf-review.md +1 -1
- package/modules/hosts/opencode/commands/wf-new-task.md +1 -0
- package/modules/hosts/opencode/commands/wf-review.md +1 -1
- package/modules/hosts/trae/commands/wf-new-task.md +1 -0
- package/modules/hosts/trae/commands/wf-review.md +1 -1
- package/package.json +1 -1
- package/templates/_agents/commands/new-task.md +1 -0
- package/templates/_agents/commands/review.md +1 -1
- package/templates/_agents/engine-lock.json +28 -20
- package/templates/_agents/hooks/commit-check.cjs +57 -30
- package/templates/_agents/notes/engine-internals.md +17 -0
- package/templates/_agents/rule-budgets.txt +7 -1
- package/templates/_agents/scripts/agg-judgments.mjs +77 -1
- package/templates/_agents/scripts/agg-judgments.test.mjs +49 -1
- package/templates/_agents/scripts/archive-sweep.mjs +3 -1
- package/templates/_agents/scripts/check-convergence.mjs +8 -3
- package/templates/_agents/scripts/check-lane-surface.mjs +9 -2
- package/templates/_agents/scripts/check-lane-surface.test.mjs +16 -2
- package/templates/_agents/scripts/check-ledger-invariant.mjs +30 -4
- package/templates/_agents/scripts/check-ledger-invariant.test.mjs +28 -0
- package/templates/_agents/scripts/check-loop-rev.test.mjs +8 -14
- package/templates/_agents/scripts/check-loop.mjs +9 -0
- package/templates/_agents/scripts/check-loop.test.mjs +17 -5
- package/templates/_agents/scripts/check-prejudgment.mjs +8 -3
- package/templates/_agents/scripts/closeout-l1.mjs +217 -0
- package/templates/_agents/scripts/closeout-l1.test.mjs +105 -0
- package/templates/_agents/scripts/commit-check-trigger.test.mjs +49 -0
- package/templates/_agents/scripts/confirm-doc.mjs +14 -2
- package/templates/_agents/scripts/confirm-doc.test.mjs +43 -0
- package/templates/_agents/scripts/gen-workflow-metrics.mjs +17 -0
- package/templates/_agents/scripts/ledger-shards.mjs +42 -5
- package/templates/_agents/scripts/ledger-shards.test.mjs +17 -0
- package/templates/_agents/scripts/mechanism-retire-watch.mjs +183 -0
- package/templates/_agents/scripts/mechanism-retire-watch.test.mjs +114 -0
- package/templates/_agents/scripts/pre-push.test.mjs +26 -10
- package/templates/_agents/scripts/rule-budget.mjs +14 -1
- package/templates/_agents/scripts/rule-budget.test.mjs +118 -0
- package/templates/_agents/scripts/verify.mjs +32 -8
- package/templates/_agents/scripts/verify.test.mjs +29 -0
- package/templates/_agents/scripts-test-exempt.txt +2 -1
- package/templates/_agents/skills/review-method/SKILL.md +55 -0
- package/templates/_githooks/pre-commit +9 -4
- package/templates/_githooks/pre-merge-commit +4 -3
- package/templates/_githooks/pre-push +129 -75
|
@@ -44,6 +44,7 @@ flow-kit route --files <预计改动面…> --kind require|fix|verify|review|dep
|
|
|
44
44
|
> **两问定级**(2026-10-13 L0 退役,自源仓收敛系列 1 回灌):结构面(schema / 迁移 SQL / DI / 认证管线)→ L3;契约或共享口径 → L2;两者都没有 → L1。不要按严重程度从 L1 往上滑。
|
|
45
45
|
> **落位**: L1 写在 plan frontmatter `级别`;L2/L3 写在 intent(intent 另以 `risk_level`=级别双写,`fill-intent.mjs` 自动写入,机器选道用)。
|
|
46
46
|
> **判低拦截**: 入口勾触达红线 → check-loop「红线判低」hard 拦 → 升到 L2/L3 并补同名 spec。
|
|
47
|
+
> **预判留痕**(§25 advisory): 定级先做结构化预判(有结构化判定工具则对齐本仓判据,无则按两问自判),结果写进入口文档 frontmatter「预判: kind=<kind> level=<L1|L2|L3>」——与实际落位不符 check-loop 出 WARN 留账。kind 词表与对账机理见 `.agents/notes/engine-internals.md`(维护者面)。
|
|
47
48
|
>
|
|
48
49
|
> **L2/L3 起草期合并预览**:三件套起草按 [design.md §0](design.md) 一次呈现要点总览(逐件确认代录不变)。
|
|
49
50
|
|
|
@@ -44,6 +44,6 @@ description: 代码评审标准(按风险分级:机器兜底 + AI 自查出
|
|
|
44
44
|
## 4. 审查分工(用户决策 + AI 协作)
|
|
45
45
|
|
|
46
46
|
- **机器兜底**(pre-commit / pre-push / test 自动拦,无需人守):门禁清单与判据以 `.githooks/`、`.agents/hooks/`、`check-loop.sh` 头部注释为准;`项目测试命令` 跑自动化用例。
|
|
47
|
-
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 +
|
|
47
|
+
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 + 修复建议。复核方法走 `.agents/skills/review-method/SKILL.md`(Standards×Spec 双轴 + 坏味道走查 + 合入标尺;有全局 `code-review` 技能时可叠加);每条 finding 报告前过 `review-verification-protocol` 防误报门(锚定 file:line、给出证据、校准严重级,不确定就降级为提问)。
|
|
48
48
|
- **独立性**:L2 / L3 必须用独立子智能体,宿主不支持时另开新会话,不得由原作者自查冒充;L1 且宿主不支持子智能体时可由主智能体按同一复核契约执行。
|
|
49
49
|
- **用户决策**:问题定性(误报驳回 / P0 成立必修 / P1、P2 处置裁量)+ 合入时机;git 历史即评审记录,追溯靠 commit 与 tag。
|
|
@@ -44,6 +44,7 @@ flow-kit route --files <预计改动面…> --kind require|fix|verify|review|dep
|
|
|
44
44
|
> **两问定级**(2026-10-13 L0 退役,自源仓收敛系列 1 回灌):结构面(schema / 迁移 SQL / DI / 认证管线)→ L3;契约或共享口径 → L2;两者都没有 → L1。不要按严重程度从 L1 往上滑。
|
|
45
45
|
> **落位**: L1 写在 plan frontmatter `级别`;L2/L3 写在 intent(intent 另以 `risk_level`=级别双写,`fill-intent.mjs` 自动写入,机器选道用)。
|
|
46
46
|
> **判低拦截**: 入口勾触达红线 → check-loop「红线判低」hard 拦 → 升到 L2/L3 并补同名 spec。
|
|
47
|
+
> **预判留痕**(§25 advisory): 定级先做结构化预判(有结构化判定工具则对齐本仓判据,无则按两问自判),结果写进入口文档 frontmatter「预判: kind=<kind> level=<L1|L2|L3>」——与实际落位不符 check-loop 出 WARN 留账。kind 词表与对账机理见 `.agents/notes/engine-internals.md`(维护者面)。
|
|
47
48
|
>
|
|
48
49
|
> **L2/L3 起草期合并预览**:三件套起草按 [design.md §0](design.md) 一次呈现要点总览(逐件确认代录不变)。
|
|
49
50
|
|
|
@@ -44,6 +44,6 @@ description: 代码评审标准(按风险分级:机器兜底 + AI 自查出
|
|
|
44
44
|
## 4. 审查分工(用户决策 + AI 协作)
|
|
45
45
|
|
|
46
46
|
- **机器兜底**(pre-commit / pre-push / test 自动拦,无需人守):门禁清单与判据以 `.githooks/`、`.agents/hooks/`、`check-loop.sh` 头部注释为准;`项目测试命令` 跑自动化用例。
|
|
47
|
-
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 +
|
|
47
|
+
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 + 修复建议。复核方法走 `.agents/skills/review-method/SKILL.md`(Standards×Spec 双轴 + 坏味道走查 + 合入标尺;有全局 `code-review` 技能时可叠加);每条 finding 报告前过 `review-verification-protocol` 防误报门(锚定 file:line、给出证据、校准严重级,不确定就降级为提问)。
|
|
48
48
|
- **独立性**:L2 / L3 必须用独立子智能体,宿主不支持时另开新会话,不得由原作者自查冒充;L1 且宿主不支持子智能体时可由主智能体按同一复核契约执行。
|
|
49
49
|
- **用户决策**:问题定性(误报驳回 / P0 成立必修 / P1、P2 处置裁量)+ 合入时机;git 历史即评审记录,追溯靠 commit 与 tag。
|
|
@@ -44,6 +44,7 @@ flow-kit route --files <预计改动面…> --kind require|fix|verify|review|dep
|
|
|
44
44
|
> **两问定级**(2026-10-13 L0 退役,自源仓收敛系列 1 回灌):结构面(schema / 迁移 SQL / DI / 认证管线)→ L3;契约或共享口径 → L2;两者都没有 → L1。不要按严重程度从 L1 往上滑。
|
|
45
45
|
> **落位**: L1 写在 plan frontmatter `级别`;L2/L3 写在 intent(intent 另以 `risk_level`=级别双写,`fill-intent.mjs` 自动写入,机器选道用)。
|
|
46
46
|
> **判低拦截**: 入口勾触达红线 → check-loop「红线判低」hard 拦 → 升到 L2/L3 并补同名 spec。
|
|
47
|
+
> **预判留痕**(§25 advisory): 定级先做结构化预判(有结构化判定工具则对齐本仓判据,无则按两问自判),结果写进入口文档 frontmatter「预判: kind=<kind> level=<L1|L2|L3>」——与实际落位不符 check-loop 出 WARN 留账。kind 词表与对账机理见 `.agents/notes/engine-internals.md`(维护者面)。
|
|
47
48
|
>
|
|
48
49
|
> **L2/L3 起草期合并预览**:三件套起草按 [design.md §0](design.md) 一次呈现要点总览(逐件确认代录不变)。
|
|
49
50
|
|
|
@@ -44,6 +44,6 @@ description: 代码评审标准(按风险分级:机器兜底 + AI 自查出
|
|
|
44
44
|
## 4. 审查分工(用户决策 + AI 协作)
|
|
45
45
|
|
|
46
46
|
- **机器兜底**(pre-commit / pre-push / test 自动拦,无需人守):门禁清单与判据以 `.githooks/`、`.agents/hooks/`、`check-loop.sh` 头部注释为准;`项目测试命令` 跑自动化用例。
|
|
47
|
-
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 +
|
|
47
|
+
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 + 修复建议。复核方法走 `.agents/skills/review-method/SKILL.md`(Standards×Spec 双轴 + 坏味道走查 + 合入标尺;有全局 `code-review` 技能时可叠加);每条 finding 报告前过 `review-verification-protocol` 防误报门(锚定 file:line、给出证据、校准严重级,不确定就降级为提问)。
|
|
48
48
|
- **独立性**:L2 / L3 必须用独立子智能体,宿主不支持时另开新会话,不得由原作者自查冒充;L1 且宿主不支持子智能体时可由主智能体按同一复核契约执行。
|
|
49
49
|
- **用户决策**:问题定性(误报驳回 / P0 成立必修 / P1、P2 处置裁量)+ 合入时机;git 历史即评审记录,追溯靠 commit 与 tag。
|
|
@@ -44,6 +44,7 @@ flow-kit route --files <预计改动面…> --kind require|fix|verify|review|dep
|
|
|
44
44
|
> **两问定级**(2026-10-13 L0 退役,自源仓收敛系列 1 回灌):结构面(schema / 迁移 SQL / DI / 认证管线)→ L3;契约或共享口径 → L2;两者都没有 → L1。不要按严重程度从 L1 往上滑。
|
|
45
45
|
> **落位**: L1 写在 plan frontmatter `级别`;L2/L3 写在 intent(intent 另以 `risk_level`=级别双写,`fill-intent.mjs` 自动写入,机器选道用)。
|
|
46
46
|
> **判低拦截**: 入口勾触达红线 → check-loop「红线判低」hard 拦 → 升到 L2/L3 并补同名 spec。
|
|
47
|
+
> **预判留痕**(§25 advisory): 定级先做结构化预判(有结构化判定工具则对齐本仓判据,无则按两问自判),结果写进入口文档 frontmatter「预判: kind=<kind> level=<L1|L2|L3>」——与实际落位不符 check-loop 出 WARN 留账。kind 词表与对账机理见 `.agents/notes/engine-internals.md`(维护者面)。
|
|
47
48
|
>
|
|
48
49
|
> **L2/L3 起草期合并预览**:三件套起草按 [design.md §0](design.md) 一次呈现要点总览(逐件确认代录不变)。
|
|
49
50
|
|
|
@@ -44,6 +44,6 @@ description: Review · 代码评审(横切,合入前使用;P0/P1/P2 分级
|
|
|
44
44
|
## 4. 审查分工(用户决策 + AI 协作)
|
|
45
45
|
|
|
46
46
|
- **机器兜底**(pre-commit / pre-push / test 自动拦,无需人守):门禁清单与判据以 `.githooks/`、`.agents/hooks/`、`check-loop.sh` 头部注释为准;`项目测试命令` 跑自动化用例。
|
|
47
|
-
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 +
|
|
47
|
+
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 + 修复建议。复核方法走 `.agents/skills/review-method/SKILL.md`(Standards×Spec 双轴 + 坏味道走查 + 合入标尺;有全局 `code-review` 技能时可叠加);每条 finding 报告前过 `review-verification-protocol` 防误报门(锚定 file:line、给出证据、校准严重级,不确定就降级为提问)。
|
|
48
48
|
- **独立性**:L2 / L3 必须用独立子智能体,宿主不支持时另开新会话,不得由原作者自查冒充;L1 且宿主不支持子智能体时可由主智能体按同一复核契约执行。
|
|
49
49
|
- **用户决策**:问题定性(误报驳回 / P0 成立必修 / P1、P2 处置裁量)+ 合入时机;git 历史即评审记录,追溯靠 commit 与 tag。
|
|
@@ -45,6 +45,7 @@ flow-kit route --files <预计改动面…> --kind require|fix|verify|review|dep
|
|
|
45
45
|
> **两问定级**(2026-10-13 L0 退役,自源仓收敛系列 1 回灌):结构面(schema / 迁移 SQL / DI / 认证管线)→ L3;契约或共享口径 → L2;两者都没有 → L1。不要按严重程度从 L1 往上滑。
|
|
46
46
|
> **落位**: L1 写在 plan frontmatter `级别`;L2/L3 写在 intent(intent 另以 `risk_level`=级别双写,`fill-intent.mjs` 自动写入,机器选道用)。
|
|
47
47
|
> **判低拦截**: 入口勾触达红线 → check-loop「红线判低」hard 拦 → 升到 L2/L3 并补同名 spec。
|
|
48
|
+
> **预判留痕**(§25 advisory): 定级先做结构化预判(有结构化判定工具则对齐本仓判据,无则按两问自判),结果写进入口文档 frontmatter「预判: kind=<kind> level=<L1|L2|L3>」——与实际落位不符 check-loop 出 WARN 留账。kind 词表与对账机理见 `.agents/notes/engine-internals.md`(维护者面)。
|
|
48
49
|
>
|
|
49
50
|
> **L2/L3 起草期合并预览**:三件套起草按 [design.md §0](design.md) 一次呈现要点总览(逐件确认代录不变)。
|
|
50
51
|
|
|
@@ -45,6 +45,6 @@ description: Review · 代码评审(横切,合入前使用;P0/P1/P2 分级
|
|
|
45
45
|
## 4. 审查分工(用户决策 + AI 协作)
|
|
46
46
|
|
|
47
47
|
- **机器兜底**(pre-commit / pre-push / test 自动拦,无需人守):门禁清单与判据以 `.githooks/`、`.agents/hooks/`、`check-loop.sh` 头部注释为准;`项目测试命令` 跑自动化用例。
|
|
48
|
-
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 +
|
|
48
|
+
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 + 修复建议。复核方法走 `.agents/skills/review-method/SKILL.md`(Standards×Spec 双轴 + 坏味道走查 + 合入标尺;有全局 `code-review` 技能时可叠加);每条 finding 报告前过 `review-verification-protocol` 防误报门(锚定 file:line、给出证据、校准严重级,不确定就降级为提问)。
|
|
49
49
|
- **独立性**:L2 / L3 必须用独立子智能体,宿主不支持时另开新会话,不得由原作者自查冒充;L1 且宿主不支持子智能体时可由主智能体按同一复核契约执行。
|
|
50
50
|
- **用户决策**:问题定性(误报驳回 / P0 成立必修 / P1、P2 处置裁量)+ 合入时机;git 历史即评审记录,追溯靠 commit 与 tag。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-flow-kit",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.2",
|
|
4
4
|
"description": "AI-Native 闭环工作流 + wiki 知识层脚手架——flow-kit init 一条命令为新项目装好 .agents 工作流引擎(阶段命令/角色契约/门禁钩子/kb 检索/看板/规则面预算)+ workflow 文档闭环 + wiki 知识库,装完本地可跑、零运行时依赖",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -52,6 +52,7 @@ flow-kit route --files <预计改动面…> --kind require|fix|verify|review|dep
|
|
|
52
52
|
> **两问定级**(2026-10-13 L0 退役,自源仓收敛系列 1 回灌):结构面(schema / 迁移 SQL / DI / 认证管线)→ L3;契约或共享口径 → L2;两者都没有 → L1。不要按严重程度从 L1 往上滑。
|
|
53
53
|
> **落位**: L1 写在 plan frontmatter `级别`;L2/L3 写在 intent(intent 另以 `risk_level`=级别双写,`fill-intent.mjs` 自动写入,机器选道用)。
|
|
54
54
|
> **判低拦截**: 入口勾触达红线 → check-loop「红线判低」hard 拦 → 升到 L2/L3 并补同名 spec。
|
|
55
|
+
> **预判留痕**(§25 advisory): 定级先做结构化预判(有结构化判定工具则对齐本仓判据,无则按两问自判),结果写进入口文档 frontmatter「预判: kind=<kind> level=<L1|L2|L3>」——与实际落位不符 check-loop 出 WARN 留账。kind 词表与对账机理见 `.agents/notes/engine-internals.md`(维护者面)。
|
|
55
56
|
>
|
|
56
57
|
> **L2/L3 起草期合并预览**:三件套起草按 [design.md §0](design.md) 一次呈现要点总览(逐件确认代录不变)。
|
|
57
58
|
|
|
@@ -57,6 +57,6 @@ next: .agents/commands/build.md(仅 P0 / P1 未清时;清零后经用户确
|
|
|
57
57
|
## 4. 审查分工(用户决策 + AI 协作)
|
|
58
58
|
|
|
59
59
|
- **机器兜底**(pre-commit / pre-push / test 自动拦,无需人守):门禁清单与判据以 `.githooks/`、`.agents/hooks/`、`check-loop.sh` 头部注释为准;`项目测试命令` 跑自动化用例。
|
|
60
|
-
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 +
|
|
60
|
+
- **AI 复核**:机器门禁完成后优先委派 `independent-reviewer`,聚焦 P0 hook 未覆盖项 + 全部 P1(P2 视精力)——产出分级问题清单 + 修复建议。复核方法走 `.agents/skills/review-method/SKILL.md`(Standards×Spec 双轴 + 坏味道走查 + 合入标尺;有全局 `code-review` 技能时可叠加);每条 finding 报告前过 `review-verification-protocol` 防误报门(锚定 file:line、给出证据、校准严重级,不确定就降级为提问)。
|
|
61
61
|
- **独立性**:L2 / L3 必须用独立子智能体,宿主不支持时另开新会话,不得由原作者自查冒充;L1 且宿主不支持子智能体时可由主智能体按同一复核契约执行。
|
|
62
62
|
- **用户决策**:问题定性(误报驳回 / P0 成立必修 / P1、P2 处置裁量)+ 合入时机;git 历史即评审记录,追溯靠 commit 与 tag。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": 1,
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-16T08:29:49.685Z",
|
|
4
4
|
"files": {
|
|
5
5
|
".github/workflows/ci.yml": {
|
|
6
6
|
"sha256": "e9cffb90dec8f0a49bfe231a13fb8df375a2494cc75c38d991b5eb7c7be104b5",
|
|
@@ -31,23 +31,23 @@
|
|
|
31
31
|
"hard": 8
|
|
32
32
|
},
|
|
33
33
|
"templates/_agents/rule-budgets.txt": {
|
|
34
|
-
"sha256": "
|
|
34
|
+
"sha256": "48f31a386019b7c427ed3244939d7c455fb33ec79d634d47141695e2308bcb6b",
|
|
35
35
|
"hard": 3
|
|
36
36
|
},
|
|
37
37
|
"templates/_agents/scripts-test-exempt.txt": {
|
|
38
|
-
"sha256": "
|
|
39
|
-
"hard":
|
|
38
|
+
"sha256": "cc99a42bb30207b00302bddd75e19a22e6f07fb4a96e561dedf389d09e45fb21",
|
|
39
|
+
"hard": 5
|
|
40
40
|
},
|
|
41
41
|
"templates/_agents/scripts/agg-gate-stats.mjs": {
|
|
42
42
|
"sha256": "80d10a917a864910f62714423d0740e4bee6cc4e4621a01384e67f77409e4d82",
|
|
43
43
|
"hard": 0
|
|
44
44
|
},
|
|
45
45
|
"templates/_agents/scripts/agg-judgments.mjs": {
|
|
46
|
-
"sha256": "
|
|
46
|
+
"sha256": "ac8ed6a89b7650657890b7eacfffc1989a05a7de5cb3a06b94cc7ff1a73d3a77",
|
|
47
47
|
"hard": 0
|
|
48
48
|
},
|
|
49
49
|
"templates/_agents/scripts/archive-sweep.mjs": {
|
|
50
|
-
"sha256": "
|
|
50
|
+
"sha256": "f5f562d2ad95dc48a282b0225fd960449393d96c03634a01719d9868f41038d5",
|
|
51
51
|
"hard": 0
|
|
52
52
|
},
|
|
53
53
|
"templates/_agents/scripts/check-attribution.mjs": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"hard": 0
|
|
56
56
|
},
|
|
57
57
|
"templates/_agents/scripts/check-convergence.mjs": {
|
|
58
|
-
"sha256": "
|
|
58
|
+
"sha256": "65485f4ca91f886a1bc3d1723dd6d93ffcf888612d11f315bc498a8bd258616f",
|
|
59
59
|
"hard": 1
|
|
60
60
|
},
|
|
61
61
|
"templates/_agents/scripts/check-engine-integrity.mjs": {
|
|
@@ -71,15 +71,15 @@
|
|
|
71
71
|
"hard": 0
|
|
72
72
|
},
|
|
73
73
|
"templates/_agents/scripts/check-lane-surface.mjs": {
|
|
74
|
-
"sha256": "
|
|
74
|
+
"sha256": "a18f3cab4a345ae47583bfc4656f36d367c57db8f953dfe029f1baed6c4508a8",
|
|
75
75
|
"hard": 2
|
|
76
76
|
},
|
|
77
77
|
"templates/_agents/scripts/check-ledger-invariant.mjs": {
|
|
78
|
-
"sha256": "
|
|
78
|
+
"sha256": "0f62db2d88d4da7f720c5c148d7d461dcc286a5e7c27c41cda591994c1201925",
|
|
79
79
|
"hard": 2
|
|
80
80
|
},
|
|
81
81
|
"templates/_agents/scripts/check-loop.mjs": {
|
|
82
|
-
"sha256": "
|
|
82
|
+
"sha256": "e4e8843248d0a14e349f29dc9b4c1f0bbdbe1e5bd3c0745c723721c117e58f5a",
|
|
83
83
|
"hard": 32
|
|
84
84
|
},
|
|
85
85
|
"templates/_agents/scripts/check-metric-claims.mjs": {
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"hard": 0
|
|
88
88
|
},
|
|
89
89
|
"templates/_agents/scripts/check-prejudgment.mjs": {
|
|
90
|
-
"sha256": "
|
|
90
|
+
"sha256": "050227917cc5e5e73a189b23ea7f5ff7b5633b5e265b33e153147409772f7936",
|
|
91
91
|
"hard": 0
|
|
92
92
|
},
|
|
93
93
|
"templates/_agents/scripts/check-registry.mjs": {
|
|
@@ -110,12 +110,16 @@
|
|
|
110
110
|
"sha256": "9118b8fe57b80b5d36a0db38ed141c08036629895c143a64f0c29e301b2218c8",
|
|
111
111
|
"hard": 0
|
|
112
112
|
},
|
|
113
|
+
"templates/_agents/scripts/closeout-l1.mjs": {
|
|
114
|
+
"sha256": "76a2bc846f76cdb82fb3ce10b38df37882de727af8641841d2e01664c43962e1",
|
|
115
|
+
"hard": 0
|
|
116
|
+
},
|
|
113
117
|
"templates/_agents/scripts/compact-ledgers.mjs": {
|
|
114
118
|
"sha256": "99ee805337c9bd11500432f1525985781ad3165e6140e9e354efd9f5418fff78",
|
|
115
119
|
"hard": 1
|
|
116
120
|
},
|
|
117
121
|
"templates/_agents/scripts/confirm-doc.mjs": {
|
|
118
|
-
"sha256": "
|
|
122
|
+
"sha256": "7829a2af4476bf5cddfbc123f3d1a9a95b2e1fa0337c4e0382875cb3e3ddb74a",
|
|
119
123
|
"hard": 13
|
|
120
124
|
},
|
|
121
125
|
"templates/_agents/scripts/draft-sediment.mjs": {
|
|
@@ -175,7 +179,7 @@
|
|
|
175
179
|
"hard": 3
|
|
176
180
|
},
|
|
177
181
|
"templates/_agents/scripts/gen-workflow-metrics.mjs": {
|
|
178
|
-
"sha256": "
|
|
182
|
+
"sha256": "577401cc384f814a5cfc4ec7204b52bab3d11c93697c3ead697594f5a0d5a6b1",
|
|
179
183
|
"hard": 2
|
|
180
184
|
},
|
|
181
185
|
"templates/_agents/scripts/git-core.mjs": {
|
|
@@ -211,13 +215,17 @@
|
|
|
211
215
|
"hard": 0
|
|
212
216
|
},
|
|
213
217
|
"templates/_agents/scripts/ledger-shards.mjs": {
|
|
214
|
-
"sha256": "
|
|
218
|
+
"sha256": "45ce305d4f0b7c878095a9db79971a0ea7d3685f5b6fa2e69b5212b8df4254e3",
|
|
215
219
|
"hard": 0
|
|
216
220
|
},
|
|
217
221
|
"templates/_agents/scripts/level-criteria.mjs": {
|
|
218
222
|
"sha256": "fe605f053aee21804e5a2d920830e17f7ef1c2935bd8ec3e0ca9aeca0de181c1",
|
|
219
223
|
"hard": 1
|
|
220
224
|
},
|
|
225
|
+
"templates/_agents/scripts/mechanism-retire-watch.mjs": {
|
|
226
|
+
"sha256": "038f39997a193cea689bea1781980e2d83f64367e339cfa0bd9c1e3bda236551",
|
|
227
|
+
"hard": 0
|
|
228
|
+
},
|
|
221
229
|
"templates/_agents/scripts/papercut-debt-controller.mjs": {
|
|
222
230
|
"sha256": "4e96b4fcb9500c42598afa54d0f3b9f515c11c4512dc4da180830c896e2d564a",
|
|
223
231
|
"hard": 0
|
|
@@ -251,7 +259,7 @@
|
|
|
251
259
|
"hard": 4
|
|
252
260
|
},
|
|
253
261
|
"templates/_agents/scripts/rule-budget.mjs": {
|
|
254
|
-
"sha256": "
|
|
262
|
+
"sha256": "2cbda7e83dea2f745986294d1a73147f1bfc831da4fdfbd6548ea7cd4ed4ae09",
|
|
255
263
|
"hard": 0
|
|
256
264
|
},
|
|
257
265
|
"templates/_agents/scripts/run-tests.mjs": {
|
|
@@ -275,7 +283,7 @@
|
|
|
275
283
|
"hard": 4
|
|
276
284
|
},
|
|
277
285
|
"templates/_agents/scripts/verify.mjs": {
|
|
278
|
-
"sha256": "
|
|
286
|
+
"sha256": "e0e3b4fa415d046375947026b8a37367f8da988bf6c669972e1193c941bc600e",
|
|
279
287
|
"hard": 3
|
|
280
288
|
},
|
|
281
289
|
"templates/_agents/scripts/wf-journal.mjs": {
|
|
@@ -315,16 +323,16 @@
|
|
|
315
323
|
"hard": 0
|
|
316
324
|
},
|
|
317
325
|
"templates/_githooks/pre-commit": {
|
|
318
|
-
"sha256": "
|
|
326
|
+
"sha256": "c27a24beed41d452aeafcd1ff2c6ae82aa986b1488b8f49478d65d16c23bde01",
|
|
319
327
|
"hard": 6
|
|
320
328
|
},
|
|
321
329
|
"templates/_githooks/pre-merge-commit": {
|
|
322
|
-
"sha256": "
|
|
330
|
+
"sha256": "960ec2248ed6eb7f43b3db9e8ae65c8b0492fce66b22288c2711760ff69a0f04",
|
|
323
331
|
"hard": 2
|
|
324
332
|
},
|
|
325
333
|
"templates/_githooks/pre-push": {
|
|
326
|
-
"sha256": "
|
|
327
|
-
"hard":
|
|
334
|
+
"sha256": "9b78ef895fecfad6fecff005763336f65bfb214459b6093c43321458aabbc9ea",
|
|
335
|
+
"hard": 5
|
|
328
336
|
},
|
|
329
337
|
"templates/_github/workflows/kit-ci.yml": {
|
|
330
338
|
"sha256": "7cb738f9b1dda787e541e5aab104ef9a651fe18a420fdc55bd761d3c077529b0",
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
// 1) 敏感信息扫描(暂存区新增行含疑似密钥 -> BLOCK)
|
|
3
3
|
// 2) 条件构建验证(按 .agents/hooks/commit-check.config.json 的 builds 配置;--full 不做 ext/prefix 裁剪,仍尊重 when)
|
|
4
4
|
// 3) 质量检测(config.checks:lint / 类型检查 / vet 等秒级确定性检查;--full 不做 ext/prefix 裁剪,仍尊重 when)
|
|
5
|
+
// 旗标(2026-10-16 构建门后移 pre-push,自源仓 2ff869a9 回灌):
|
|
6
|
+
// --no-build:跳过段 2 条件构建——pre-commit 常规提交用(提交内环提速);构建在 pre-push 按推送范围
|
|
7
|
+
// 执法,合并提交仍走 --full 全量构建(合并结果是没人验证过的新状态)。
|
|
8
|
+
// --range <old> <new>:推送范围模式(pre-push 用)——文件面取 git diff --name-only old new;
|
|
9
|
+
// old 为全零 sha(新分支首推)= 全量匹配语义(等价 --full 的构建面);段 1 敏感扫描跳过
|
|
10
|
+
// (逐提交时刻 pre-commit 已扫,范围重扫无增量价值)。默认(无旗标)暂存区模式行为不变。
|
|
5
11
|
// config 由 flow-kit init 按技术栈生成初值,项目可自行增改;缺失或无 builds/checks 时跳过对应段。
|
|
6
12
|
// 配置示例(.agents/hooks/commit-check.config.json):
|
|
7
13
|
// {
|
|
@@ -43,12 +49,27 @@ function sh(cmd, cwd) {
|
|
|
43
49
|
}
|
|
44
50
|
}
|
|
45
51
|
|
|
52
|
+
// --- 模式旗标(2026-10-16 构建门后移 pre-push;sha 经 git 管道来仍做白名单校验——信任边界) ---
|
|
53
|
+
const NO_BUILD = process.argv.includes('--no-build');
|
|
54
|
+
const rangeIdx = process.argv.indexOf('--range');
|
|
55
|
+
const RANGE = rangeIdx >= 0 ? process.argv.slice(rangeIdx + 1, rangeIdx + 3) : null;
|
|
56
|
+
if (RANGE && (RANGE.length < 2 || !/^[0-9a-f]{4,40}$/i.test(RANGE[0]) || !/^[0-9a-f]{4,40}$/i.test(RANGE[1]))) {
|
|
57
|
+
console.log(`BLOCK: --range 参数须为两个 git sha(现「${(RANGE || []).join(' ')}」)`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
// 全零 old = 新分支首推:git diff 对全零 sha 无从执行,且本就取全量匹配语义——文件面置空即可
|
|
61
|
+
const RANGE_ZERO_OLD = RANGE !== null && /^0+$/.test(RANGE[0]);
|
|
62
|
+
|
|
46
63
|
let staged = [];
|
|
47
64
|
try {
|
|
48
|
-
|
|
49
|
-
|
|
65
|
+
const listCmd = !RANGE ? 'git diff --cached --name-only'
|
|
66
|
+
: RANGE_ZERO_OLD ? null
|
|
67
|
+
: `git diff --name-only ${RANGE[0]} ${RANGE[1]}`;
|
|
68
|
+
staged = listCmd === null ? []
|
|
69
|
+
: execSync(listCmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] })
|
|
70
|
+
.split('\n').map(s => s.trim()).filter(Boolean);
|
|
50
71
|
} catch (e) {
|
|
51
|
-
console.log('BLOCK:
|
|
72
|
+
console.log('BLOCK: 无法读取变更文件面(git diff 失败)');
|
|
52
73
|
process.exit(1);
|
|
53
74
|
}
|
|
54
75
|
|
|
@@ -74,16 +95,18 @@ try {
|
|
|
74
95
|
} catch (e) { /* 空暂存 */ }
|
|
75
96
|
const added = diffText.split('\n').filter(l => l.startsWith('+') && !l.startsWith('+++'));
|
|
76
97
|
const hits = added.filter(l => SECRET.test(l) && !(KNOWN && KNOWN.test(l)) && !SELF.test(l));
|
|
77
|
-
if (hits.length) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
98
|
+
if (hits.length) {
|
|
99
|
+
console.log('BLOCK: 暂存区疑似包含敏感信息(密钥/连接串/令牌),请检查:\n' + hits.slice(0, 5).join('\n'));
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
if (RANGE) console.log('SKIP: --range 模式跳过敏感扫描(逐提交时刻 pre-commit 已扫,2026-10-16 构建门后移)');
|
|
81
103
|
|
|
82
104
|
// --- 2) 条件构建验证 ---
|
|
83
105
|
// --full:合并提交(pre-merge-commit / 冲突解决后手动 commit)使用——合并结果是没人验证过的新状态,
|
|
84
106
|
// 按 ext/prefix 裁剪可能漏掉需要重跑的一侧,故不做路径裁剪。when 仍生效:没有对应能力就不跑。
|
|
107
|
+
// --range 全零 old sha(新分支首推)同取全量匹配语义。
|
|
85
108
|
// 引擎自身文件(.agents/、.githooks/)不参与构建匹配——工作流引擎不是项目构建产物。
|
|
86
|
-
const FULL = process.argv.includes('--full');
|
|
109
|
+
const FULL = process.argv.includes('--full') || RANGE_ZERO_OLD;
|
|
87
110
|
const stagedForBuild = staged.filter(f => !f.startsWith('.agents/') && !f.startsWith('.githooks/'));
|
|
88
111
|
|
|
89
112
|
// whenSatisfied:任一谓词满足即启用。pkg: 读 cwd 下的 package.json;其余谓词相对仓库根。
|
|
@@ -117,30 +140,34 @@ function skipWhen(kind, item) {
|
|
|
117
140
|
console.log(`SKIP: ${item.name}(未找到 ${shown},跳过${kind}——配置好后自动启用)`);
|
|
118
141
|
}
|
|
119
142
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (b.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
143
|
+
if (NO_BUILD) {
|
|
144
|
+
console.log('SKIP: --no-build(2026-10-16 构建门后移 pre-push——常规提交不再构建,推送时按范围执法)');
|
|
145
|
+
} else {
|
|
146
|
+
let consideredBuild = false;
|
|
147
|
+
for (const b of (config.builds || [])) {
|
|
148
|
+
if (!b || !b.command) continue;
|
|
149
|
+
const exts = Array.isArray(b.ext) ? b.ext : [];
|
|
150
|
+
const match = FULL || stagedForBuild.some(f => exts.some(e => f.endsWith(e)) || (b.prefix ? f.startsWith(b.prefix) : false));
|
|
151
|
+
if (!match) continue;
|
|
152
|
+
consideredBuild = true;
|
|
153
|
+
if (!whenSatisfied(b.when, b.cwd)) { skipWhen('构建', b); continue; }
|
|
154
|
+
const r = sh(b.command, b.cwd);
|
|
155
|
+
if (!r.ok) {
|
|
156
|
+
if (b.lockPattern && new RegExp(b.lockPattern).test(r.out)) {
|
|
157
|
+
console.log(`BLOCK: ${b.name} 构建被文件锁拦下(与代码无关)。${b.lockHint || '停掉占用进程后原路重试'}\n` +
|
|
158
|
+
'锁冲突行:\n' + r.out.split(/\r?\n/).filter(l => new RegExp(b.lockPattern).test(l)).slice(0, 3).join('\n'));
|
|
159
|
+
} else {
|
|
160
|
+
console.log(`BLOCK: ${b.name} 构建失败(${b.command})\n` + r.out.slice(0, 1500));
|
|
161
|
+
}
|
|
162
|
+
process.exit(1);
|
|
135
163
|
}
|
|
136
|
-
|
|
164
|
+
console.log(`OK: ${b.name} 构建通过(${b.command})`);
|
|
165
|
+
}
|
|
166
|
+
if (!consideredBuild) {
|
|
167
|
+
console.log(config.builds && config.builds.length
|
|
168
|
+
? 'SKIP: 无匹配的源码变更,跳过构建验证'
|
|
169
|
+
: 'SKIP: 未配置 builds(.agents/hooks/commit-check.config.json),跳过构建验证');
|
|
137
170
|
}
|
|
138
|
-
console.log(`OK: ${b.name} 构建通过(${b.command})`);
|
|
139
|
-
}
|
|
140
|
-
if (!consideredBuild) {
|
|
141
|
-
console.log(config.builds && config.builds.length
|
|
142
|
-
? 'SKIP: 无匹配的源码变更,跳过构建验证'
|
|
143
|
-
: 'SKIP: 未配置 builds(.agents/hooks/commit-check.config.json),跳过构建验证');
|
|
144
171
|
}
|
|
145
172
|
|
|
146
173
|
// --- 3) 质量检测(checks:lint / 类型检查 / vet 等秒级确定性检查;测试不放这里——关单在 test.md 阶段门) ---
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# 引擎维护者面(engine-internals)
|
|
2
|
+
|
|
3
|
+
> 使用者只需 `.agents/commands/new-task.md` 的两问定级 + 路由表;本页收深水区:预判对账机理、
|
|
4
|
+
> kind 词表单源、规则生灭机制。环境事实单源在 `.agents/notes/runtime-env.md`(本页不涉及)。
|
|
5
|
+
> 本页属引擎面(`.agents/notes/`)。
|
|
6
|
+
|
|
7
|
+
## 预判留痕与 kind 词表(check-loop §25,2026-10-12 源仓建;kit 2026-10-13 B6b-2 回灌)
|
|
8
|
+
|
|
9
|
+
定级先做结构化预判(有结构化判定工具则对齐本仓判据,无则按两问自判),结果如实写进入口文档 frontmatter「预判: kind=<kind> level=<L1|L2|L3>」——与实际落位不符时 check-loop 出 WARN 留账(月度对账再议升格)。
|
|
10
|
+
|
|
11
|
+
**kind 词表**(单源 `pipeline-run.mjs` KINDS——§25 执法面 check-prejudgment.mjs 同款内联声明,注释互引、改任一侧须同步;任何列举处系摘录,增删以单源为准;非任务类型词):`require`(新需求,落 intents)/ `fix`(修复,落 incidents)/ `verify` / `review` / `deploy`。intents 只判 `require`、incidents 只判 `fix`;plans/specs 是两道共用件,不判类型只比对级别。终态文档(done/superseded/cancelled/fixed/closed)跳过形态/词表类告警——终态受检查 15 内容绑定不可修订,此类 WARN 永不可消;类型/级别比对照常。
|
|
12
|
+
|
|
13
|
+
## 规则生灭机制(2026-10-15 减重立项 自源仓回灌:锚日只升不降的对冲面)
|
|
14
|
+
|
|
15
|
+
- **生**:新检查以 advisory 灰度进入 → `effective-policy.md` 锚表按 policyVersion 升 hard。
|
|
16
|
+
- **死**(退役候选):`node .agents/scripts/agg-judgments.mjs --retire-candidates`——连续 6 个有数据月零命中(WARN+BLOCK=0)的规则列为候选;月度对账按 `.agents/mechanism-registry.md`「退役判据」列逐条裁决(安全主干/级别闭环主干等「不退役」行除外,附加停滞条件由人判)。
|
|
17
|
+
- **一进一出**:条目数预算指令 `<N>#count` 随 `rule-budget.mjs` 下发(`.agents/rule-budgets.txt` 填 `<路径> <N>#count` 即生效——匹配文件数上限,超限硬拦)。源仓以该指令锚定 check-loop 段数(26,段合并后 23);kit 检查段执行体在单体 check-loop.mjs 与 check-hygiene 模块内、无独立目录面,故模板不预设锚行——装户可自行为规则面(如 `.agents/rules/`)设锚。段编号承重不重排(§N 被锚名/机制台账跨文件引用),退役 = 段体删除,编号留疤。
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# 常驻面体积预算(单源:check-hygiene 检查 13(--all,WARN)与 .githooks/pre-commit(--staged,硬拦)共读)
|
|
2
2
|
# 格式:<路径或 glob> <上限字节>;路径以 / 结尾表示目录合计。上限 = 当前实测 + 余量。
|
|
3
|
+
# 条目数预算(2026-10-15 减重手段② 自源仓回灌):<路径或 glob> <N>#count = 匹配文件**条数**上限
|
|
4
|
+
# (规则面一进一出:新增一条须先退役一条,退役判定 node .agents/scripts/agg-judgments.mjs --retire-candidates)。
|
|
5
|
+
# 本表未预设条目数锚行——kit 无源仓 check-loop-sections/ 目录布局,检查段执行体在单体文件与 check-hygiene
|
|
6
|
+
# 模块内、段号承重稳定,条目数锚对象属装户自有决策面(指令能力随 rule-budget.mjs 下发,旧格式行零影响)。
|
|
3
7
|
# 超限含义:常驻面只增不减——须先删除或下沉被取代条目再增(一进一出)。
|
|
4
8
|
# 本文件会被 core.autocrlf 检出为 CRLF,读取方(rule-budget.mjs)按 /\r?\n/ 切分天然容 \r,禁止依赖行尾格式。
|
|
5
9
|
# 口径:预算比较用「索引 / HEAD 字节」(git cat-file,LF 归一);禁用工作区 wc -c 核对(CRLF 膨胀)。
|
|
@@ -7,6 +11,8 @@
|
|
|
7
11
|
# 超 8192 被拦)——单篇上限 8192→8704(与装户 Shipyard.Material 同值,512B 步进);目录合计未超不动。
|
|
8
12
|
# 2026-10-07 adopter-ci-github:AGENTS.md 门禁节补 CI 远端门一行(299B,实测 7969B 超 7680 被拦)——
|
|
9
13
|
# 新门入册属合法增长,同 512B 步进上调 7680→8192。
|
|
14
|
+
# 2026-10-16 减重系列回灌:new-task.md 增「预判留痕」指针行(§25 使用者入口 + engine-internals 维护者
|
|
15
|
+
# 面分离,自源仓减重手段⑤终态回灌)实测 8914B 超 8704 被拦——合法增长,同 512B 步进上调 8704→9216。
|
|
10
16
|
AGENTS.md 8192
|
|
11
|
-
.agents/commands/*.md
|
|
17
|
+
.agents/commands/*.md 9216
|
|
12
18
|
.agents/commands/ 65536
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// agg-judgments.mjs — check-loop 判定流水月度聚合(2026-10-11 judgment-ledger)
|
|
3
3
|
// 用法:node .agents/scripts/agg-judgments.mjs [--month=YYYY-MM]
|
|
4
|
+
// node .agents/scripts/agg-judgments.mjs --retire-candidates [--months=6]
|
|
4
5
|
// 源:.agents/judgments.jsonl(check-loop.mjs 每次真实运行追加一行,本地 gitignore;
|
|
5
6
|
// 缺文件 = 尚无运行记录,提示后 exit 0——与 delegations 台账「必在」不同,这是渐积数据)。
|
|
6
7
|
// 消费:mechanism-registry 月度对账(.agents/mechanism-registry.md「触发统计口径」列的 WARN/BLOCK 计数)
|
|
7
8
|
// 与 advisory→hard 升格 / 退役判定的直接查账面——替代原「人工 grep check-loop 输出」。
|
|
8
|
-
//
|
|
9
|
+
// --retire-candidates(2026-10-15 减重手段① 自源仓回灌,规则的死亡机制):列出「连续 N 个有数据月
|
|
10
|
+
// 零命中(WARN+BLOCK 全为 0)」的规则作为退役候选——月度对账时按 mechanism-registry「退役判据」
|
|
11
|
+
// 列逐条裁决(安全主干/级别闭环主干等「不退役」行除外;「且 X 停滞」类附加条件由人判)。
|
|
12
|
+
// 台账不足 N 个数据月 → 数据不充分,不产候选(年轻遥测不得制造假候选)。判定口径 = 尾部
|
|
13
|
+
// N 个「有运行的月」(非日历月——遥测断档的月不算零命中,防漏跑误判退役)。
|
|
14
|
+
// 测试:node .agents/scripts/agg-judgments.test.mjs(纯函数 aggFromRows / retireCandidates 进程内断言)
|
|
9
15
|
import fs from 'node:fs';
|
|
10
16
|
import path from 'node:path';
|
|
11
17
|
import { fileURLToPath } from 'node:url';
|
|
@@ -51,12 +57,82 @@ function readRows() {
|
|
|
51
57
|
return { rows, bad };
|
|
52
58
|
}
|
|
53
59
|
|
|
60
|
+
// retireCandidates(rows, windowMonths):退役候选 = 「尾部 windowMonths 个有数据月零命中」的规则。
|
|
61
|
+
// 口径:数据月 = 该月至少一次运行(断档月不参与,不按零命中计);候选须在全历史出现过(含只剩
|
|
62
|
+
// 零命中的月)且尾部窗口内 WARN+BLOCK 全 0。输出按全历史命中数升序(最冷门在前)。
|
|
63
|
+
// rows 不足 windowMonths 个数据月 → { sufficient:false }——年轻遥测不产候选。
|
|
64
|
+
export function retireCandidates(rows, windowMonths = 6) {
|
|
65
|
+
const { byMonth } = aggFromRows(rows);
|
|
66
|
+
const months = Object.keys(byMonth).sort();
|
|
67
|
+
if (months.length < windowMonths) {
|
|
68
|
+
return { sufficient: false, dataMonths: months.length, windowMonths, candidates: [], recentHits: [] };
|
|
69
|
+
}
|
|
70
|
+
const trailing = new Set(months.slice(-windowMonths));
|
|
71
|
+
const allRules = new Set();
|
|
72
|
+
for (const ym of months) for (const r of Object.keys(byMonth[ym].rules)) allRules.add(r);
|
|
73
|
+
const candidates = [];
|
|
74
|
+
const recentHits = [];
|
|
75
|
+
for (const rule of allRules) {
|
|
76
|
+
let total = 0;
|
|
77
|
+
let lastHit = null;
|
|
78
|
+
let inWindow = 0;
|
|
79
|
+
for (const ym of months) {
|
|
80
|
+
const cell = byMonth[ym].rules[rule];
|
|
81
|
+
const n = cell ? (cell.WARN + cell.BLOCK) : 0;
|
|
82
|
+
total += n;
|
|
83
|
+
if (n > 0) {
|
|
84
|
+
lastHit = ym;
|
|
85
|
+
if (trailing.has(ym)) inWindow += n;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const row = { rule, total, lastHit };
|
|
89
|
+
if (inWindow === 0) candidates.push(row);
|
|
90
|
+
else recentHits.push(row);
|
|
91
|
+
}
|
|
92
|
+
candidates.sort((a, b) => a.total - b.total || a.rule.localeCompare(b.rule));
|
|
93
|
+
recentHits.sort((a, b) => b.total - a.total || a.rule.localeCompare(b.rule));
|
|
94
|
+
return {
|
|
95
|
+
sufficient: true,
|
|
96
|
+
dataMonths: months.length,
|
|
97
|
+
windowMonths,
|
|
98
|
+
windowFrom: months.slice(-windowMonths)[0],
|
|
99
|
+
windowTo: months[months.length - 1],
|
|
100
|
+
candidates,
|
|
101
|
+
recentHits,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function printRetireCandidates(read) {
|
|
106
|
+
const wArg = Number((process.argv.find((a) => a.startsWith('--months=')) || '').split('=')[1]);
|
|
107
|
+
const windowMonths = Number.isFinite(wArg) && wArg >= 1 ? Math.floor(wArg) : 6;
|
|
108
|
+
const r = retireCandidates(read.rows, windowMonths);
|
|
109
|
+
if (!r.sufficient) {
|
|
110
|
+
console.log(`agg-judgments: 退役候选窗口 ${windowMonths} 个月——数据月仅 ${r.dataMonths} 个(台账 ${read.rows.length} 行),数据不充分不产候选。继续积累运行记录。`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
console.log(`退役候选(零命中窗口 ${r.windowFrom}..${r.windowTo},共 ${r.windowMonths} 个数据月)——仅机械筛查,裁决走 mechanism-registry「退役判据」列(「不退役」主干除外):`);
|
|
114
|
+
if (!r.candidates.length) {
|
|
115
|
+
console.log(' (无候选——尾部窗口内所有规则均有命中)');
|
|
116
|
+
}
|
|
117
|
+
for (const c of r.candidates) {
|
|
118
|
+
console.log(` 候选 ${c.rule.padEnd(24)} 全历史命中 ${String(c.total).padStart(4)} 末次命中 ${c.lastHit || '—'}`);
|
|
119
|
+
}
|
|
120
|
+
for (const c of r.recentHits) {
|
|
121
|
+
console.log(` 在役 ${c.rule.padEnd(24)} 全历史命中 ${String(c.total).padStart(4)} 末次命中 ${c.lastHit}`);
|
|
122
|
+
}
|
|
123
|
+
if (read.bad) console.error(`agg-judgments: 跳过坏行 ${read.bad}(JSON 解析失败,不中断聚合)`);
|
|
124
|
+
}
|
|
125
|
+
|
|
54
126
|
function main() {
|
|
55
127
|
const read = readRows();
|
|
56
128
|
if (!read) {
|
|
57
129
|
console.error(`agg-judgments: ${path.relative(ROOT, LEDGER)} 不存在——尚无运行记录(check-loop 真实运行一次即有一行)`);
|
|
58
130
|
process.exit(0);
|
|
59
131
|
}
|
|
132
|
+
if (process.argv.includes('--retire-candidates')) {
|
|
133
|
+
printRetireCandidates(read);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
60
136
|
const { byMonth } = aggFromRows(read.rows, argMonth);
|
|
61
137
|
const months = Object.keys(byMonth).sort();
|
|
62
138
|
if (!months.length) {
|