agentic-flow-kit 1.7.16 → 1.8.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.
Files changed (161) hide show
  1. package/README.md +11 -7
  2. package/modules/hosts/claude/commands/wf-build.md +1 -1
  3. package/modules/hosts/claude/commands/wf-maintain.md +1 -1
  4. package/modules/hosts/claude/commands/wf-new-task.md +9 -8
  5. package/modules/hosts/claude/commands/wf-plan.md +1 -1
  6. package/modules/hosts/claude/commands/wf-review.md +2 -2
  7. package/modules/hosts/claude/commands/wf-test.md +1 -1
  8. package/modules/hosts/codex/commands/wf-build.md +1 -1
  9. package/modules/hosts/codex/commands/wf-maintain.md +1 -1
  10. package/modules/hosts/codex/commands/wf-new-task.md +9 -8
  11. package/modules/hosts/codex/commands/wf-plan.md +1 -1
  12. package/modules/hosts/codex/commands/wf-review.md +2 -2
  13. package/modules/hosts/codex/commands/wf-test.md +1 -1
  14. package/modules/hosts/cursor/commands/wf-build.md +1 -1
  15. package/modules/hosts/cursor/commands/wf-maintain.md +1 -1
  16. package/modules/hosts/cursor/commands/wf-new-task.md +9 -8
  17. package/modules/hosts/cursor/commands/wf-plan.md +1 -1
  18. package/modules/hosts/cursor/commands/wf-review.md +2 -2
  19. package/modules/hosts/cursor/commands/wf-test.md +1 -1
  20. package/modules/hosts/opencode/commands/wf-build.md +1 -1
  21. package/modules/hosts/opencode/commands/wf-maintain.md +1 -1
  22. package/modules/hosts/opencode/commands/wf-new-task.md +9 -8
  23. package/modules/hosts/opencode/commands/wf-plan.md +1 -1
  24. package/modules/hosts/opencode/commands/wf-review.md +2 -2
  25. package/modules/hosts/opencode/commands/wf-test.md +1 -1
  26. package/modules/hosts/trae/commands/wf-build.md +1 -1
  27. package/modules/hosts/trae/commands/wf-maintain.md +1 -1
  28. package/modules/hosts/trae/commands/wf-new-task.md +9 -8
  29. package/modules/hosts/trae/commands/wf-plan.md +1 -1
  30. package/modules/hosts/trae/commands/wf-review.md +2 -2
  31. package/modules/hosts/trae/commands/wf-test.md +1 -1
  32. package/package.json +1 -1
  33. package/src/cli.mjs +6 -2
  34. package/src/doctor.mjs +11 -2
  35. package/src/executor.mjs +25 -8
  36. package/src/executor.test.mjs +4 -1
  37. package/src/fresh-init.test.mjs +1 -1
  38. package/src/init.mjs +20 -3
  39. package/src/profiles.mjs +7 -3
  40. package/src/rule-budget.test.mjs +2 -2
  41. package/src/stack-profile.test.mjs +6 -0
  42. package/src/validate.mjs +6 -1
  43. package/src/validate.test.mjs +1 -1
  44. package/templates/.gitattributes +4 -1
  45. package/templates/AGENTS.md +2 -2
  46. package/templates/_agents/commands/build.md +1 -1
  47. package/templates/_agents/commands/maintain.md +1 -1
  48. package/templates/_agents/commands/new-task.md +9 -8
  49. package/templates/_agents/commands/plan.md +1 -1
  50. package/templates/_agents/commands/review.md +2 -2
  51. package/templates/_agents/commands/test.md +1 -1
  52. package/templates/_agents/engine-lock.json +130 -42
  53. package/templates/_agents/hooks/check-index-incremental.mjs +48 -0
  54. package/templates/_agents/hooks/check-pairing-incremental.mjs +66 -0
  55. package/templates/_agents/hooks/check-wiki-ledger.mjs +30 -0
  56. package/templates/_agents/lane-surfaces.txt +4 -1
  57. package/templates/_agents/level-hints.txt +1 -1
  58. package/templates/_agents/loop/papercut-debt/DESIGN.md +112 -0
  59. package/templates/_agents/mechanism-registry.md +27 -0
  60. package/templates/_agents/rule-budgets.txt +2 -2
  61. package/templates/_agents/scripts/agg-delegations.cjs +21 -3
  62. package/templates/_agents/scripts/agg-gate-stats.mjs +3 -3
  63. package/templates/_agents/scripts/agg-judgments.mjs +80 -0
  64. package/templates/_agents/scripts/agg-judgments.test.mjs +45 -0
  65. package/templates/_agents/scripts/archive-sweep.mjs +233 -0
  66. package/templates/_agents/scripts/archive-sweep.test.mjs +129 -0
  67. package/templates/_agents/scripts/check-attribution.mjs +37 -0
  68. package/templates/_agents/scripts/check-convergence.mjs +119 -0
  69. package/templates/_agents/scripts/check-engine-integrity.mjs +4 -1
  70. package/templates/_agents/scripts/check-funnel.mjs +56 -0
  71. package/templates/_agents/scripts/check-hygiene.mjs +5 -5
  72. package/templates/_agents/scripts/check-index-incremental.test.mjs +73 -0
  73. package/templates/_agents/scripts/check-lane-surface.mjs +2 -2
  74. package/templates/_agents/scripts/check-lane-surface.test.mjs +5 -5
  75. package/templates/_agents/scripts/check-ledger-invariant.mjs +403 -152
  76. package/templates/_agents/scripts/check-ledger-invariant.test.mjs +433 -3
  77. package/templates/_agents/scripts/check-loop-rev.test.mjs +8 -5
  78. package/templates/_agents/scripts/check-loop-unit.test.mjs +8 -0
  79. package/templates/_agents/scripts/check-loop.mjs +215 -34
  80. package/templates/_agents/scripts/check-loop.test.mjs +582 -49
  81. package/templates/_agents/scripts/check-prejudgment.mjs +64 -0
  82. package/templates/_agents/scripts/check-registry.mjs +45 -0
  83. package/templates/_agents/scripts/check-scope.mjs +96 -0
  84. package/templates/_agents/scripts/check-scope.test.mjs +96 -0
  85. package/templates/_agents/scripts/check-scripts-syntax.mjs +61 -0
  86. package/templates/_agents/scripts/check-scripts-syntax.test.mjs +72 -0
  87. package/templates/_agents/scripts/check-spec-verif.mjs +47 -0
  88. package/templates/_agents/scripts/compact-ledgers.mjs +3 -3
  89. package/templates/_agents/scripts/confirm-doc.mjs +114 -38
  90. package/templates/_agents/scripts/confirm-doc.test.mjs +180 -4
  91. package/templates/_agents/scripts/edit-face-check.mjs +5 -3
  92. package/templates/_agents/scripts/fill-intent.mjs +5 -3
  93. package/templates/_agents/scripts/fill-intent.test.mjs +19 -1
  94. package/templates/_agents/scripts/fill-plan.mjs +10 -6
  95. package/templates/_agents/scripts/fill-plan.test.mjs +19 -3
  96. package/templates/_agents/scripts/fill-spec.mjs +6 -3
  97. package/templates/_agents/scripts/fill-spec.test.mjs +12 -4
  98. package/templates/_agents/scripts/fixture-scripts.mjs +2 -2
  99. package/templates/_agents/scripts/fixture-scripts.test.mjs +6 -1
  100. package/templates/_agents/scripts/gate-checklist.mjs +6 -0
  101. package/templates/_agents/scripts/gate-seg.mjs +1 -1
  102. package/templates/_agents/scripts/gen-effective-policy.mjs +107 -0
  103. package/templates/_agents/scripts/gen-effective-policy.test.mjs +100 -0
  104. package/templates/_agents/scripts/gen-verify-evidence.mjs +107 -0
  105. package/templates/_agents/scripts/gen-verify-evidence.test.mjs +84 -0
  106. package/templates/_agents/scripts/gen-workflow-dashboard.mjs +8 -3
  107. package/templates/_agents/scripts/gen-workflow-dashboard.test.mjs +2 -1
  108. package/templates/_agents/scripts/gen-workflow-metrics.mjs +3 -3
  109. package/templates/_agents/scripts/git-core.mjs +45 -0
  110. package/templates/_agents/scripts/judgment-ledger.mjs +65 -0
  111. package/templates/_agents/scripts/judgment-ledger.test.mjs +129 -0
  112. package/templates/_agents/scripts/kb-search.mjs +19 -4
  113. package/templates/_agents/scripts/kb-search.test.mjs +33 -0
  114. package/templates/_agents/scripts/lane-surface-audit.mjs +143 -0
  115. package/templates/_agents/scripts/lane-surface-audit.test.mjs +93 -0
  116. package/templates/_agents/scripts/ledger-shards.mjs +307 -0
  117. package/templates/_agents/scripts/ledger-shards.test.mjs +339 -0
  118. package/templates/_agents/scripts/level-criteria.mjs +9 -10
  119. package/templates/_agents/scripts/level-criteria.test.mjs +7 -5
  120. package/templates/_agents/scripts/papercut-debt-controller.mjs +141 -0
  121. package/templates/_agents/scripts/papercut-debt-controller.test.mjs +127 -0
  122. package/templates/_agents/scripts/papercut-debt-sensor.mjs +170 -0
  123. package/templates/_agents/scripts/papercut-debt-sensor.test.mjs +146 -0
  124. package/templates/_agents/scripts/pipeline-run.mjs +6 -22
  125. package/templates/_agents/scripts/pipeline-run.test.mjs +22 -42
  126. package/templates/_agents/scripts/policy.mjs +28 -0
  127. package/templates/_agents/scripts/resolve-merge-conflicts.mjs +110 -0
  128. package/templates/_agents/scripts/resolve-merge-conflicts.test.mjs +87 -0
  129. package/templates/_agents/scripts/rewrite-file.mjs +133 -0
  130. package/templates/_agents/scripts/rewrite-file.test.mjs +148 -0
  131. package/templates/_agents/scripts/rule-budget.mjs +83 -0
  132. package/templates/_agents/scripts/run-tests.mjs +99 -0
  133. package/templates/_agents/scripts/run-tests.test.mjs +105 -0
  134. package/templates/_agents/scripts/solidify-task.test.mjs +1 -1
  135. package/templates/_agents/scripts/stage-gates.mjs +34 -12
  136. package/templates/_agents/scripts/trust-mode.mjs +4 -4
  137. package/templates/_agents/scripts/trust-mode.test.mjs +1 -1
  138. package/templates/_agents/scripts/verify.mjs +135 -58
  139. package/templates/_agents/scripts/verify.test.mjs +156 -47
  140. package/templates/_agents/scripts/wf-journal.mjs +8 -4
  141. package/templates/_agents/scripts/workflow-board-server.test.mjs +2 -2
  142. package/templates/_agents/scripts/workflow-enums.test.mjs +14 -5
  143. package/templates/_agents/scripts-test-exempt.txt +1 -0
  144. package/templates/_agents/skills/papercut-fix/SKILL.md +60 -0
  145. package/templates/_agents/skills/papercut-fix/references/response-template.md +81 -0
  146. package/templates/_agents/skills/review-method/SKILL.md +55 -0
  147. package/templates/_agents/workflow-enums.txt +8 -1
  148. package/templates/_githooks/pre-commit +110 -90
  149. package/templates/_githooks/pre-merge-commit +27 -23
  150. package/templates/_githooks/pre-push +4 -3
  151. package/templates/_github/workflows/kit-ci.yml +4 -3
  152. package/templates/workflow/README.md +14 -7
  153. package/templates/workflow/incidents/_TEMPLATE.md +4 -1
  154. package/templates/workflow/intents/_TEMPLATE.md +4 -2
  155. package/templates/workflow/papercuts.md +2 -0
  156. package/templates/workflow/plans/_TEMPLATE.md +10 -5
  157. package/templates/workflow/regression-checklist.md +1 -0
  158. package/templates/workflow/specs/_TEMPLATE.md +17 -1
  159. package/templates/_agents/hooks/check-pairing-incremental.sh +0 -43
  160. package/templates/_agents/hooks/check-wiki-ledger.sh +0 -18
  161. package/templates/_agents/scripts/rule-budget.sh +0 -74
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schema": 1,
3
- "generatedAt": "2026-10-13T08:17:26.315Z",
3
+ "generatedAt": "2026-10-15T16:47:55.700Z",
4
4
  "files": {
5
5
  ".github/workflows/ci.yml": {
6
- "sha256": "ae6b751a29ce08f28f8831fc9b64770acce4d42fc6a5bd60286eca67e8488bd9",
6
+ "sha256": "e9cffb90dec8f0a49bfe231a13fb8df375a2494cc75c38d991b5eb7c7be104b5",
7
7
  "hard": 3
8
8
  },
9
9
  ".github/workflows/release.yml": {
@@ -11,7 +11,7 @@
11
11
  "hard": 0
12
12
  },
13
13
  "templates/AGENTS.md": {
14
- "sha256": "013df60e0236f3bbd22ca9d8140cc922cdfd603a3efdf58b13a95a6e561d0017",
14
+ "sha256": "521b8549ce077278f31074db10f1934bc7f63788d43a6bb68f1c1510ad31cf82",
15
15
  "hard": 27
16
16
  },
17
17
  "templates/_agents/control-surfaces.txt": {
@@ -19,11 +19,11 @@
19
19
  "hard": 29
20
20
  },
21
21
  "templates/_agents/lane-surfaces.txt": {
22
- "sha256": "e378c19f5a85bd9118a1e2e04fb18645482990e886df32ea97c4d65411d850e6",
22
+ "sha256": "5bc5f0738a4a5d618a3f20ac052cd7f7dc41e4da45f4d0015567a4bc3dd63ddf",
23
23
  "hard": 5
24
24
  },
25
25
  "templates/_agents/level-hints.txt": {
26
- "sha256": "6cb3a2c9f2bdd9b0f859c3eb67c310e2dab12d8777a5bd82a31a8634890b0a43",
26
+ "sha256": "4f665117af0b82a9856b3c03056e30b13496f864ca8398538ca43c38be32f50c",
27
27
  "hard": 0
28
28
  },
29
29
  "templates/_agents/metric-claims.txt": {
@@ -31,59 +31,99 @@
31
31
  "hard": 8
32
32
  },
33
33
  "templates/_agents/rule-budgets.txt": {
34
- "sha256": "cd5fee0ae3eebe0398f2b15d4c801bc7f30c4ec20d46508033eeebb4a417a960",
34
+ "sha256": "300a79e35ae7c2e5caf824b95a71e1eaf4755ecc0ade1d25374533abacf8ab16",
35
35
  "hard": 3
36
36
  },
37
37
  "templates/_agents/scripts-test-exempt.txt": {
38
- "sha256": "05a96ae19289deb074392ca4de212aa277dabf2ea8bc7be8bceb9f3c7a234fbd",
39
- "hard": 5
38
+ "sha256": "7fba8ab2a2d0c40b9211165beb832dc81b1ac4ddb4d4fdc9fe35010a6159cbf7",
39
+ "hard": 6
40
40
  },
41
41
  "templates/_agents/scripts/agg-gate-stats.mjs": {
42
- "sha256": "488517dfdc37b79b327e1f47603c94fc1fc236145d12df213e6ce2de60f11730",
42
+ "sha256": "80d10a917a864910f62714423d0740e4bee6cc4e4621a01384e67f77409e4d82",
43
+ "hard": 0
44
+ },
45
+ "templates/_agents/scripts/agg-judgments.mjs": {
46
+ "sha256": "3967acc21b247045cca8c1549a19f9b7fccf610696496128e824335d3e6e7958",
43
47
  "hard": 0
44
48
  },
49
+ "templates/_agents/scripts/archive-sweep.mjs": {
50
+ "sha256": "2d7270d0ded58d0639d1b1eefb8b521895a702f9dec43f9fa4cd485432e56bda",
51
+ "hard": 0
52
+ },
53
+ "templates/_agents/scripts/check-attribution.mjs": {
54
+ "sha256": "6ac53c734112fda2516eaaf7be50f22c8975e49faa07aefdc374021517c5aa24",
55
+ "hard": 0
56
+ },
57
+ "templates/_agents/scripts/check-convergence.mjs": {
58
+ "sha256": "e82743bc750f2d22b32ae97a56245b74440efbc4c7862e7345f97632769d5a28",
59
+ "hard": 1
60
+ },
45
61
  "templates/_agents/scripts/check-engine-integrity.mjs": {
46
- "sha256": "e62a23c861d060ee74f15aae57410cfce8e644e29517ebc5b1c1c3d85e5935c1",
62
+ "sha256": "ec90678bcee52bfa475ff277d2743f3af751d372ea52f09ecb91226f5af8f89d",
47
63
  "hard": 2
48
64
  },
65
+ "templates/_agents/scripts/check-funnel.mjs": {
66
+ "sha256": "629036bdf08a48fc14076a11d8c95f7f7a5465fdb9bf3263d0ae049cf47b9fa3",
67
+ "hard": 0
68
+ },
49
69
  "templates/_agents/scripts/check-hygiene.mjs": {
50
- "sha256": "0fecd44c28f1b5759a4bb01f3c19213cace48a162e27802f2f1c1df67eec15ff",
70
+ "sha256": "cfcd35e29ee42e9096804e7a34872fa2259bf3856944aa9fd7b776c220e9bccc",
51
71
  "hard": 0
52
72
  },
53
73
  "templates/_agents/scripts/check-lane-surface.mjs": {
54
- "sha256": "c22ad9ab80070051d2c9db344f407c70e9d9a2815dc0c73066f43bc16592bf98",
74
+ "sha256": "419a46ac34a25ab4f2ccff51e52b91e6212991bc6898b9d3c92cce4f49f6c116",
55
75
  "hard": 2
56
76
  },
57
77
  "templates/_agents/scripts/check-ledger-invariant.mjs": {
58
- "sha256": "2d187a82781a5e076985d91f1a4734b45cd507c1b87942064bad949bd0b3f806",
78
+ "sha256": "56e66f0e066f889383a71415cc02f6268cbfbca8a80671454cca61a2aad25d33",
59
79
  "hard": 2
60
80
  },
61
81
  "templates/_agents/scripts/check-loop.mjs": {
62
- "sha256": "a7af1f7c065b20e81b137027d02762d1414ea2ead778e45b5f17dcb7c14017f4",
82
+ "sha256": "0ee83322c22ab5300976ede2593c98c0d20abf840850191257833c9ef79490a5",
63
83
  "hard": 32
64
84
  },
65
85
  "templates/_agents/scripts/check-metric-claims.mjs": {
66
86
  "sha256": "2c2d8615e9418117d43202dc67cd4131e43fb6c095686363dfcd2fd2cb542f2a",
67
87
  "hard": 0
68
88
  },
89
+ "templates/_agents/scripts/check-prejudgment.mjs": {
90
+ "sha256": "050227917cc5e5e73a189b23ea7f5ff7b5633b5e265b33e153147409772f7936",
91
+ "hard": 0
92
+ },
93
+ "templates/_agents/scripts/check-registry.mjs": {
94
+ "sha256": "0033655ef873230d94820300ea6c86529b87d2506903b7f42fb91cfbf5beda63",
95
+ "hard": 0
96
+ },
97
+ "templates/_agents/scripts/check-scope.mjs": {
98
+ "sha256": "241dcd001ce2afa3ccfd7aeba79cd1f8d33ded34efcd3b119f2f811311d1c68c",
99
+ "hard": 1
100
+ },
101
+ "templates/_agents/scripts/check-scripts-syntax.mjs": {
102
+ "sha256": "0a6db271a1e02dae8e10ef197ff51376d256da844e9d83df4806d3cf50ac0454",
103
+ "hard": 3
104
+ },
105
+ "templates/_agents/scripts/check-spec-verif.mjs": {
106
+ "sha256": "5a3d719bcc2d4e506609259f5e5b9412e2bf206ddc8bbd9154129ac8e0c95ebf",
107
+ "hard": 0
108
+ },
69
109
  "templates/_agents/scripts/check-stage-index.mjs": {
70
110
  "sha256": "9118b8fe57b80b5d36a0db38ed141c08036629895c143a64f0c29e301b2218c8",
71
111
  "hard": 0
72
112
  },
73
113
  "templates/_agents/scripts/compact-ledgers.mjs": {
74
- "sha256": "b517a775bcbcaaca8b8e58ed85c611c9fc1a40f64b19ee0f40ea137b40a0042e",
114
+ "sha256": "99ee805337c9bd11500432f1525985781ad3165e6140e9e354efd9f5418fff78",
75
115
  "hard": 1
76
116
  },
77
117
  "templates/_agents/scripts/confirm-doc.mjs": {
78
- "sha256": "8d9f8478fa80be447c8e372a94be4b991c02a9077c7bd087bbf8e77feb65834e",
79
- "hard": 12
118
+ "sha256": "d3011a109b7e9af6d01314911c3c5f4d8de52a39c57e98fafc4541389d2b9d74",
119
+ "hard": 13
80
120
  },
81
121
  "templates/_agents/scripts/draft-sediment.mjs": {
82
122
  "sha256": "a9c51e3fd139adf32755d882e0de53f208784be68a75c1881658c3886605c76d",
83
123
  "hard": 1
84
124
  },
85
125
  "templates/_agents/scripts/edit-face-check.mjs": {
86
- "sha256": "24faba555101f0aacd652e3728c99982f95461cd57de844f9483df6a6923d1fa",
126
+ "sha256": "83b23ae5cd3b147c06e18d1e1c63c834b9deb9173101ba526c2f329fd697e20f",
87
127
  "hard": 0
88
128
  },
89
129
  "templates/_agents/scripts/ensure-board.mjs": {
@@ -91,35 +131,43 @@
91
131
  "hard": 0
92
132
  },
93
133
  "templates/_agents/scripts/fill-intent.mjs": {
94
- "sha256": "b5e386e2a088c2cfbb9101379233295ce199d668866ddef596140fc76db6d766",
134
+ "sha256": "a1af15bb10f01678ad70cc2fffe803909cc48571bb123b5c1e9a0c1a2f0ef9ca",
95
135
  "hard": 1
96
136
  },
97
137
  "templates/_agents/scripts/fill-plan.mjs": {
98
- "sha256": "ea60a3e478236e4fc3b25c84bb74217f3eb5130968d3165665e17ae7cc2329af",
138
+ "sha256": "aeeaf9a39e0faebb56b5626ac2dbd5dc3e80635799a52ce2f52d0a17fb1241a5",
99
139
  "hard": 1
100
140
  },
101
141
  "templates/_agents/scripts/fill-spec.mjs": {
102
- "sha256": "27aa4d55a9c17be40b8c3a89191b3336661340ca975cf04397dd62afe4ec2431",
142
+ "sha256": "0b583862ce06fa2d8a31d64a1e2283d383bfc24d511bbe881630e4a5aaf7cfc8",
103
143
  "hard": 1
104
144
  },
105
145
  "templates/_agents/scripts/fixture-scripts.mjs": {
106
- "sha256": "9f27ff097b8a4172de5f96aa23c1c625801bc5625e2434c332c30482b1761380",
146
+ "sha256": "4652c35fbc0a34f1782707d06c1b332d4202034ee3519a098ac6c4afdb1afe7d",
107
147
  "hard": 0
108
148
  },
109
149
  "templates/_agents/scripts/gate-checklist.mjs": {
110
- "sha256": "99ec369fddee6867a2baeced610760e58a3f85506f95f8a4131bcc584a3a3109",
150
+ "sha256": "8617dcb996ec15fc1a607beaec6970fee4890df79bd5ac96298c1545ef36c9c9",
111
151
  "hard": 1
112
152
  },
113
153
  "templates/_agents/scripts/gate-seg.mjs": {
114
- "sha256": "b579593ff67e7876e4e1051f62c9a7451032fb2255a2efe5e437a6a2e2c1ce9f",
154
+ "sha256": "bf0b7957ef5e5b7d62c225fc8484392af8ce82ff79b6e59da733a134a4a836f9",
115
155
  "hard": 0
116
156
  },
157
+ "templates/_agents/scripts/gen-effective-policy.mjs": {
158
+ "sha256": "25da0aadb569708770e8d2ee9492a480ed71da12d70e505871e06964c4ed6d13",
159
+ "hard": 1
160
+ },
161
+ "templates/_agents/scripts/gen-verify-evidence.mjs": {
162
+ "sha256": "54a9ba0beed820d5a37de7a7762cdb37076871e260506e54b6987b6631bb9804",
163
+ "hard": 1
164
+ },
117
165
  "templates/_agents/scripts/gen-wiki-board.mjs": {
118
166
  "sha256": "c0e86110c8b686b591080f836d7cde6dc4a933820541ceb35928ac249b5d0fb6",
119
167
  "hard": 6
120
168
  },
121
169
  "templates/_agents/scripts/gen-workflow-dashboard.mjs": {
122
- "sha256": "335485bf6979b43f642e613abae951b69ad4d6b6ed0b026dfdde7f14cd2aebdc",
170
+ "sha256": "699cd362e78baef7a52df96bcfb85b26db5870d26cadc4250b05b77fbca19804",
123
171
  "hard": 0
124
172
  },
125
173
  "templates/_agents/scripts/gen-workflow-index.mjs": {
@@ -127,21 +175,33 @@
127
175
  "hard": 3
128
176
  },
129
177
  "templates/_agents/scripts/gen-workflow-metrics.mjs": {
130
- "sha256": "c91b6ff9fd5e3b391c8c50af1d68f35058286ef432dddb325f284e0d60833d56",
178
+ "sha256": "80cb5b1ede6400e118f92abea35416ed7a480f9c9ed78dd3fa68210dd2c85da9",
131
179
  "hard": 2
132
180
  },
181
+ "templates/_agents/scripts/git-core.mjs": {
182
+ "sha256": "a74de2c43a5f4ab0444411f2164828b5e92794b2594723f1b6fd6e13d84156cc",
183
+ "hard": 0
184
+ },
133
185
  "templates/_agents/scripts/git-merge-jsonl.mjs": {
134
186
  "sha256": "e8c037dcce1f9e52dd9d63ef812ce3ace03f1ecf3e55cb363e58bd8b50352655",
135
187
  "hard": 2
136
188
  },
189
+ "templates/_agents/scripts/judgment-ledger.mjs": {
190
+ "sha256": "b98e5f06541c180bf5fc4479f40c06310c707eb8f4e090ed65fe0c8d37f5d2fb",
191
+ "hard": 0
192
+ },
137
193
  "templates/_agents/scripts/kb-cache-evict.mjs": {
138
194
  "sha256": "bd74ac72e611142e839df76e80e22d8e9c6b351dc498c7bb07e807d2e32e7fdb",
139
195
  "hard": 0
140
196
  },
141
197
  "templates/_agents/scripts/kb-search.mjs": {
142
- "sha256": "3439e59cdafc8a52549fc8cee3bab8eaec384e4761d3f87a7f18db0a8e289d0c",
198
+ "sha256": "b80b843fec87053058f4e8ca442c2d12ce5f5cd9b2377903ef9d5270b60142ca",
143
199
  "hard": 7
144
200
  },
201
+ "templates/_agents/scripts/lane-surface-audit.mjs": {
202
+ "sha256": "3fc9157219de4c35a8828902c4bdb223fee41a9fbc3db79e7d9fb4bbb677dcbb",
203
+ "hard": 0
204
+ },
145
205
  "templates/_agents/scripts/ledger-loader.mjs": {
146
206
  "sha256": "855619ec778eae07540f71ebab0c2f30de0e6b97b522ad69e4d1757cc4202713",
147
207
  "hard": 0
@@ -150,10 +210,22 @@
150
210
  "sha256": "82ca3086bf76087ece4436bf2c23a2e102c22dffd6c987c08096286c3d16a0b7",
151
211
  "hard": 0
152
212
  },
213
+ "templates/_agents/scripts/ledger-shards.mjs": {
214
+ "sha256": "2f925919aa88e4ac53bca54706d04e3dbda8f4d51c23120924b32d8b73e5961d",
215
+ "hard": 0
216
+ },
153
217
  "templates/_agents/scripts/level-criteria.mjs": {
154
- "sha256": "384fc339ba1d24815a1db226cb8be165b4c042b983bc7af6c6623114ddc35234",
218
+ "sha256": "fe605f053aee21804e5a2d920830e17f7ef1c2935bd8ec3e0ca9aeca0de181c1",
155
219
  "hard": 1
156
220
  },
221
+ "templates/_agents/scripts/papercut-debt-controller.mjs": {
222
+ "sha256": "4e96b4fcb9500c42598afa54d0f3b9f515c11c4512dc4da180830c896e2d564a",
223
+ "hard": 0
224
+ },
225
+ "templates/_agents/scripts/papercut-debt-sensor.mjs": {
226
+ "sha256": "c4a1376d0e09dcb3e62bbf1019d10ed5f950cf3073c8096bba4e746035ff8cd4",
227
+ "hard": 0
228
+ },
157
229
  "templates/_agents/scripts/pipeline-run-docs.mjs": {
158
230
  "sha256": "d54085b21d857f4db6df7d5fc7b6a65ffc2391c9e0f100754d1e76a844a318c1",
159
231
  "hard": 0
@@ -163,23 +235,39 @@
163
235
  "hard": 0
164
236
  },
165
237
  "templates/_agents/scripts/pipeline-run.mjs": {
166
- "sha256": "6cdf2de3bcbf94d59ccf5e6c4015e89b6032c844c2cc540fdc4f9e02244faa9c",
238
+ "sha256": "d3c964c132f3a085f84589447e6f700dead02b441f012511ab913bf975955f79",
167
239
  "hard": 0
168
240
  },
169
241
  "templates/_agents/scripts/policy.mjs": {
170
- "sha256": "eab1a54334d83b93f276593be4e10a17af7734a7c44f8c28a6383946f735613e",
242
+ "sha256": "b51e1b4ca949b25d9c26df512612ff05ff82031890d0b8dbc7beb7aa34270f1b",
171
243
  "hard": 0
172
244
  },
245
+ "templates/_agents/scripts/resolve-merge-conflicts.mjs": {
246
+ "sha256": "da2a4438414b440fb2e7f3fa3579589f2eb9148550925e8736022736c3016e9f",
247
+ "hard": 0
248
+ },
249
+ "templates/_agents/scripts/rewrite-file.mjs": {
250
+ "sha256": "690de4ddf6c521646c197e138f9adb4c50ad9dd53fb448cef7a6565419361651",
251
+ "hard": 4
252
+ },
253
+ "templates/_agents/scripts/rule-budget.mjs": {
254
+ "sha256": "34b90d916632d7b44bf4283da364117d128e0f30255a064e57bb50b35a493905",
255
+ "hard": 0
256
+ },
257
+ "templates/_agents/scripts/run-tests.mjs": {
258
+ "sha256": "3fe3fa3f7b31a7e93878ae08cd4d4db4a5fc2abf2013feeba637f369b49f6d2a",
259
+ "hard": 3
260
+ },
173
261
  "templates/_agents/scripts/solidify-task.mjs": {
174
262
  "sha256": "5e5983b9ab6ae4eaaeced150018592b2501c4d6885b4913d03c6f29138630825",
175
263
  "hard": 3
176
264
  },
177
265
  "templates/_agents/scripts/stage-gates.mjs": {
178
- "sha256": "6c70ff01f785d19dfa7206cc01c1608baa3249ba59f57190b19b64f318e34e72",
266
+ "sha256": "ed9bfe9e239cc087fadc8ec14f3bf61df6b11f6bf76596bce40e2cf2432bb71a",
179
267
  "hard": 0
180
268
  },
181
269
  "templates/_agents/scripts/trust-mode.mjs": {
182
- "sha256": "5800b52af787d6b3fd9a8ea314b36466e19a3adc90f70e93c5054cd530c68bff",
270
+ "sha256": "ad5d784056fc2d6436ac5c9e0b5beee8bd5e6a5dc94987f06cf8d5e71eb24aff",
183
271
  "hard": 1
184
272
  },
185
273
  "templates/_agents/scripts/verify-wiki-consistency.mjs": {
@@ -187,11 +275,11 @@
187
275
  "hard": 4
188
276
  },
189
277
  "templates/_agents/scripts/verify.mjs": {
190
- "sha256": "a40a23193dae79e189c9c7b1f8b1c4c6e1865baa94052c85ed59802864aa46b9",
278
+ "sha256": "193d50f69ddca0e4044ecb3dd55b6f524c4920e0b75a929df2d1f2371254c107",
191
279
  "hard": 3
192
280
  },
193
281
  "templates/_agents/scripts/wf-journal.mjs": {
194
- "sha256": "b14620e5c9f9c930f4a916084543ce190a135216f11bc4150dcb246c8cdb0e83",
282
+ "sha256": "302e9f6deb96d4b40b8a220f7ae773e44b59abd3313c8dd62a27eb239f11f4c1",
195
283
  "hard": 1
196
284
  },
197
285
  "templates/_agents/scripts/wiki-search.mjs": {
@@ -211,8 +299,8 @@
211
299
  "hard": 1
212
300
  },
213
301
  "templates/_agents/workflow-enums.txt": {
214
- "sha256": "b28a83418133e24f3e4daee7f454c4f31ac98a943a94aa33008a944ae751d25a",
215
- "hard": 8
302
+ "sha256": "bf42380a5ad11d418717af1847a8d9ba8bfca5eafe320959603d4d76103410b2",
303
+ "hard": 10
216
304
  },
217
305
  "templates/_agents/workflow-modules.txt": {
218
306
  "sha256": "d03593598f6b0495ebc650019c474da0d6538da06c6f58ccc00bd5a9cdc760f1",
@@ -227,19 +315,19 @@
227
315
  "hard": 0
228
316
  },
229
317
  "templates/_githooks/pre-commit": {
230
- "sha256": "d65b6bd9adc59582e5209c1ddbdfe11a231d1312362c8f594e2579e7d3700e86",
231
- "hard": 4
318
+ "sha256": "4300376c2b68a6ce8c2cab664358159e9256857907a907cc66b9715d4c50b6da",
319
+ "hard": 6
232
320
  },
233
321
  "templates/_githooks/pre-merge-commit": {
234
- "sha256": "ab6d11707e78ac19261bc7d667056f7721466456d443cabf85ad7ba24dc797ac",
235
- "hard": 1
322
+ "sha256": "7b283e7779a53ee036098443afcc774ad5e3efa849734ac50de42c4cf8866a80",
323
+ "hard": 2
236
324
  },
237
325
  "templates/_githooks/pre-push": {
238
- "sha256": "c28d0c19204f0202dd270bbdb8e9b5d0362e56d67e2fbfbff33267ec7f592c9f",
326
+ "sha256": "308f2f30e071d0f8e39f085cbb67bc9a21fab94172da6fc0b05013df50336030",
239
327
  "hard": 2
240
328
  },
241
329
  "templates/_github/workflows/kit-ci.yml": {
242
- "sha256": "08c6e09992df9c1c3805ded11f01d33cea49ee64c4c5950ba3de15a8227e6464",
330
+ "sha256": "7cb738f9b1dda787e541e5aab104ef9a651fe18a420fdc55bd761d3c077529b0",
243
331
  "hard": 3
244
332
  }
245
333
  }
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ // workflow/INDEX.md 漂移(增量硬拦,2026-10-12,Shipyard.Material 参考实现回灌)。
3
+ // 检查 11 只在 check-loop --hygiene 里 WARN。关单提交不跑卫生段,索引会继续把已 closed/done 的文档列成在跑。
4
+ // 本脚本:暂存触及 workflow 四目录、归档或 INDEX.md 时,跑生成器 --check;不一致即拒提交。
5
+ // 未触及这些路径则跳过(引擎面提交不因陈旧索引被拦)。修复:node .agents/scripts/gen-workflow-index.mjs 后把 INDEX.md 一并暂存。
6
+ import { spawnSync } from 'node:child_process';
7
+ import path from 'node:path';
8
+ import process from 'node:process';
9
+ import { fileURLToPath, pathToFileURL } from 'node:url';
10
+
11
+ const INDEX_SRC = /^(?:workflow\/(?:intents|specs|plans|incidents|archive)\/.+\.md|workflow\/INDEX\.md)$/;
12
+
13
+ export function stagedTouchesIndex(files) {
14
+ return files.some((f) => INDEX_SRC.test(String(f).replace(/\\/g, '/')));
15
+ }
16
+
17
+ function main() {
18
+ const git = (args) => {
19
+ const r = spawnSync('git', args, { encoding: 'utf8' });
20
+ return { ok: !r.error && r.status === 0, out: (r.stdout || '').replace(/\r/g, '') };
21
+ };
22
+ const root = git(['rev-parse', '--show-toplevel']);
23
+ if (!root.ok || !root.out.trim()) {
24
+ console.error('索引漂移(增量): 无法定位仓库根,提交已阻止');
25
+ process.exit(1);
26
+ }
27
+ const top = root.out.trim();
28
+ process.chdir(top);
29
+ const touched = git(['-c', 'core.quotepath=off', 'diff', '--cached', '--name-only']);
30
+ if (!touched.ok) {
31
+ console.error('索引漂移(增量): 读暂存列表失败,提交已阻止');
32
+ process.exit(1);
33
+ }
34
+ const files = touched.out.split('\n').filter(Boolean);
35
+ if (!stagedTouchesIndex(files)) process.exit(0);
36
+
37
+ const gen = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'scripts', 'gen-workflow-index.mjs');
38
+ const r = spawnSync(process.execPath, [gen, '--check'], { cwd: top, stdio: 'inherit' });
39
+ if (r.status !== 0) {
40
+ console.error('索引漂移(增量)— BLOCK:');
41
+ console.error(' 先跑 node .agents/scripts/gen-workflow-index.mjs,把 workflow/INDEX.md 一并暂存,再提交');
42
+ process.exit(r.status === null ? 1 : r.status);
43
+ }
44
+ process.exit(0);
45
+ }
46
+
47
+ const isMain = process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href;
48
+ if (isMain) main();
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ // 闭环配对(增量版):本次暂存的 intents/ incidents/ 入口文档必须已有同名 plan(L2/L3 另须同名 spec)
3
+ // 目的:把 check-loop「配对断裂」hard-block 的发现时机从 pre-push 提前到 commit
4
+ // (papercut 2026-09-15:maintain.md 只写「incident≡intent 免另立 intent」,未把配 plan 写成显式步骤,
5
+ // 按文档字面执行三次 commit 全绿、push 才爆红,只能后补;
6
+ // 2026-09-27 audit-gate-hardening 补齐 spec 档——此前只查 plan,L2/L3 缺 spec 仍要拖到 push 才爆红)
7
+ // 口径与 check-loop 检查 1 同款分档:入口文档(intents/ incidents/ 直下 .md)↔ workflow/plans/ 同名,
8
+ // L2/L3 级别另须 workflow/specs/ 同名;同 commit 携带 plan/spec 合法(检查的是工作区文件存在,staged 新建同样命中)。
9
+ // 自 sh 版移植 node(2026-10-08 门禁去 sh 化第二批;2026-10-13 自 Shipyard.Material 参考实现回灌)——语义逐条对齐。
10
+ // 已知边界(沿 sh 版):legacy 豁免与级别读取均基于工作区文件而非暂存 blob——add 后又改工作区时
11
+ // 可能误豁免/误拦(逐文件取 blob 的 fork 成本大于收益,接受)。
12
+ // git 调用带 `-c core.quotepath=off`:quotepath 默认 true 时非 ASCII 路径被引号转义,
13
+ // workflow/ 前缀匹配失配 → 门禁静默跳过(2026-09-27 gate-coverage 教训)。
14
+ import { spawnSync } from 'node:child_process';
15
+ import fs from 'node:fs';
16
+ import path from 'node:path';
17
+ import process from 'node:process';
18
+
19
+ const git = (args) => {
20
+ const r = spawnSync('git', args, { encoding: 'utf8' });
21
+ return { ok: !r.error && r.status === 0, out: (r.stdout || '').trim() };
22
+ };
23
+ const root = git(['rev-parse', '--show-toplevel']);
24
+ if (!root.ok) process.exit(1);
25
+ process.chdir(root.out);
26
+
27
+ const staged = git(['-c', 'core.quotepath=off', 'diff', '--cached', '--name-only', '--diff-filter=ACMR']);
28
+ if (!staged.ok) process.exit(1);
29
+ const entries = staged.out.split('\n').filter((f) => /^workflow\/(intents|incidents)\/[^/]+\.md$/.test(f) && !f.endsWith('_TEMPLATE.md'));
30
+
31
+ let fail = 0;
32
+ const block = (lines) => { console.log('闭环配对(增量)— BLOCK:'); for (const l of lines) console.log(' ' + l); fail = 1; };
33
+
34
+ for (const f of entries) {
35
+ // 闭环引擎启用前的回填件带「流程: legacy」豁免配对检查(与 check-loop 同口径)
36
+ let legacy = false, lvl = '';
37
+ try {
38
+ for (const line of fs.readFileSync(f, 'utf8').split(/\r?\n/)) {
39
+ if (line.startsWith('流程: legacy')) legacy = true;
40
+ const m = /^级别:\s*(.*)$/.exec(line);
41
+ if (m && lvl === '') lvl = m[1].trim();
42
+ if (legacy && lvl !== '') break;
43
+ }
44
+ } catch { /* 读不到按未豁免处理(沿 sh 版 grep 失败即不豁免的语义) */ }
45
+ if (legacy) continue;
46
+ const base = path.basename(f, '.md');
47
+ if (!fs.existsSync(path.join('workflow', 'plans', `${base}.md`))) {
48
+ block([
49
+ `入口缺同名 plan: ${f}(应在 workflow/plans/${base}.md)`,
50
+ 'L1 用 fill-plan.mjs --level L1(入口/改动方案/约束与风险/验证计划/验收标准),不另立 intent',
51
+ ]);
52
+ }
53
+ if (lvl === 'L2' || lvl === 'L3') {
54
+ if (!fs.existsSync(path.join('workflow', 'specs', `${base}.md`))) {
55
+ block([
56
+ `入口缺同名 spec: ${f}(级别 ${lvl} 须三件套,应在 workflow/specs/${base}.md)`,
57
+ '与 pre-push check-loop 检查 1 同口径——先起草 spec 走 design.md,再提交',
58
+ ]);
59
+ }
60
+ }
61
+ }
62
+
63
+ if (fail !== 0) {
64
+ console.error('pre-commit: 入口文档配对不全(plan / L2-L3 spec),提交已阻止(与 pre-push check-loop 同口径,发现时机提前到 commit)');
65
+ }
66
+ process.exit(fail);
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ // wiki 台账一致性(增量版):本次暂存触及 wiki/ 时跑 verify 三方校验(磁盘 ↔ INDEX ↔ 看板 DATA)
3
+ // 目的:给「登记动作」装触发点——verify 此前无任何钩子调用,只能靠「触及 wiki 时手跑」的文字纪律
4
+ // (incident 2026-09-16-wiki-drift-and-verifier-gaps 认定的根因);本脚本把发现时机提前到 commit。
5
+ // 口径与 .agents/scripts/verify-wiki-consistency.mjs 一致:活层新增/删除/移动未登记、数据维护批次目录未入台账即拦。
6
+ // 自 sh 版移植 node(2026-10-08 门禁去 sh 化第二批;2026-10-13 自 Shipyard.Material 参考实现回灌)——语义逐条对齐。
7
+ // 注意 git 调用带 `-c core.quotepath=off`:quotepath 默认 true 时中文路径被转义加引号,^wiki/ 前缀
8
+ // 匹配失配 → 门禁静默跳过(2026-09-27 gate-coverage 教训)。
9
+ import { spawnSync } from 'node:child_process';
10
+ import path from 'node:path';
11
+ import process from 'node:process';
12
+
13
+ const git = (args) => {
14
+ const r = spawnSync('git', args, { encoding: 'utf8' });
15
+ return { ok: !r.error && r.status === 0, out: (r.stdout || '').trim() };
16
+ };
17
+ const root = git(['rev-parse', '--show-toplevel']);
18
+ if (!root.ok) process.exit(1);
19
+ process.chdir(root.out);
20
+
21
+ const touched = git(['-c', 'core.quotepath=off', 'diff', '--cached', '--name-only']);
22
+ if (!touched.ok || !touched.out.split('\n').some((f) => f.startsWith('wiki/'))) process.exit(0);
23
+
24
+ const r = spawnSync(process.execPath, [path.join('.agents', 'scripts', 'verify-wiki-consistency.mjs')], { stdio: 'inherit' });
25
+ if (r.status !== 0) {
26
+ console.log('wiki 台账(增量)— BLOCK:');
27
+ console.log(' 先跑 node .agents/scripts/gen-wiki-board.mjs 补 INDEX/看板(或补 wiki/数据维护/README.md 登记行),再原路重试提交');
28
+ process.exit(1);
29
+ }
30
+ process.exit(0);
@@ -4,8 +4,11 @@
4
4
  # 正则语法错误行 → 门禁 fail-closed 阻断(防静默空洞,修配置后重试)。
5
5
  # 语义:命中任一模式 = 本次改动触及「一处定义、多处消费」的契约 / 规则面(L2 触达面,
6
6
  # 判据单源见 .agents/scripts/level-criteria.mjs 的 L2_SURFACES)。此时须有活跃(draft/approved / open/fixed)
7
- # L2/L3 入口罩着;活跃入口全为 L0/L1 会被 pre-commit「触达面判低」拦截(三选修法见门禁消息)。
7
+ # L2/L3 入口罩着;活跃入口全为 L1 会被 pre-commit「触达面判低」拦截(三选修法见门禁消息)。
8
8
  # 无任何活跃入口时仅 advisory——docs / bootstrap 豁免类改动(new-task.md §intent 豁免)不受阻。
9
+ # 漏登面审计:node .agents/scripts/lane-surface-audit.mjs(advisory,恒 exit 0)——近窗口(默认 30 天)
10
+ # L2/L3 任务反复触及(≥3 个不同入口文档)却无文件被本清单命中的目录 = 候选漏登面,供人工评估补登;
11
+ # 月度手跑,改共享契约频繁期可随时跑(候选 ≠ 必登——高频触及 ≠ 契约面,机器不猜语义)。
9
12
  # 本仓默认面(引擎 / 契约面,行为承载目录——commands/roles 纯提示文本属 docs 级不列入;按项目自行改):
10
13
  ^templates/
11
14
  ^\.agents/(scripts|hooks)/
@@ -6,7 +6,7 @@
6
6
  # 本文件是**意图面**的档位提示(改这些面就该按更高档走)。两者不同档,各司其职。
7
7
  #
8
8
  # 格式:每行一条 `<档位> <ERE>`,ERE 为 grep -E 兼容正则,匹配仓库相对路径(/ 分隔)。
9
- # 档位**只收 L2 / L3**:本清单登记的是「一碰就至少是中/高风险面」的下限。L0/L1 不构成门槛,
9
+ # 档位**只收 L2 / L3**:本清单登记的是「一碰就至少是中/高风险面」的下限。L1 不构成门槛(L0 已退役),
10
10
  # 登记了只会让提交面判低门(L2 触达面门)对无关改动出手——那正是要避免的噪声。
11
11
  # **ERE 与注释必须分两行**:写 `L3 ^a\.sql$ # 迁移 SQL` 会把 `# 迁移 SQL` 编进正则,
12
12
  # 若含 $ 锚点该条就永不命中,且不报任何错(路径下限与提交面兜底同时静默失效)。
@@ -0,0 +1,112 @@
1
+ # papercut-debt 控制回路 — 设计(2026-10-07 拍板;B10a 自 Shipyard.Material 回灌)
2
+
3
+ > 本文件是回路的**设计单一真相源**。传感器 / 控制器 / 执行器技能 / 记忆文件均按此实现,改设计先改本文件。
4
+ > 范围:把 `workflow/papercuts.md` 的未升级存量债驱动到 0。执行器为**对话内手动触发**(kit 不为回路接线 CI/定时)。
5
+
6
+ ## 1. 设定点(Set point)
7
+
8
+ **`workflow/papercuts.md` 中未消债条目数 → 0。**
9
+
10
+ - **判定口径(单源,本文件)**:
11
+ - **已消债(settled)** = 该行含 `✅`(真修完)**或** 含 `⏸ 暂缓(日期):理由`(人读过、判失效)。
12
+ - **未消债(debt)** = 其余,即 `debt = 总数 − settled`。
13
+ - `⏸ 暂缓` **无理由者仍计债** —— 堵"标个符号清零"的路,迫使人真读一遍。
14
+ - **环境约束类(`[env]` 前缀)**:「位置」列以 `[env]` 开头(外层可带反引号包裹,传感器兼容)的行**不进债池**(`scan()` 不返回,控制器 import 债池数组天然不选),单列 `envPending`(仅未 settled 的)。清账两路径:环境前提复测消失 → `⏸ 暂缓(日期):前提已消失`;定性实为代码缺陷 → 去前缀转正回债池。理由:环境自愈不该由回路轮询发现(源仓首轮实证:pypi 恢复后自愈的环境条目,却占 debt 名额等人工定性一轮——留痕在包源仓 git 历史与 CHANGELOG)。
15
+ - 两类分开计数(`resolved` / `deferredReasoned`),避免"暂缓"冒充"修完"。
16
+ - 终态:全部条目 settled。**"暂缓"是合法终态,但必须有人写理由。**
17
+ - 基线:装户首次跑传感器时的 `debt` 读数即基线,随后每轮 `debt` 恰好 -1。装户侧不预填数字。
18
+
19
+ > **首轮修正(设计教训,单源保留)**:初版口径只有 `✅` 判债、`⏸` 不消债。后果是执行器走"判失效"分支(写 `⏸`)后 `debt` 不减,完成判据"debt 恰好 -1"永远达不到,且控制器下一轮仍选中同一条 → **回路空转**。现口径按上表,`settled` 由传感器单源判定、控制器 import 复用(两处各判一次必然漂移,见 §3 末)。
20
+
21
+ 为什么选它(三条依据):
22
+
23
+ 1. **计数客观**:`papercuts.md` 是人写的自由文本表格,但"是否已升级"是二值事实,解析成本低、复跑稳定。
24
+ 2. **改动面天然是文档**:每条 papercut 的"拟修"列指向的多是 `.agents/commands/`、`.agents/skills/`、`.githooks/` 下的提示文本与脚本 —— 与回路执行器边界(文档面)**天然对齐**,不需人为收窄。
25
+ 3. **不撞人工门**:`papercuts.md` 是普通台账,**不走 `confirm-doc` 状态机**(不同于 intent/spec/plan),所以回路可以无人值守跑而不会卡在人工确认点。
26
+
27
+ 不选的候选与理由属**装户实测数据**(源仓实例:回归清单未勾项、常驻面体积瘦身、check-loop 存量 warning——留痕在包源仓 git 历史与 CHANGELOG)。装户立回路时按同原则自评:单轮以小时计的、改 AI 行为指令的、性价比最低的候选不进本回路。
28
+
29
+ ## 2. 传感器(Sensor)
30
+
31
+ **脚本**:`.agents/scripts/papercut-debt-sensor.mjs`
32
+ **输出**:`--json` 时给结构化 JSON;默认给人读的中文摘要。退出码恒 0(**测量失败不该阻断回路**,但会显式打印 ERROR 行)。
33
+
34
+ 测量口径:
35
+
36
+ | 字段 | 含义 |
37
+ |---|---|
38
+ | `unresolved` | 未升级条目数组,每项含 `line` / `date` / `location` / `symptom` / `proposedFix` / `hits`(scope 由控制器 §3 判定,不在此列) |
39
+ | `resolved` | 已升级条目数 |
40
+ | `total` | 台账数据行总数(排除表头与分隔行) |
41
+ | `debt` | `unresolved.length` —— 设定点的当前误差 |
42
+
43
+ 关键设计约束:
44
+
45
+ - **零子进程**。不 spawn git / node。理由(源仓实测,留痕在包源仓 git 历史与 CHANGELOG):曾有托管 Node 环境 `spawnSync` 对**任意**可执行文件(含 node 自身)返回 `EBUSY`,任何依赖 git 历史的传感器在该环境不可用——已有 `check-loop.mjs` 就是这么崩的。零子进程设计保留:传感器不依赖子进程比依赖更稳,且免受环境回退影响。
46
+ - **CRLF 容忍**。台账检出为 CRLF(全局 `core.autocrlf=true`),按 `split(/\r?\n/)` 切行,**禁止依赖行尾格式**。
47
+ - **管道符安全**。单元格内可能含 `|`(代码片段),按"切分后多于 6 段则把中间段并回症状列"处理,取前 3 列 + 末列。
48
+ - **失效路径不阻塞**。对每条的"位置"列抽出形如 `.agents/…` / `wiki/…` 的路径并检查存在性;不存在只标 `stale: true`,不排除该条 —— 台账记的是历史事实,路径后来被重命名/删除是常态,不等于债已消。
49
+ - **分片感知**(kit 侧随 ledger-shards 落地):读侧走 `readLedgerText(root,'papercuts')`(主台账 ∪ `workflow/papercuts.d/*.md`),无分片时等价原读法——传感器零额外逻辑,口径不变。
50
+
51
+ ## 3. 控制器(Controller)
52
+
53
+ **脚本**:`.agents/scripts/papercut-debt-controller.mjs`
54
+ **输入**:`papercut-debt-sensor.mjs --json` 的输出(或自己调传感器)。
55
+ **输出**:本轮唯一目标(top-1),markdown 片段,直接拼进执行器提示词。
56
+
57
+ 排序键(**确定性,无随机、无 LLM 判断**):
58
+
59
+ 1. **命中次数降序** —— 台账文件头自己的规则:"同一文件命中第 2 次或用户点名时,升级为 docs 修复 commit"。`第 N 次命中` 从症状/拟修文本中正则抽取。
60
+ 2. **日期降序** —— 同命中次数下,日期新的优先(近期痛点更可能仍成立)。
61
+ 3. **原行序升序** —— 完全平手时按台账原始顺序,保证结果可复现。
62
+
63
+ **Scope gate(出选前过滤)**:`拟修` 明确指向 `backend/` `frontend/` `tests/` `wiki/` `sqlcmd` `db_tool`,或文本含 `数据库` / `DDL` / `DROP` 的条目,本轮跳过并列为 `skipped-out-of-scope`。记入输出,由用户决定是否授权。执行器只改文档面。指向业务代码或连库的条目超出授权。
64
+
65
+ **单轮只取 1 条。** L2/L3 要求独立复核,控制器不得一次给出 3 条。
66
+
67
+ **口径复用(硬约束)**:控制器**不得复制** `✅` / `⏸` / `hits` / `stale` 的任何判定正则,一律 `import { scan } from './papercut-debt-sensor.mjs'`。控制器只负责排序与 scope gate。理由(源仓首轮实证,留痕在包源仓 git 历史与 CHANGELOG):两处各判一次必然漂移——初版传感器按 `✅` 判债、控制器也按 `✅` 选目标,导致已 `⏸` 的条目被反复选中。
68
+
69
+ ## 4. 执行器(Actuator)
70
+
71
+ **技能**:`.agents/skills/papercut-fix/SKILL.md`(装副本随 `.agents/skills/` 分发)。
72
+ **触发**:你说"跑一轮 papercut 回路"。
73
+ **验证门**(改动后必跑,全部零 spawn 或纯本地):
74
+
75
+ ```bash
76
+ node .agents/scripts/check-loop.mjs # 闭环骨架(实证留痕在包源仓 git 历史与 CHANGELOG)
77
+ node .agents/scripts/papercut-debt-sensor.mjs --json # debt 应恰好 -1
78
+ ```
79
+
80
+ > **注意**:`verify.mjs` 默认不在本回路跑 —— 回路只动台账与技能文件(文档面),`verify.mjs` 含构建/测试(源码面,按装户技术栈),与 papercut 回路边界无关,回路收尾以传感器计数核验为准。需要关单凭证时直跑 `node .agents/scripts/verify.mjs`(全绿自动落 verifications.jsonl)。
81
+
82
+ **金样(golden patterns)**,已固化进技能:
83
+
84
+ - 台账写入**一律用 Edit 工具**(源仓实证 papercut:`node -e` 批量 replace 遇 CRLF 静默无操作、假落账——留痕在包源仓 git 历史与 CHANGELOG)。
85
+ - 写后**必 grep 回读验证**再报成功。
86
+ - 标 ✅ 时**追加**升级记录(日期 + commit),不删原"拟修"文本 —— 原文本是复发时的对照物。
87
+ - 改动 `.agents/commands/` 后必看 `.agents/rule-budgets.txt` 的体积上限(常驻面只增不减,一进一出;机器门 `node .agents/scripts/rule-budget.mjs --staged`)。
88
+
89
+ ## 5. 扰动与阻尼器(Disturbances / Dampener)
90
+
91
+ **扰动源**(通用形态):
92
+
93
+ - 用户并发提交:回路运行期间,用户可能修改同一文件。
94
+ - 生成物漂移 —— `workflow/INDEX.md`、`workflow/metrics.md`、`gen-wiki-board` 产物会随任何状态变更而重生成。
95
+ - 工具链升级 —— kit bump 会重写 `.agents/` 装副本,台账里的"拟修"可能已失效。
96
+
97
+ **阻尼器(已存在,不另建)**:`.githooks/pre-commit` 门禁(常驻面体积预算 `rule-budget --staged` 硬拦等)+ `pre-push` 的 `check-loop` hard-block。**新条目带 `⏸ 暂缓` 而无理由**、或同一行被并发改写压行,都会在这两道门上现形。回路**不新增任何门禁** —— 现有门禁已足够挡住"回路把台账改坏"。
98
+
99
+ ## 6. 人在环上(Human on the loop)
100
+
101
+ - **记忆文件**:装户自持(owned 面参考 `.agents/notes/`)——常驻反馈(永久范围排除、已知失效区、reviewer 意见)。每轮在控制器之后、提示词之前注入。**只写耐久规则,不写单轮日志**。
102
+ - **人工放行**:回路不自动 commit、不 push。产出 diff 后停止,等待用户明确放行。
103
+ - **`/iterate` 不实现**。追加范围或暂缓须由用户在对话中逐条给出,例如「修第 3 条」或「这条暂缓,理由 X」。
104
+
105
+ ## 7. 流控(Flow control)
106
+
107
+ **在途判据**:工作区存在本回路产生的未提交 diff。手动触发时同一工作区只跑一轮,不另绑远端评审流。`--dry-run` 只输出目标清单,不改文件。
108
+
109
+ ## 8. 历史阻塞与豁免(源仓实证,单源保留结论)
110
+
111
+ 1. **回路脚本落 `.agents/scripts/` 是否命中 L2 触达面**:不命中——`check-lane-surface.mjs` 在无活跃 L2/L3 入口时只出 advisory、exit 0 放行(**规则**:无活跃入口即放行)。**结论:不必为回路另立 intent**;若日后 `.agents/scripts/` 确有 L2 语义改动被拦,再按 `new-task.md` 立入口。实测过程留痕在包源仓 git 历史与 CHANGELOG。
112
+ 2. **依赖 git 历史的传感器在本机必崩**(EBUSY):以零子进程设计规避(§2),不做环境假设。源仓后来环境升级后该崩溃消失,但零子进程约束不回退——传感器不依赖子进程比依赖更稳。