@event4u/agent-config 14.6.0 → 14.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +255 -145
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/analyze/inbox.md +264 -10
  5. package/dist/agent-src/commands/analyze.md +1 -1
  6. package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
  7. package/dist/agent-src/commands/evals/roadmap.json +17 -1
  8. package/dist/agent-src/commands/pr/create.md +14 -2
  9. package/dist/agent-src/commands/pr/merge.md +379 -0
  10. package/dist/agent-src/commands/roadmap/process-full.md +272 -32
  11. package/dist/agent-src/commands/roadmap.md +1 -1
  12. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
  13. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
  14. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +95 -2
  15. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +289 -106
  16. package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
  17. package/dist/agent-src/rules/context-hygiene.md +2 -0
  18. package/dist/agent-src/rules/decision-revisit-gate.md +67 -32
  19. package/dist/agent-src/rules/fix-what-you-see.md +108 -0
  20. package/dist/agent-src/rules/no-roadmap-references.md +0 -5
  21. package/dist/agent-src/rules/recurring-criticism.md +110 -0
  22. package/dist/agent-src/rules/roadmap-progress-sync.md +20 -1
  23. package/dist/agent-src/rules/rule-type-governance.md +0 -2
  24. package/dist/agent-src/rules/self-repair-loop.md +17 -0
  25. package/dist/agent-src/rules/skill-quality.md +0 -2
  26. package/dist/agent-src/rules/source-confidentiality.md +37 -7
  27. package/dist/agent-src/scripts/archival_sweep.ts +117 -0
  28. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
  29. package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
  30. package/dist/agent-src/scripts/gate_budget.ts +282 -0
  31. package/dist/agent-src/scripts/gate_execute.ts +72 -31
  32. package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
  33. package/dist/agent-src/scripts/update_roadmap_progress.ts +296 -53
  34. package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
  35. package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
  36. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
  37. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
  38. package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
  39. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
  40. package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
  41. package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
  42. package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
  43. package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
  44. package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
  45. package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
  46. package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
  47. package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
  48. package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
  49. package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
  50. package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
  51. package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
  52. package/dist/agent-src/skills/security/SKILL.md +8 -0
  53. package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
  54. package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
  55. package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
  56. package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
  57. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
  58. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  59. package/dist/agent-src/templates/roadmaps.md +65 -4
  60. package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  61. package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  62. package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  63. package/dist/cli/registry.js +2 -1
  64. package/dist/cli/registry.js.map +1 -1
  65. package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
  66. package/dist/cli-delegate/{chunk-P6LQDIWK.js → chunk-7PRE6ZV2.js} +338 -0
  67. package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
  68. package/dist/cli-delegate/chunk-E4XIZDIB.js +402 -0
  69. package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-EEJUMCDZ.js} +16 -16
  70. package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
  71. package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-H4VIVD4C.js} +385 -284
  72. package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
  73. package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-LPPWO5CE.js} +12 -8
  74. package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
  75. package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-N7CDDGI3.js} +4 -23
  76. package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-PMEKGDED.js} +74 -167
  77. package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
  78. package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
  79. package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
  80. package/dist/cli-delegate/cmd_conformance.js +466 -716
  81. package/dist/cli-delegate/cmd_converge.js +3 -3
  82. package/dist/cli-delegate/cmd_doctor.js +10 -10
  83. package/dist/cli-delegate/cmd_explain.js +1 -1
  84. package/dist/cli-delegate/cmd_export.js +10 -9
  85. package/dist/cli-delegate/cmd_handoff.js +10 -9
  86. package/dist/cli-delegate/cmd_memory_get.js +2 -1
  87. package/dist/cli-delegate/cmd_migrate.js +2 -2
  88. package/dist/cli-delegate/cmd_packs_active.js +1 -1
  89. package/dist/cli-delegate/cmd_preflight.js +5 -5
  90. package/dist/cli-delegate/cmd_prune.js +11 -10
  91. package/dist/cli-delegate/cmd_route_audit.js +6 -5
  92. package/dist/cli-delegate/cmd_route_explain.js +3 -3
  93. package/dist/cli-delegate/cmd_session_recycle.js +840 -30
  94. package/dist/cli-delegate/cmd_settings_get.js +3 -3
  95. package/dist/cli-delegate/cmd_settings_migrate.js +10 -9
  96. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  97. package/dist/cli-delegate/cmd_sync.js +11 -10
  98. package/dist/cli-delegate/cmd_uninstall.js +13 -11
  99. package/dist/cli-delegate/cmd_update.js +4 -4
  100. package/dist/cli-delegate/cmd_upgrade.js +4 -4
  101. package/dist/cli-delegate/cmd_validate.js +11 -10
  102. package/dist/cli-delegate/cmd_versions.js +3 -3
  103. package/dist/discovery/deprecation-report.md +1 -1
  104. package/dist/discovery/discovery-manifest.json +111 -37
  105. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  106. package/dist/discovery/discovery-manifest.summary.md +5 -5
  107. package/dist/discovery/dormancy-report.md +1 -1
  108. package/dist/discovery/orphan-report.md +1 -1
  109. package/dist/discovery/packs.json +15 -12
  110. package/dist/discovery/trust-report.md +3 -3
  111. package/dist/discovery/workspaces.json +11 -8
  112. package/dist/hooks/dispatch.js +3165 -2192
  113. package/dist/install/claudePathsPlan.js +187 -0
  114. package/dist/install/claudePathsPlan.js.map +1 -0
  115. package/dist/install/globalRuleLayers.js +169 -0
  116. package/dist/install/globalRuleLayers.js.map +1 -0
  117. package/dist/install/hostLayerFingerprint.js +136 -0
  118. package/dist/install/hostLayerFingerprint.js.map +1 -0
  119. package/dist/install/install.mjs +553 -425
  120. package/dist/install/partitionEligibility.js +432 -0
  121. package/dist/install/partitionEligibility.js.map +1 -0
  122. package/dist/install/ruleLayerPartition.js +157 -0
  123. package/dist/install/ruleLayerPartition.js.map +1 -0
  124. package/dist/mcp/registry-manifest.json +3 -3
  125. package/dist/mcp/server.json +2 -2
  126. package/dist/mcp/server.mjs +1863 -1234
  127. package/dist/router.json +1 -1
  128. package/dist/scripts/_lib/agent_src.js +41 -0
  129. package/dist/scripts/_lib/agent_src.js.map +1 -1
  130. package/dist/scripts/_lib/install_layout.js +83 -0
  131. package/dist/scripts/_lib/install_layout.js.map +1 -0
  132. package/dist/scripts/_lib/installed_lock.js +444 -0
  133. package/dist/scripts/_lib/installed_lock.js.map +1 -0
  134. package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
  135. package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
  136. package/dist/scripts/condense.js +63 -251
  137. package/dist/scripts/condense.js.map +1 -1
  138. package/dist/server/schemas/settings.js +4 -0
  139. package/dist/server/schemas/settings.js.map +1 -1
  140. package/docs/contracts/settings-classes.md +12 -6
  141. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
  142. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
  143. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
  144. package/docs/guidelines/agent-infra/false-green.md +47 -1
  145. package/docs/guidelines/agent-infra/memory-access.md +17 -0
  146. package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  147. package/package.json +1 -1
  148. package/src/agent-src/scripts/archival_sweep.ts +117 -0
  149. package/src/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
  150. package/src/agent-src/scripts/dashboard_mode.ts +212 -0
  151. package/src/agent-src/scripts/gate_budget.ts +282 -0
  152. package/src/agent-src/scripts/gate_execute.ts +72 -31
  153. package/src/agent-src/scripts/roadmap_gates.ts +74 -3
  154. package/src/agent-src/scripts/update_roadmap_progress.ts +296 -53
  155. package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  156. package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  157. package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  158. package/src/config/agent-settings.template.yml +27 -2
  159. package/src/config/ci-local-parity.yml +39 -0
  160. package/src/config/estate-count-budget.json +612 -3
  161. package/src/config/evaluator-budgets.json +3 -3
  162. package/src/config/gate-coverage.yml +220 -12
  163. package/src/config/gate-violation-baselines.json +73 -63
  164. package/src/config/gitignore-block.txt +15 -2
  165. package/src/config/hook-latency-budget.json +5 -0
  166. package/src/config/rule-activation-census.json +14 -6
  167. package/src/config/rule-stub-ceilings.json +34 -7
  168. package/src/install/claudePathsPlan.ts +196 -0
  169. package/src/install/globalRuleLayers.ts +197 -0
  170. package/src/install/hostLayerFingerprint.ts +145 -0
  171. package/src/install/partitionEligibility.ts +502 -0
  172. package/src/install/ruleLayerPartition.ts +212 -0
  173. package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
  174. package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
  175. package/src/scripts/_dispatch.bash +17 -1
  176. package/src/scripts/_lib/ac_heading.ts +30 -0
  177. package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
  178. package/src/scripts/_lib/adr_frontmatter.ts +459 -0
  179. package/src/scripts/_lib/agent_src.ts +42 -0
  180. package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
  181. package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
  182. package/src/scripts/_lib/envelope_grounding.ts +49 -9
  183. package/src/scripts/_lib/installed_lock.ts +50 -5
  184. package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
  185. package/src/scripts/_lib/md_section.ts +129 -0
  186. package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
  187. package/src/scripts/_lib/scope_guard.sh +26 -3
  188. package/src/scripts/_lib/self_repair.ts +19 -0
  189. package/src/scripts/_lib/self_repair_class_b.ts +171 -0
  190. package/src/scripts/adr/evidence_census.ts +899 -0
  191. package/src/scripts/adr/regenerate_index.ts +12 -32
  192. package/src/scripts/adr_cite_check.ts +540 -39
  193. package/src/scripts/ai_council/cli_help.ts +55 -0
  194. package/src/scripts/audit_adr_coverage.ts +103 -17
  195. package/src/scripts/before_complete_hook.ts +153 -28
  196. package/src/scripts/bench_ab_v2_complexity.ts +27 -7
  197. package/src/scripts/bench_hook_latency.ts +204 -0
  198. package/src/scripts/build_archive_index.ts +34 -0
  199. package/src/scripts/check_adr_frontmatter.ts +574 -39
  200. package/src/scripts/check_hook_bundle_content.ts +219 -0
  201. package/src/scripts/check_new_adr_evidence.ts +529 -0
  202. package/src/scripts/check_references.ts +78 -0
  203. package/src/scripts/check_release_published.ts +32 -11
  204. package/src/scripts/check_rule_layer_partition.ts +531 -0
  205. package/src/scripts/check_single_delivery.ts +194 -17
  206. package/src/scripts/check_standing_rule_delivery.ts +8 -2
  207. package/src/scripts/ci_settle.ts +170 -0
  208. package/src/scripts/condense.ts +79 -259
  209. package/src/scripts/council_cli.ts +3 -3
  210. package/src/scripts/dispatch_r2_reviewer.ts +6 -14
  211. package/src/scripts/external_sources_denylist.json +4 -1
  212. package/src/scripts/hook_manifest.json +1 -1
  213. package/src/scripts/hook_manifest.yaml +77 -14
  214. package/src/scripts/hooks/block_no_verify.ts +61 -10
  215. package/src/scripts/hooks/block_unauthorized_git.ts +21 -1
  216. package/src/scripts/hooks/concern_registry.ts +4 -0
  217. package/src/scripts/hooks/dispatch_hook.ts +154 -187
  218. package/src/scripts/hooks/dispatch_issues.ts +38 -19
  219. package/src/scripts/hooks/fallback_yaml.ts +66 -0
  220. package/src/scripts/hooks/host_semantics.ts +21 -0
  221. package/src/scripts/hooks/injection_budget.ts +13 -3
  222. package/src/scripts/hooks/py_json_dumps.ts +103 -0
  223. package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
  224. package/src/scripts/hooks/run_continuation_hook.ts +8 -5
  225. package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
  226. package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
  227. package/src/scripts/hooks/state_io.ts +870 -21
  228. package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
  229. package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
  230. package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
  231. package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
  232. package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
  233. package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
  234. package/src/scripts/injection_scan_hook.ts +137 -5
  235. package/src/scripts/install.ts +16 -11
  236. package/src/scripts/language_mirror_hook.ts +561 -25
  237. package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
  238. package/src/scripts/lint_hook_manifest.ts +49 -0
  239. package/src/scripts/lint_plan_risk_register.ts +4 -3
  240. package/src/scripts/lint_provenance_vocabulary.ts +472 -4
  241. package/src/scripts/lint_skill_router_head.ts +4 -4
  242. package/src/scripts/mcp_server/tools.ts +2 -2
  243. package/src/scripts/new_roadmap.ts +136 -0
  244. package/src/scripts/pack_mcp_content.ts +20 -5
  245. package/src/scripts/release.ts +37 -38
  246. package/src/scripts/report_layer_overlap.ts +6 -0
  247. package/src/scripts/routing_doctor.ts +5 -1
  248. package/src/scripts/self_repair_hook.ts +37 -5
  249. package/src/scripts/session_register_hook.ts +11 -0
  250. package/src/scripts/skill_usage_collect.ts +11 -1
  251. package/src/scripts/skill_usage_report.ts +278 -8
  252. package/src/scripts/sync_pr_branch.ts +170 -20
  253. package/src/server/schemas/settings.ts +8 -0
  254. package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
  255. package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
  256. package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
  257. package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
  258. package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-MMSGVZKV.js} +3 -3
@@ -55,8 +55,12 @@ Fires once per creation task, not once per edit.
55
55
  - At most two propose → reject cycles; then stop.
56
56
  - Commit only on approval.
57
57
  - Bypass is legitimate — *"just write it"* drops the protocol immediately.
58
+ - An artifact discovered **after** an accepted contract halts by default;
59
+ `late_artifacts: auto-research` is the only declared value that continues,
60
+ capped at three per run (mechanics guideline § Late artifacts).
58
61
 
59
- Body migrated to [`guideline:agent-infra/artifact-drafting-protocol-mechanics`](../docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md) (per P4 of `road-to-kernel-and-router.md`) — Phase A/B/C procedure detail + the roadmap-run batch-mode carve-out (Research-once-at-contract-time, batch scope, no `artifact_protocol: skip`).
62
+ Body migrated to [`guideline:agent-infra/artifact-drafting-protocol-mechanics`](../docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md) (per P4 of `road-to-kernel-and-router.md`) — Phase A/B/C procedure detail + the roadmap-run batch-mode carve-out (Research-once-at-contract-time, batch scope, no `artifact_protocol: skip`) + § Late artifacts (the `halt` default
63
+ and the five-step `auto-research` procedure).
60
64
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
61
65
 
62
66
  Extends (cross-link, don't restate): `ask-when-uncertain`,
@@ -93,6 +93,8 @@ one shape the loop test above systematically misses, in both of its clauses.
93
93
  available were wait, or stop and report, and 34 licensed neither more than 31
94
94
  did. **The discriminator is the decision, not the digits.**
95
95
 
96
+ For CI, do not hand-write the loop: `ci_settle <pr>` (mechanics below).
97
+
96
98
  So state it separately: pick **one** waiter for the condition and let it finish.
97
99
  Where the harness re-invokes on completion, waiting costs nothing and polling
98
100
  costs a turn per expiry — and every stacked waiter is a turn that arrives *after*
@@ -39,25 +39,21 @@ THE USER IS REACHED FOR THE RESERVED SET — AND ALWAYS FOR IT.
39
39
  NEVER CITE A LOCK YOU HAVE NOT EVALUATED THIS TURN.
40
40
  ```
41
41
 
42
- An agent that finds a genuinely beneficial change blocked by a recorded
43
- past decision — an honest-null eval verdict, a "don't relitigate"
44
- memory or context note, a token-frugality/budget canon line, or an ADR —
45
- does not quietly comply and drop the change. It surfaces the conflict and
46
- re-evaluates the lock — **in the council by default**, reaching the user only
47
- for the reserved set below. Progress means adaptation: locks encode what was
48
- true when they were written, not a ceiling on what the package may ever become.
42
+ An agent that finds a beneficial change blocked by a recorded decision — an
43
+ honest-null verdict, a "don't relitigate" note, a budget-canon line, or an ADR —
44
+ does not quietly comply and drop it. It surfaces the conflict and re-evaluates
45
+ the lock **in the council by default**, reaching the user only for the reserved
46
+ set below. Locks encode what was true when they were written, not a ceiling on
47
+ what the package may ever become.
49
48
 
50
49
  **The default venue is the council, and this is a correction, not a new
51
- policy.** [`ai-council`](../skills/ai-council/SKILL.md) has said since its own
52
- Iron Law that *"a design decision the agent cannot settle from the tree goes to
53
- the council first, not to the user first"*, and its class table already lists
54
- "reopening a recorded decision". This rule used to say "offers the user a path",
55
- which contradicted that and made every lock an owner interrupt. The measured
56
- cost of the contradiction: across 26 days of transcripts, the agent reported a
57
- lock and waited, and the owner had to void the decision retroactively before the
58
- work resumed — in the two clearest cases the lock report is timestamped **before**
59
- the override demand. The ordering was the defect; the permission was never
60
- missing.
50
+ policy.** [`ai-council`](../skills/ai-council/SKILL.md)'s Iron Law already sends
51
+ a decision the agent cannot settle from the tree to the council first, and its
52
+ class table lists "reopening a recorded decision". The old "offers the user a
53
+ path" wording made every lock an owner interrupt; measured across 26 days of
54
+ transcripts, the agent reported a lock and waited while the owner voided the
55
+ decision retroactively — twice with the lock report timestamped **before** the
56
+ override demand. The ordering was the defect; the permission was never missing.
61
57
 
62
58
  **Mechanism-match check comes FIRST**: a verdict settles the *mechanism it
63
59
  tested*, not every future proposal that resembles it — if the blocked change
@@ -81,20 +77,54 @@ distinction.
81
77
  4. **Route it** — council by default (below), user only for the reserved set.
82
78
  5. **Record** the outcome with scope and `revisit-if`.
83
79
 
84
- These five are the obligation and they are stated here rather than only behind
85
- a route, because the route was measurably unreachable: `decision-revisit-gate`
86
- lives in the always-on `meta` pack while `decision-review` ships
87
- `install.default: false` in the non-default `analysis-workbench` pack, so a
88
- pack-legal install received the obligation and not the procedure. `routes_to`
89
- now names two always-on skills; the backward-audit depth in
90
- [`decision-review`](../skills/decision-review/SKILL.md) stays optional, which is
91
- the correct status for depth.
80
+ The five are stated here, not only behind a route, because the route was
81
+ measurably unreachable: `decision-review` ships `install.default: false` in the
82
+ non-default `analysis-workbench` pack, so a pack-legal install received the
83
+ obligation and not the procedure. `routes_to` now names two always-on skills;
84
+ the backward-audit depth in
85
+ [`decision-review`](../skills/decision-review/SKILL.md) stays optional.
92
86
 
93
87
  Full catalog (honest nulls, don't-relitigate notes, budget-canon lines, ADRs,
94
88
  hard structural caps), the per-step detail, when-NOT-to-fire and the failure
95
89
  modes remain in [`skill:decision-review` § Decision-revisit gate — mechanics](../skills/decision-review/SKILL.md).
96
90
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
97
91
 
92
+ ## Reading a lock — the two descriptive axes
93
+
94
+ Step 2 reads, in order: **effective state** (status · amendments · successors) →
95
+ **provenance** → **evidence strength** → **discovery** → **current evidence**
96
+ (does the basis still resolve in a clone?) → **reversibility of the proposed
97
+ transition** → **reserved dimensions**. `adr_cite_check` prints six of them —
98
+ read 6 is the agent's, because reversibility belongs to the proposed transition
99
+ and no tool reading one record supplies it. What each field means, and what a
100
+ `[found]` basis ref does NOT claim, is in that script's module docstring. The
101
+ evidence-priced burden table stays in
102
+ [`adr-layout § The reopen record`](../docs/contracts/adr-layout.md).
103
+
104
+ ```
105
+ A GRADE IS A MEASUREMENT, NOT A PERMISSION — IT GRANTS NOTHING.
106
+ CITING AN E0 LOCK AS A HARD BLOCKER WITHOUT SURFACING ITS GRADE IS A VIOLATION.
107
+ NO GRADE LETS AN AGENT SUPERSEDE A RECORD, SKIP A COUNCIL, OR TAKE ANY ACTION
108
+ IT COULD NOT TAKE YESTERDAY. THE COUNCIL-FIRST VENUE STAYS, AT EVERY GRADE.
109
+ AN ADR'S HISTORICAL DECISION-MAKER DOES NOT DETERMINE ITS REOPEN VENUE.
110
+ A LOW-EVIDENCE RECORD MAY STATE A DECISION; IT DOES NOT ESTABLISH THAT ITS
111
+ ALTERNATIVES REMAIN INVALID.
112
+ ```
113
+
114
+ Venue comes from the proposed transition, the trust boundaries it touches and
115
+ the reserved dimensions below — never from who decided originally, and never
116
+ from a grade. A weak grade changes how much a reopen must **do**, never who may
117
+ do it: `authority_basis: owner_intent` is surfaced with its accumulated cost and
118
+ never overruled, and council agreement never raises `evidence.strength` —
119
+ sources and measurements do.
120
+
121
+ **No E0/E1 agent path is enabled here, and no reading of this rule enables
122
+ one.** Whether an independently validated grade may ever reduce the
123
+ *authorization* burden is an owner-reserved open question — the
124
+ `authority-coupling-decision` blocker — left unanswered because the party
125
+ assigning a grade would be the party gaining authority from it, and would be
126
+ self-classifying the transition as reversible-internal on top.
127
+
98
128
  ## Who decides — the owner-reserved set
99
129
 
100
130
  The discriminator, in one question: **does the proposed transition weaken an
@@ -121,24 +151,24 @@ forever. Availability is `agent-config council:status`, never a project file
121
151
  ([`council-availability`](council-availability.md)).
122
152
 
123
153
  Field on the ADR: `reopen_policy: directional | owner | unclassified`, absent →
124
- **`unclassified`**, which permits council investigation and reversible
125
- experiments and gates only execution of a reserved transition. Absent is
154
+ **`unclassified`** — council investigation and reversible experiments are
155
+ permitted; only execution of a reserved transition is gated. Absent is
126
156
  deliberately not `owner`: with 146 accepted ADRs that default would encode
127
- today's blockage into the new schema. Full contract, the reopen record, and the
157
+ today's blockage into the new schema. Full contract, the reopen record and the
128
158
  precedent-creates-no-authority clause: [`adr-layout § Reopen authority`](../docs/contracts/adr-layout.md).
129
159
 
130
160
  ## See also
131
161
 
162
+ - [`recurring-criticism`](recurring-criticism.md) — the **other entrance**: this
163
+ rule fires when a lock blocks a change, that one when the same criticism arrives
164
+ again. It reuses the five steps and the owner-reserved table above.
132
165
  - [`decision-review`](../skills/decision-review/SKILL.md) — the backward-audit
133
166
  procedure + the migrated gate mechanics.
134
167
  - [`ai-council`](../skills/ai-council/SKILL.md) — the re-evaluation mechanism;
135
168
  owns the convergence-summary scope + `revisit-if` contract.
136
169
  - [`decision-record`](../skills/decision-record/SKILL.md) — forward-flow decision
137
170
  locking; its **§ 4 Lock the choice + consequences** requires the `Revisit-if:`
138
- line that names the reopening condition up front. (This pointer used to cite an
139
- "escalation litmus" heading; `grep` over `src/` + `docs/` returns two hits and
140
- neither is in that file — the heading never existed, so the pointer led
141
- nowhere. Corrected to the section that carries the obligation.)
171
+ line that names the reopening condition up front.
142
172
  - [`token-budget-discipline`](token-budget-discipline.md) — the frugality-canon
143
173
  value-over-budget escalation this rule's budget-lock case defers to.
144
174
  - [`no-cheap-questions`](no-cheap-questions.md) — the question-quality floor a
@@ -161,3 +191,8 @@ plus the curated `dist/agent-src/scripts/` list and is deliberately out of this
161
191
  change. And `docs/decisions/` is projected into no agent-visible tree at all —
162
192
  the agent sees ADR *numbers* cited across rules and skills, almost never ADR
163
193
  *text*. Until that changes, "evaluate before citing" means opening the file.
194
+
195
+ `docs/contracts/` is unprojected on the same terms (`dist/agent-src/` carries no
196
+ `docs/`), so the burden table this rule points at is maintainer-reachable only.
197
+ That is why the reserved-set table above stays here rather than becoming a
198
+ pointer: a consumer install receives these lines and not the contract.
@@ -0,0 +1,108 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ alwaysApply: false
5
+ description: "Saw a red check or a real defect — fix it, whoever wrote it; if you cannot, ship a tracked follow-up roadmap in the same change. Ownership is never a disposition"
6
+ # Due when a defect is OBSERVED, not on a clock: a turn that sees nothing owes
7
+ # nothing; a turn that sees a red check owes a disposition.
8
+ obligation_frequency: "per-event"
9
+ routes_to:
10
+ - "guideline:agent-infra/active-remediation-mechanics"
11
+ triggers:
12
+ - keyword: "failing"
13
+ - keyword: "fails"
14
+ - keyword: "broken"
15
+ - keyword: "regression"
16
+ - phrase: "is red"
17
+ - phrase: "ci failed"
18
+ - phrase: "ci is"
19
+ - phrase: "not my"
20
+ - phrase: "nicht mein"
21
+ - phrase: "someone else's"
22
+ - phrase: "whose test"
23
+ workspaces: [engineering]
24
+ packs: [engineering-base]
25
+ enforced_by:
26
+ - "none"
27
+ ---
28
+
29
+ # Fix What You See
30
+
31
+ ## The Iron Law
32
+
33
+ ```
34
+ YOU SAW IT, YOU FIX IT — WHOEVER WROTE IT.
35
+ "NOT MY CODE" / "NOT MY TEST" / "ANOTHER SESSION OWNS THAT FILE" IS NOT A
36
+ DISPOSITION. CANNOT FIX IT NOW → A TRACKED FOLLOW-UP ROADMAP SHIPS IN THE
37
+ SAME CHANGE. A CHAT MENTION IS NOT ONE EITHER, NOR A "KNOWN-OPEN" LINE IN A
38
+ PR BODY. A RED CHECK IS NEVER HANDED BACK WITH ITS CAUSE NAMED AND UNFIXED.
39
+ ```
40
+
41
+ **Saw it** = a red check already in front of you (test, lint, type, CI), or a
42
+ defect you pass while working — in your diff, a neighbouring file, a file
43
+ another agent or a parallel session wrote. The author is irrelevant.
44
+
45
+ **Two dispositions, and only two:** fix it with its verification, or land a
46
+ roadmap under `agents/roadmaps/` in the SAME change naming the defect, its
47
+ evidence, and what closes it.
48
+
49
+ **Read the red before fixing it, with the narrowest tool.** A CI job:
50
+ `gh run view --job <id> --log-failed | grep -E '×|FAIL|Error'` — never the whole
51
+ log into context, and never `--watch`'s exit code, which is 0 even on a failure.
52
+ A local red: the test runner with a filter on the one failing name, `tsc
53
+ --noEmit` for a type error, the linter scoped to the changed files. **Reproduce
54
+ it before you believe your diagnosis** — an environment-dependent red reproduces
55
+ under the condition, not on your machine's defaults.
56
+
57
+ Match the probe to the surface, because a passing unit test is not evidence for
58
+ a broken surface: an HTTP red is proven with `curl` against the running
59
+ endpoint, a UI red with a Playwright spec, a runtime red with the debugger
60
+ (`xdebug`, breakpoints) rather than by reading the diff again.
61
+
62
+ **Prove the fix with the same tool that showed the red**, in the same change.
63
+ For a guard or a concurrency fix, prove SENSITIVITY too: neutralise the mechanism,
64
+ watch the test fail, restore it. A test never seen red has unknown sensitivity.
65
+
66
+ ## Bounds
67
+
68
+ Removes *ownership* as an excuse, not the diff limit:
69
+ [`minimal-safe-diff`](minimal-safe-diff.md) still caps the change — too large
70
+ IS the roadmap case. A fix crossing
71
+ [`non-destructive-by-default`](non-destructive-by-default.md) still stops and
72
+ asks; the ask becomes the work, not the exit.
73
+
74
+ **Does NOT fire:** user fenced the scope this turn · no falsifiable break (a
75
+ preference, not a red) · already decided by the user.
76
+
77
+ ## Why separate from `active-remediation`
78
+
79
+ That rule forbids ignoring a spotted issue and its ladder permits **note + ask**.
80
+ Two properties made it insufficient, both measured 2026-08-20: it is `type: auto`
81
+ on `refactor`/`legacy`/`cleanup` triggers — **none of which a failing CI job
82
+ matches**, so it does not load when the obligation matters most — and its
83
+ note-and-ask tier is what let a session name a red check's cause, name the
84
+ file's author, and hand it back still red.
85
+
86
+ Mechanics (fix-now size criteria, follow-up shape) stay there; this rule only
87
+ deletes the two escapes.
88
+
89
+ ## Honest activation gap — this rule is `auto`, and it wanted to be `always`
90
+
91
+ It shipped `auto` for a budget reason, not a design one, and the gap that leaves
92
+ is exactly the one it was written to close: **a red check the agent sees in tool
93
+ output triggers nothing.** Keyword triggers match the PROMPT. So the rule loads
94
+ when a human says "CI is red" or "not my test", and does NOT load when a test
95
+ run comes back red and nobody has said a word.
96
+
97
+ `check_always_budget` is the reason: the extended always-budget sat at
98
+ 60,252 / 60,254 chars — **two characters of headroom** — and the cap is a
99
+ ratchet that may only move down. The other nine always-rules are the kernel,
100
+ which `block_kernel_rule_writes` denies agent writes to, so no room can be made
101
+ from this side. A 2,332-char rule puts the total at 103.9 %.
102
+
103
+ Closing the gap needs one of: the ext-cap ratchet opened deliberately (a
104
+ maintainer decision, recorded), a kernel rule shortened to make room, or a
105
+ `post_tool_use` carrier that notices a non-zero verification exit — the only
106
+ option that would fire on tool output rather than on wording. Until then, `auto`
107
+ plus this paragraph is the honest state: the obligation is real, its delivery is
108
+ partial, and the partiality is named rather than implied away.
@@ -3,11 +3,6 @@ type: "auto"
3
3
  tier: "mechanical-already"
4
4
  description: "Linking transient files (agents/roadmaps/, agents/runtime/council/) from stable artifacts — both expire; promote findings"
5
5
  alwaysApply: false
6
- triggers:
7
- - path_prefix: "agents/roadmaps/"
8
- - path_prefix: "agents/runtime/council/questions/"
9
- - path_prefix: "agents/runtime/council/responses/"
10
- - path_prefix: "agents/runtime/council/sessions/"
11
6
  routes_to:
12
7
  - "skill:ai-council"
13
8
  - "skill:agent-docs-writing"
@@ -0,0 +1,110 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2b"
4
+ description: "The same criticism arriving again indicts the system, not only the item — reopen the disposition that dismissed it, resolve on evidence, never on the repetition count"
5
+ alwaysApply: false
6
+ triggers:
7
+ - phrase: "schon mehrfach"
8
+ - phrase: "schon wieder"
9
+ - phrase: "zum dritten mal"
10
+ - phrase: "wie oft noch"
11
+ - phrase: "wie oft soll ich"
12
+ - phrase: "immer noch nicht"
13
+ - phrase: "i already told you"
14
+ - phrase: "told you this"
15
+ - phrase: "how many times"
16
+ - phrase: "as i mentioned before"
17
+ routes_to:
18
+ - "guideline:agent-infra/recurring-criticism-mechanics"
19
+ - "skill:skill-improvement-pipeline"
20
+ workspaces: [agent-config-maintainer, engineering]
21
+ packs: [meta]
22
+ collision_ok:
23
+ "schon wieder": "active-remediation makes a user 'leave it' terminal against the AGENT re-raising a closed item; this rule fires only when the USER brings it back — a decision-maker reopening their own decision is not the nagging that rule prevents"
24
+ obligation_frequency: "per-task"
25
+ ---
26
+
27
+ # Recurring Criticism
28
+
29
+ [`decision-revisit-gate`](decision-revisit-gate.md) has one entrance: the agent
30
+ wants to act and a lock is in the way. This is the other — **the same criticism
31
+ arrives again**, from the user or from a re-arrived artifact.
32
+
33
+ ## The Iron Law
34
+
35
+ ```
36
+ THE SAME CRITICISM ARRIVING AGAIN IS EVIDENCE ABOUT THE SYSTEM,
37
+ NOT ONLY ABOUT THE ITEM.
38
+ REOPEN THE DISPOSITION THAT DISMISSED IT. NAME WHICH ASSUMPTION BROKE.
39
+ NEVER RESOLVE IT ON THE REPETITION COUNT — RESOLVE IT ON EVIDENCE.
40
+ CAPITULATING BECAUSE IT WAS SAID TWICE IS THE SAME FAILURE
41
+ AS DISMISSING IT TWICE.
42
+ A LEARNING THAT DOES NOT CONSTRAIN THE NEXT RUN IS NOT A LEARNING.
43
+ NEVER BUY A HARDENING BY WEAKENING A SAFETY FLOOR.
44
+ ```
45
+
46
+ **The repetition reverses the burden of proof.** The standing rule is: same
47
+ mechanism, no new evidence → the lock applies. Recurrence *is* the new evidence —
48
+ not that the item is right, that the disposition did not hold. Whoever keeps the
49
+ lock now carries the argument. **Mechanism-match still runs first**: a complaint
50
+ resembling the old one but testing a different mechanism is a new finding.
51
+
52
+ **Resolve on evidence, never on the count.** Challenging a model's answer —
53
+ including a correct one — reliably makes it capitulate and revise toward the
54
+ perceived expectation rather than toward truth
55
+ <!-- harvest:reflection-sycophancy-flipflop -->, so a rule reading "said twice" as
56
+ proof of error would be that failure mode with a procedure attached. The
57
+ repetition opens the question; it never answers it.
58
+
59
+ ## Exactly three outcomes
60
+
61
+ The repetition proves the **system** failed <!-- harvest:recurrence-indicts-the-system -->;
62
+ it does not prove the **decision** was wrong. Own analysis, from that split:
63
+
64
+ | Outcome | What actually broke | Hardening means |
65
+ |---|---|---|
66
+ | The disposition was **wrong** | the decision | reverse it, record what would have caught it |
67
+ | **Right, never recorded** | the record | make it durable + citable, with `revisit-if` |
68
+ | **Right, recorded, unreachable** | reachability | move it onto a surface the next run reads |
69
+
70
+ In all three the system failed — only in the first was the decision wrong. A
71
+ resolution naming none of them is an unresolved recurrence.
72
+
73
+ **Look up the earlier disposition before re-deriving anything, and name the store
74
+ you checked** — addresses, the mechanism-is-the-defect classification, the
75
+ hardening floor and the failure modes are in
76
+ [`recurring-criticism-mechanics`](../docs/guidelines/agent-infra/recurring-criticism-mechanics.md).
77
+ One line does not migrate, because acting on it wrong is silent: rejections live in
78
+ analysis prose by design, so "I found nothing" means *prose was grepped*, never
79
+ *nothing was decided*.
80
+
81
+ ## When NOT to fire
82
+
83
+ - **A repeated task instruction**, not a criticism — that is an instruction, do it.
84
+ - **Mechanism-match fails** — a resemblance is not a recurrence.
85
+ - **The agent is the one repeating** — that is [`no-cheap-questions`](no-cheap-questions.md).
86
+ - **Already resolved this task.** Once decided, it is decided.
87
+
88
+ ## Honest enforcement — `enforced_by: none`
89
+
90
+ One narrow deterministic signal exists. `src/scripts/_lib/self_repair.ts` keeps one
91
+ record per defect fingerprint with an `occurrences` counter and reopens a released
92
+ record when the user re-reports it — literally this rule's trigger state — and the
93
+ injected queue line now carries that number, so above 1 an agent sees it. Three
94
+ limits: `agents/runtime/` is gitignored, so the store is one machine's and empty on
95
+ a fresh checkout; it covers only defects the complaint detector matched, where a
96
+ phrasing outside the added patterns is a paraphrase away from silence; and it is
97
+ hook-carried, so on a host without the slot nothing fires.
98
+
99
+ The rest is model-carried, named rather than implied: **nothing** observes whether
100
+ the earlier disposition was opened, for rejections there is nothing structured to
101
+ open, and no gate can tell a resolution that named one of the three outcomes from
102
+ one that asserted it. Claiming the counter as coverage for any of that would
103
+ inflate it, so it is not claimed — skipping this rule is caught by nothing.
104
+
105
+ ## See also
106
+
107
+ - [`decision-revisit-gate`](decision-revisit-gate.md) — the other entrance; owns the five steps and the owner-reserved routing this rule reuses instead of restating. Separate file only because that one sits four lines under the 200-line cap.
108
+ - [`self-repair-loop`](self-repair-loop.md) — the single-occurrence intake; this rule is what its `occurrences` counter is for.
109
+ - [`active-remediation`](active-remediation.md) — the terminal "leave it" this rule does not override (see `collision_ok`).
110
+ - [`/analyze:inbox`](../commands/analyze/inbox.md) § Phase 4c — the artifact-side detection that routes here.
@@ -29,7 +29,7 @@ ANY ROADMAP TOUCH → REGENERATE THE DASHBOARD, SAME RESPONSE.
29
29
  NO EXCEPTIONS. NO "I'LL DO IT AT THE END". NO BATCHING ACROSS TURNS.
30
30
  ```
31
31
 
32
- Roadmap touch = create / rename / delete / move file, add/rename/remove a phase, OR flip any checkbox (`[ ]` ↔ `[x]` ↔ `[~]` ↔ `[-]`). Regen command: `./agent-config roadmap:progress`. Archive (`git mv` → `archive/`) the moment `count_open == 0` — same response.
32
+ Roadmap touch = create / rename / delete / move file, add/rename/remove a phase, OR flip any checkbox (`[ ]` ↔ `[x]` ↔ `[~]` ↔ `[-]`). Regen command: `./agent-config roadmap:progress` — it passes `--archive`, so a roadmap at `count_open == 0` with no deferred item and no open blocker is `git mv`'d to `archive/` by the same run, not reported for someone to do later. `--check` never archives, and the PostToolUse hook never archives (contract + the council's recorded dissent: the `--archive` block in `update_roadmap_progress.ts`).
33
33
 
34
34
  ## Iron Law 2 — real-time checkbox cadence (autonomous execution)
35
35
 
@@ -97,6 +97,25 @@ in the estate?**
97
97
  [`no-cheap-questions`](no-cheap-questions.md) forbids. The gate protects the
98
98
  item, not the maintainer's attention.
99
99
 
100
+ ### `deferred_policy` — a declared contract removes the round, never the route
101
+
102
+ An accepted execution contract may declare `deferred_policy`
103
+ ([`roadmap-execution-contract § 2b`](../contexts/execution/roadmap-execution-contract.md)).
104
+ It changes **when the round happens**, never **who decides**:
105
+
106
+ | Declared | Effect on the gate |
107
+ |---|---|
108
+ | absent / `wait` | Unchanged — the synchronous menu runs. |
109
+ | `spawn-follow-up-draft` | The council-routed carry disposition runs **automatically** at closure, with no options round. Legal only because the table above already routes it to the council and Accept pre-authorized the run. |
110
+ | `cancel-with-memo` | The run writes the memo and the recommendation; the `[-]` conversion stays **user**. A declared field never moves a row from user to council. |
111
+
112
+ Recorded-or-it-did-not-happen applies unchanged to an automatic spawn, and
113
+ fail-closed binds hardest here: a spawn naming a follow-up that does not exist
114
+ yet reaches the user, because a contract cannot pre-authorize a promise.
115
+ Reversible — `wait` is the default, so removing the field restores always-wait
116
+ (`decision 2026-08-20`, AI council 2/2; record
117
+ `agents/evidence/council/drain-blocker-dispositions-a.md`).
118
+
100
119
  ## Later disposition — blocked-for-later roadmaps are parked, never left active
101
120
 
102
121
  ```
@@ -2,8 +2,6 @@
2
2
  type: "auto"
3
3
  tier: "2a"
4
4
  description: "Creating/editing rules, or auditing rule types — decides when a rule should be always vs auto"
5
- triggers:
6
- - path_prefix: "src/rules/"
7
5
  routes_to:
8
6
  - "guideline:agent-infra/rule-type-governance"
9
7
  workspaces: [agent-config-maintainer]
@@ -52,6 +52,16 @@ work, not a notification:
52
52
  the user's call, per
53
53
  [`non-destructive-by-default`](non-destructive-by-default.md).
54
54
 
55
+ **When the line says the record has recurred, step 2 changes target.** The store
56
+ keeps one record per fingerprint and increments it, so a repeat does not raise
57
+ `count` — the line now carries the newest record's `occurrences` instead, and
58
+ above 1 it is the only deterministic "this came back" signal in the session. A
59
+ recurrence means the *earlier* fix or dismissal did not hold, so the surface that
60
+ failed is the one that let it be closed prematurely, not only the one that let the
61
+ behaviour happen. Resolve it through
62
+ [`recurring-criticism`](recurring-criticism.md) — which also states the part that
63
+ matters most here: resolve on evidence, never on the repetition count.
64
+
55
65
  ## Correct openly, never silently
56
66
 
57
67
  Reported by the user → redo the task properly in the same turn, visibly, saying
@@ -84,6 +94,13 @@ The user is criticising the **code**, not the agent's conduct; the fingerprint
84
94
  is already an open record (the hook increments it); or a one-off caused by
85
95
  information the agent could not have had — note it, do not queue it.
86
96
 
97
+ **The already-an-open-record case suppresses a duplicate QUEUE ENTRY, never the
98
+ response.** Read on its own the clause above inverts into "it came back, so do
99
+ nothing new", which is the opposite of what a repeat means. The counter exists
100
+ precisely so a recurrence is visible without a second entry: no new record, and a
101
+ **stronger** obligation — [`recurring-criticism`](recurring-criticism.md) fires,
102
+ because the earlier disposition demonstrably did not hold.
103
+
87
104
  ## Enforcement
88
105
 
89
106
  The hook is `fail_closed: false` and always exits 0: it records, it never
@@ -2,8 +2,6 @@
2
2
  type: "auto"
3
3
  tier: "mechanical-already"
4
4
  description: "Creating/editing/reviewing skills — minimum quality standard; every skill executable, validated, self-contained"
5
- triggers:
6
- - path_prefix: "src/skills/"
7
5
  routes_to:
8
6
  - "guideline:agent-infra/skill-quality-checklist"
9
7
  workspaces: [agent-config-maintainer]
@@ -3,13 +3,6 @@ type: "auto"
3
3
  tier: "mechanical-already"
4
4
  description: "Naming an external repo this package copied/harvested/compared against — keep the tracked tree source-anonymous"
5
5
  alwaysApply: false
6
- triggers:
7
- - path_prefix: "src/skills/"
8
- - path_prefix: "src/rules/"
9
- - path_prefix: "src/domains/"
10
- - path_prefix: "docs/"
11
- - path_prefix: "agents/evidence/"
12
- - path_prefix: "agents/roadmaps/"
13
6
  validator_ignore:
14
7
  - type: "substring"
15
8
  pattern: "external_sources_denylist"
@@ -96,6 +89,43 @@ runs in the package CI pipeline and fails the build on any denied source token
96
89
  in a non-carve-out tracked file. The linter is a deterministic net, not a
97
90
  substitute for not writing the attribution in the first place.
98
91
 
92
+ ## Why this rule is not path-scoped
93
+
94
+ Under ADR-236 (`docs/decisions/ADR-236-one-artefact-one-layer.md`) this rule is
95
+ delivered by the PROJECT layer only — it exists to maintain this package, so the
96
+ global layer no longer carries an unscoped twin of it. A `paths:`-scoped rule is
97
+ **not re-injected after `/compact`** (ADR-227:79-80), so scoping it would mean the
98
+ obligation silently disappears mid-session with nothing left to reload it.
99
+
100
+ It is therefore delivered unconditionally, and the path triggers were removed
101
+ rather than worked around. **This section is the shared record for all four such
102
+ rules** — `no-roadmap-references`, `rule-type-governance` and `skill-quality` carry
103
+ the same change and no note of their own. Two reasons: four copies of the rationale
104
+ cost more standing context than the decision they explain, and the other three are
105
+ migrated POINTER stubs held at their pointer's size by
106
+ `check_rule_stub_ceiling` — prose added there is prose in the wrong place by that
107
+ gate's own contract, which is what caught the first attempt to duplicate it.
108
+
109
+ AI council 2026-08-20, 2/2 convergent on this option over three alternatives, with
110
+ two independent decisive arguments. First: the obligation governs an **authoring
111
+ decision**, which happens before any file exists for a path trigger to match — so
112
+ path-scoping fails at greenfield creation whether or not a compaction ever occurs.
113
+ Second: the measured cost is small against what the partition returns. Keeping an
114
+ unscoped global copy was rejected because it re-creates the duplication the
115
+ partition exists to remove; splitting the four by "has a CI gate" was rejected by
116
+ both seats as the wrong axis — a validator observes an outcome, it does not hold an
117
+ obligation during the session, and `rule-type-governance` has no gate at all.
118
+
119
+ **Cost, measured and corrected.** An earlier revision of this note claimed 1,754
120
+ tokens (1.8 % of the partition's 96,584-token saving). That figure was a
121
+ `chars / 4` proxy over the projected files and **understated the real cost by about
122
+ half**: `check_rule_activation_census`, which counts with the exact BPE tokenizer,
123
+ measures the unconditional corpus growing **108,130 → 111,642, i.e. +3,512 tokens
124
+ (3.6 %)** — and that number includes this rationale, which is why it lives in one
125
+ place instead of four. The verdict does not depend on the figure: one seat argued
126
+ the token axis was the wrong one entirely, the other that cost is a legitimate axis
127
+ which simply loses this particular comparison. Both readings survive 3.6 %.
128
+
99
129
  ## See also
100
130
 
101
131
  - [`source-of-truth`](source-of-truth.md) — edit `src/`, never the projections.