@event4u/agent-config 14.5.0 → 14.7.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 (203) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +384 -3
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/analyze/decision.md +7 -0
  5. package/dist/agent-src/commands/analyze/inbox.md +264 -10
  6. package/dist/agent-src/commands/analyze.md +1 -1
  7. package/dist/agent-src/commands/optimize/project.md +10 -0
  8. package/dist/agent-src/commands/roadmap/process-full.md +132 -4
  9. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +31 -0
  10. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +161 -1
  11. package/dist/agent-src/rules/context-hygiene.md +2 -0
  12. package/dist/agent-src/rules/decision-revisit-gate.md +111 -7
  13. package/dist/agent-src/rules/fix-what-you-see.md +108 -0
  14. package/dist/agent-src/rules/no-roadmap-references.md +0 -5
  15. package/dist/agent-src/rules/recurring-criticism.md +110 -0
  16. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  17. package/dist/agent-src/rules/rule-type-governance.md +0 -2
  18. package/dist/agent-src/rules/self-repair-loop.md +17 -0
  19. package/dist/agent-src/rules/skill-quality.md +0 -2
  20. package/dist/agent-src/rules/source-confidentiality.md +37 -7
  21. package/dist/agent-src/scripts/archival_sweep.ts +117 -0
  22. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +19 -3
  23. package/dist/agent-src/scripts/gate_budget.ts +282 -0
  24. package/dist/agent-src/scripts/gate_execute.ts +72 -31
  25. package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
  26. package/dist/agent-src/scripts/update_roadmap_progress.ts +251 -7
  27. package/dist/agent-src/skills/adr-create/SKILL.md +25 -3
  28. package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
  29. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
  30. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
  31. package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
  32. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
  33. package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
  34. package/dist/agent-src/skills/decision-review/SKILL.md +18 -0
  35. package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
  36. package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
  37. package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
  38. package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
  39. package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
  40. package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
  41. package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
  42. package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
  43. package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
  44. package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
  45. package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
  46. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
  47. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  48. package/dist/agent-src/templates/roadmaps.md +45 -2
  49. package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  50. package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  51. package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  52. package/dist/cli/registry.js +1 -1
  53. package/dist/cli/registry.js.map +1 -1
  54. package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
  55. package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-4VR4ORQ6.js} +10 -7
  56. package/dist/cli-delegate/chunk-6EOCNQAM.js +402 -0
  57. package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-74E3TKWV.js} +381 -280
  58. package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-7F3VYSM2.js} +4 -4
  59. package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
  60. package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
  61. package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-GJ5BVHXM.js} +72 -165
  62. package/dist/cli-delegate/{chunk-ZPSXJTLI.js → chunk-JZ4NR2TW.js} +353 -1
  63. package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
  64. package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
  65. package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
  66. package/dist/cli-delegate/cmd_conformance.js +459 -709
  67. package/dist/cli-delegate/cmd_doctor.js +6 -6
  68. package/dist/cli-delegate/cmd_explain.js +1 -1
  69. package/dist/cli-delegate/cmd_export.js +7 -6
  70. package/dist/cli-delegate/cmd_handoff.js +6 -6
  71. package/dist/cli-delegate/cmd_packs_active.js +1 -1
  72. package/dist/cli-delegate/cmd_preflight.js +2 -2
  73. package/dist/cli-delegate/cmd_prune.js +7 -6
  74. package/dist/cli-delegate/cmd_session_recycle.js +840 -30
  75. package/dist/cli-delegate/cmd_settings_migrate.js +7 -6
  76. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  77. package/dist/cli-delegate/cmd_sync.js +7 -6
  78. package/dist/cli-delegate/cmd_uninstall.js +9 -7
  79. package/dist/cli-delegate/cmd_update.js +1 -1
  80. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  81. package/dist/cli-delegate/cmd_validate.js +7 -6
  82. package/dist/discovery/deprecation-report.md +1 -1
  83. package/dist/discovery/discovery-manifest.json +72 -29
  84. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  85. package/dist/discovery/discovery-manifest.summary.md +4 -4
  86. package/dist/discovery/dormancy-report.md +1 -1
  87. package/dist/discovery/orphan-report.md +1 -1
  88. package/dist/discovery/packs.json +10 -8
  89. package/dist/discovery/trust-report.md +3 -3
  90. package/dist/discovery/workspaces.json +8 -6
  91. package/dist/hooks/dispatch.js +3127 -2022
  92. package/dist/install/claudePathsPlan.js +187 -0
  93. package/dist/install/claudePathsPlan.js.map +1 -0
  94. package/dist/install/hostLayerFingerprint.js +136 -0
  95. package/dist/install/hostLayerFingerprint.js.map +1 -0
  96. package/dist/install/install.mjs +553 -425
  97. package/dist/install/partitionEligibility.js +276 -0
  98. package/dist/install/partitionEligibility.js.map +1 -0
  99. package/dist/mcp/registry-manifest.json +3 -3
  100. package/dist/mcp/server.json +2 -2
  101. package/dist/mcp/server.mjs +1744 -1191
  102. package/dist/router.json +1 -1
  103. package/dist/scripts/_lib/agent_src.js +41 -0
  104. package/dist/scripts/_lib/agent_src.js.map +1 -1
  105. package/dist/scripts/_lib/install_layout.js +83 -0
  106. package/dist/scripts/_lib/install_layout.js.map +1 -0
  107. package/dist/scripts/_lib/installed_lock.js +444 -0
  108. package/dist/scripts/_lib/installed_lock.js.map +1 -0
  109. package/dist/scripts/condense.js +13 -164
  110. package/dist/scripts/condense.js.map +1 -1
  111. package/dist/server/schemas/settings.js +4 -0
  112. package/dist/server/schemas/settings.js.map +1 -1
  113. package/docs/contracts/settings-classes.md +12 -6
  114. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
  115. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
  116. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +49 -0
  117. package/docs/guidelines/agent-infra/memory-access.md +17 -0
  118. package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  119. package/package.json +1 -1
  120. package/src/agent-src/scripts/archival_sweep.ts +117 -0
  121. package/src/agent-src/scripts/archive_completed_roadmaps.ts +19 -3
  122. package/src/agent-src/scripts/gate_budget.ts +282 -0
  123. package/src/agent-src/scripts/gate_execute.ts +72 -31
  124. package/src/agent-src/scripts/roadmap_gates.ts +74 -3
  125. package/src/agent-src/scripts/update_roadmap_progress.ts +251 -7
  126. package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  127. package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  128. package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  129. package/src/config/agent-settings.template.yml +27 -2
  130. package/src/config/ci-local-parity.yml +18 -0
  131. package/src/config/estate-count-budget.json +367 -3
  132. package/src/config/gate-violation-baselines.json +41 -41
  133. package/src/config/pack-size-budget.json +3 -2
  134. package/src/config/rule-activation-census.json +14 -6
  135. package/src/config/rule-stub-ceilings.json +19 -6
  136. package/src/install/claudePathsPlan.ts +196 -0
  137. package/src/install/hostLayerFingerprint.ts +145 -0
  138. package/src/install/partitionEligibility.ts +325 -0
  139. package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
  140. package/src/scripts/_dispatch.bash +6 -1
  141. package/src/scripts/_lib/ac_heading.ts +30 -0
  142. package/src/scripts/_lib/agent_src.ts +42 -0
  143. package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
  144. package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
  145. package/src/scripts/_lib/envelope_grounding.ts +38 -8
  146. package/src/scripts/_lib/installed_lock.ts +50 -5
  147. package/src/scripts/_lib/layer_overlap_notice.ts +85 -0
  148. package/src/scripts/_lib/md_section.ts +129 -0
  149. package/src/scripts/_lib/scope_guard.sh +86 -4
  150. package/src/scripts/_lib/self_repair.ts +19 -0
  151. package/src/scripts/_lib/self_repair_class_b.ts +171 -0
  152. package/src/scripts/_lib/subagent_capsule.ts +81 -1
  153. package/src/scripts/adr/regenerate_index.ts +13 -2
  154. package/src/scripts/adr_cite_check.ts +424 -0
  155. package/src/scripts/ai_council/cli_help.ts +55 -0
  156. package/src/scripts/before_complete_hook.ts +153 -28
  157. package/src/scripts/bench_ab_v2_complexity.ts +27 -7
  158. package/src/scripts/check_adr_frontmatter.ts +187 -1
  159. package/src/scripts/check_references.ts +60 -0
  160. package/src/scripts/check_release_published.ts +32 -11
  161. package/src/scripts/check_single_delivery.ts +517 -0
  162. package/src/scripts/ci_settle.ts +170 -0
  163. package/src/scripts/condense.ts +20 -170
  164. package/src/scripts/council_cli.ts +3 -3
  165. package/src/scripts/dispatch_r2_reviewer.ts +6 -14
  166. package/src/scripts/hook_manifest.json +1 -1
  167. package/src/scripts/hook_manifest.yaml +77 -14
  168. package/src/scripts/hooks/block_no_verify.ts +61 -10
  169. package/src/scripts/hooks/block_unauthorized_git.ts +1 -1
  170. package/src/scripts/hooks/concern_registry.ts +4 -0
  171. package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
  172. package/src/scripts/hooks/run_continuation_hook.ts +887 -68
  173. package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
  174. package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
  175. package/src/scripts/hooks/state_io.ts +782 -20
  176. package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
  177. package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
  178. package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
  179. package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
  180. package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
  181. package/src/scripts/install.sh +12 -2
  182. package/src/scripts/install.ts +16 -11
  183. package/src/scripts/language_mirror_hook.ts +561 -25
  184. package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
  185. package/src/scripts/lint_plan_risk_register.ts +4 -3
  186. package/src/scripts/lint_skill_router_head.ts +4 -4
  187. package/src/scripts/mcp_server/tools.ts +2 -2
  188. package/src/scripts/memory_consolidation.ts +189 -0
  189. package/src/scripts/memory_eviction.ts +384 -0
  190. package/src/scripts/new_roadmap.ts +136 -0
  191. package/src/scripts/pack_mcp_content.ts +20 -5
  192. package/src/scripts/release.ts +37 -38
  193. package/src/scripts/report_layer_overlap.ts +78 -0
  194. package/src/scripts/report_memory_pointers.ts +622 -0
  195. package/src/scripts/self_repair_hook.ts +37 -5
  196. package/src/scripts/session_register_hook.ts +115 -15
  197. package/src/scripts/skill_usage_collect.ts +11 -1
  198. package/src/scripts/skill_usage_report.ts +278 -8
  199. package/src/scripts/sync_pr_branch.ts +7 -0
  200. package/src/server/schemas/settings.ts +8 -0
  201. package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
  202. package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
  203. /package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
@@ -180,6 +180,86 @@ change in § 3a.
180
180
  `commit-policy` § NEVER ask about committing holds regardless of
181
181
  autonomy).
182
182
 
183
+ ### 3c. Capability screen — can the agent do this at all?
184
+
185
+ ```
186
+ A RUN ALWAYS STARTS. THERE IS NO PREFLIGHT REFUSAL.
187
+ PER OPEN STEP, ASK ONE QUESTION: CAN THE AGENT EXECUTE THIS AT ALL?
188
+ YES → IT IS WORK. NO → IT IS THE ONLY KIND OF BLOCKER LEFT.
189
+ WHO CONVENTIONALLY DOES A THING IS NOT A PROPERTY OF THE THING.
190
+ ```
191
+
192
+ **Rewritten by [ADR-237](../../../docs/decisions/ADR-237-end-to-end-execution-authority.md),
193
+ which supersedes ADR-235.** This section used to be a *preflight refusal*: a run
194
+ with no "runnable" open step created no branch and wrote nothing. That is gone.
195
+ The invocation is a delegation, so the question is no longer *is this step
196
+ runnable under current governance* but *is this step possible for the agent at
197
+ all.*
198
+
199
+ Run once at the end of the pre-scan, and again immediately before any `blocked`
200
+ report.
201
+
202
+ **The screen, in order:**
203
+
204
+ 1. **Can the agent execute it?** Through the filesystem, git, `gh`, an API, a
205
+ CLI, a tool, a model, a council — anything machine-executable. If yes, the
206
+ step is **work**. Stop here; no blocker citation changes that.
207
+ 2. **Is the authority already implied by the invocation?** For a `process-full`
208
+ run: branches, chunked commits, pushing that branch, opening and updating the
209
+ PR, reversible repository/branch settings, CI runs and re-runs, merge-base
210
+ updates, conflict resolution, project-local dependencies, and paid calls
211
+ inside the cumulative USD 25 ceiling. If yes → **run it**.
212
+ 3. **Is it on the EXCLUDED list?** Merging to a production trunk, deploying,
213
+ production data / secrets / IAM / DNS, bulk deletion outside the roadmap's
214
+ scope, an irreversible external action beyond the PR itself. Those keep their
215
+ own this-turn confirmation ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md))
216
+ and are a **halt**, not a blocker.
217
+ 4. **Otherwise it is externally impossible**, and only then is it a blocker: a
218
+ credential that does not exist and cannot be created · a purchase beyond the
219
+ budget · physical hardware access · another person or organisation must act ·
220
+ a wait that is factually mandatory and unverifiable.
221
+
222
+ **A `## Blockers` entry is evidence, never a verdict.** A `Class: 3` label on an
223
+ action the agent can perform is a **defect in the roadmap**, and the run repairs
224
+ the label rather than obeying it — recording what it did and why. Class `0`/`1`
225
+ entries carry a `Run:` the agent executes, exactly as before. Class `2`
226
+ (consent-once) is pre-cleared for the duration of a `process-full` run when the
227
+ consent it wants is one the invocation already gave; a `2` asking for something
228
+ the invocation did NOT give (an EXCLUDED action, a spend crossing) still reaches
229
+ the owner.
230
+
231
+ **No citation → work**, and the default direction is unchanged: the failure this
232
+ screen must not have is declining work an agent could have done.
233
+
234
+ **A step this screen judges externally impossible carries a `blocked-by:` marker
235
+ on its own line.** The obligation is unchanged and its reason is unchanged: two
236
+ mechanisms read blockedness from two different places and only one reads this
237
+ section — `run-continuation`, the stop-slot concern that re-engages an autonomous
238
+ run, decides open-vs-blocked from the inline `<!-- blocked-by: <id> -->` marker
239
+ and never parses `## Blockers`. Without the marker a step that IS impossible
240
+ still counts as open work to the concern, which re-engages the agent into it
241
+ every stop fire until the stall rung fires — the mechanism whose job is to detect
242
+ a stall manufacturing one. **The residual is real and is not papered over:**
243
+ nothing enforces the pairing, so a `## Blockers` entry authored without its
244
+ marker is caught by review or not at all.
245
+
246
+ **The gaming vector inverted, and both directions are now named.** Under ADR-235
247
+ the vector was an agent writing itself a Class-3 blocker to stop early; the
248
+ defence was that a qualifying blocker must **pre-date the run**, checkable from
249
+ git. That defence is kept for the narrow blocker set that remains. ADR-237 adds
250
+ the opposite vector — an agent that keeps going past a spend ceiling or into an
251
+ EXCLUDED action under cover of "the roadmap needed it" — and its defences are
252
+ step 3 above being an enumerated list rather than a characterisation, and the
253
+ ceiling being cumulative per run rather than per action.
254
+
255
+ **One imprecision, inherited and now given a test.** The class taxonomy has no
256
+ row for *"waiting on time"* or *"waiting on another roadmap"*; both are authored
257
+ as `3` today because an absent `Class:` already means `3`. Under step 4 a wait is
258
+ a blocker only when it is factually mandatory and unverifiable — a soak window a
259
+ run can simply outlast, or a cross-roadmap dependency the run can satisfy itself,
260
+ is work. The taxonomy still lacks the row; the mislabel now has a stated test
261
+ instead of a default.
262
+
183
263
  ## 4. Resolve cadences — read once, cache for the run
184
264
 
185
265
  Read both keys from `.agent-settings.yml` once and cache for the whole
@@ -430,6 +510,69 @@ artifact drafting, council enablement), not safety.
430
510
 
431
511
  On halt: stop, surface state, do **not** auto-fix outside the failing step.
432
512
 
513
+ ### Terminal outcomes — `complete`, or a genuine external impossibility
514
+
515
+ The halt list above answers *"what interrupts runnable work"*. This answers
516
+ *"what does the run report when the roadmap is not finished and the remaining
517
+ work is not the agent's to do"* — and under
518
+ [ADR-237](../../../docs/decisions/ADR-237-end-to-end-execution-authority.md) that
519
+ second set is much smaller than it looks.
520
+
521
+ **The measurement that motivated the old answer, and the reading that replaced
522
+ it.** Measured 2026-08-19 across the twelve most nearly complete roadmaps:
523
+ **zero** could reach `count_open == 0` in one PR, because every remaining step
524
+ needed "a human action" — flip branch protection, authorise paid spend, install a
525
+ binary, wait out a soak window, edit a file a hook denies. The census was sound.
526
+ The reading was not: it counted actions a human *conventionally* performs,
527
+ without asking per action whether a human was **necessary**. Flipping a branch
528
+ setting, pushing, opening a PR, re-running CI, updating a merge base, fixing a
529
+ test, spending inside a budget — the agent can do all of it. That is remediation
530
+ work, and a `process-full` invocation grants it.
531
+
532
+ Three outcomes, and only one of them is success:
533
+
534
+ | Outcome | When | What it reports |
535
+ |---|---|---|
536
+ | `complete` | `count_open == 0` and the PR is open | the roadmap is finished; archival check runs (§ 6) |
537
+ | `blocked` | every remaining open step is **externally impossible** for the agent | the work that DID close, plus the specific impossibility |
538
+ | a halt | one of the five conditions above fired | the halt, its evidence, and what remains |
539
+
540
+ `blocked-preflight` **no longer exists** (ADR-237 § 4). A run always starts.
541
+
542
+ ```
543
+ `blocked` IS NEVER PRESENTED AS COMPLETION.
544
+ count_open STAYS > 0. NO CHECKBOX IS FLIPPED TO [~] TO REACH IT.
545
+ A PR OPENED ON A BLOCKED RUN IS LABELLED PARTIAL PROGRESS.
546
+ BEFORE REPORTING IT, ASK PER REMAINING STEP: CAN I DO THIS AT ALL?
547
+ ONE STEP THE AGENT COULD HAVE EXECUTED REJECTS THE CLAIM.
548
+ ```
549
+
550
+ **Externally impossible — the whole list.** A required credential that does not
551
+ exist and the agent cannot create · a purchase beyond the delegated budget ·
552
+ physical hardware access · another person or organisation must act · a wait that
553
+ is factually mandatory and cannot be simulated or verified.
554
+
555
+ **Not externally impossible — every one of these is work.** An unprotected
556
+ branch · a branch to create · a push · a PR to open · a repository or branch
557
+ setting the agent can change · a workflow to start · CI to re-run · a merge base
558
+ to update · conflicts · failing tests · local configuration · a paid call under
559
+ the ceiling · "this could be risky" · "a maintainer should do this".
560
+
561
+ The `[~]` prohibition is load-bearing and was the one point the council split on.
562
+ Deferring a blocked step to `[~]` would let the run reach `count_open == 0` and
563
+ report completion — laundering unfinished work through a glyph, which is exactly
564
+ what Iron Law 3 of [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md)
565
+ exists to catch on the archival side. So the boxes stay open and the outcome
566
+ carries the truth instead. **ADR-237 keeps this clause verbatim** — narrowing
567
+ `blocked` makes it more important, not less, because a run with more authority
568
+ has more ways to reach a clean-looking count.
569
+
570
+ Revalidation is the second half of the same discipline: the set is recomputed at
571
+ the moment of reporting, because steps unblock during a run (a prerequisite
572
+ closes, a `Run:` succeeds, a peer merges, a setting the run itself changed). If
573
+ any remaining step is one the agent could execute, `blocked` is refused and the
574
+ loop continues.
575
+
433
576
  ### Forbidden non-halt reasons — agent-invented cautions
434
577
 
435
578
  The halt list above is **exhaustive**. An agent running `process-full` (or any
@@ -446,9 +589,26 @@ a violation of the command and the user's will:
446
589
  a phase boundary emits a non-blocking status line and the run **continues**;
447
590
  the stop-and-wait reading of `phase-checkpoints` applies only to
448
591
  `process-phase`.
592
+ - **"this step looks human-gated"** — the `blocked` outcome above is reached by
593
+ the § 3c test, never by a judgement about how a step feels. A step with no
594
+ qualifying blocker citation is runnable, and writing the citation yourself does
595
+ not make it one. This entry exists because the terminal outcome is the single
596
+ most abusable thing on this page.
597
+ - **"the branch is not protected" / "a branch must be created" / "a PR must be
598
+ opened" / "a GitHub setting must change" / "CI must be re-run" / "the merge
599
+ base needs updating" / "there are conflicts" / "tests fail"** — every one is
600
+ remediation work the invocation authorised (ADR-237 § 1). Do it.
601
+ - **"a paid service is needed"** — authorised up to a cumulative USD 25 per run
602
+ (§ Spend in the wrapper). Uncertainty about the exact cost is explicitly NOT a
603
+ reason to ask.
604
+ - **"a maintainer should do this"** when the agent can perform the same action
605
+ through git, `gh`, an API or a CLI. **Capability before role**: the role of the
606
+ person who conventionally does a thing is not a property of the thing.
449
607
 
450
608
  If the work genuinely cannot continue, it will be because one of the five real
451
- halt conditions fired — surface THAT, not a manufactured caution.
609
+ halt conditions fired, or because every remaining step is externally impossible
610
+ by the § 3c test — surface THAT, with the specific impossibility named, not a
611
+ manufactured caution and not a convention mistaken for a constraint.
452
612
 
453
613
  ### Non-halt — gating notes, "optional" tags
454
614
 
@@ -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*
@@ -10,8 +10,14 @@ triggers:
10
10
  - keyword: "already decided"
11
11
  - keyword: "locked decision"
12
12
  - keyword: "budget blocks"
13
+ - keyword: "adr-"
14
+ - keyword: "adrs"
15
+ - keyword: "superseded"
16
+ - keyword: "review_trigger"
17
+ - phrase: "the adr"
13
18
  routes_to:
14
- - "skill:decision-review"
19
+ - "skill:ai-council"
20
+ - "skill:decision-record"
15
21
  workspaces: [agent-config-maintainer, engineering]
16
22
  packs: [meta]
17
23
  collision_ok:
@@ -28,35 +34,133 @@ obligation_frequency: "per-task"
28
34
  A LOCK IS A DECISION UNDER PAST CONDITIONS, NOT A PERMANENT LAW.
29
35
  BENEFIT BLOCKED BY A LOCK → SURFACE + OFFER RE-EVALUATION.
30
36
  NEVER SILENT COMPLIANCE. NEVER SILENT DROP OF A GOOD CHANGE.
37
+ RE-EVALUATION GOES TO THE COUNCIL FIRST, NOT TO THE USER FIRST.
38
+ THE USER IS REACHED FOR THE RESERVED SET — AND ALWAYS FOR IT.
39
+ NEVER CITE A LOCK YOU HAVE NOT EVALUATED THIS TURN.
31
40
  ```
32
41
 
33
42
  An agent that finds a genuinely beneficial change blocked by a recorded
34
43
  past decision — an honest-null eval verdict, a "don't relitigate"
35
44
  memory or context note, a token-frugality/budget canon line, or an ADR —
36
- does not quietly comply and drop the change. It surfaces the conflict
37
- and offers the user a path to re-evaluate the lock. Progress means
38
- adaptation: locks encode what was true when they were written, not a
39
- ceiling on what the package may ever become.
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.
49
+
50
+ **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.
40
61
 
41
62
  **Mechanism-match check comes FIRST**: a verdict settles the *mechanism it
42
63
  tested*, not every future proposal that resembles it — if the blocked change
43
64
  is a different mechanism, the lock does not apply; proceed, noting the
44
65
  distinction.
45
66
 
46
- Body migrated to [`skill:decision-review` § Decision-revisit gate — mechanics](../skills/decision-review/SKILL.md) (per P4 of `road-to-kernel-and-router.md`) — what-counts-as-a-lock catalog (honest nulls, don't-relitigate notes, budget-canon lines, ADRs, hard structural caps), the five fire steps, when-NOT-to-fire, failure modes.
67
+ ## The five steps, carried here — the depth is elsewhere, the obligation is not
68
+
69
+ 1. **Mechanism-match** (above) — different mechanism, no lock, proceed.
70
+ 2. **Evaluate the lock before citing it.** An ADR may not be presented as a
71
+ reason not to act until its status, `review_trigger` state, amendments and
72
+ successors have been read. In this repository that is one command —
73
+ `./scripts-run src/scripts/adr_cite_check <ADR-NNN>`; elsewhere it is the
74
+ same four reads done by hand. A `superseded` / `deprecated` status means it is
75
+ not a live lock at all; a fired or indeterminate trigger means it is not an
76
+ **unqualified** one. `rejected` is NOT in the dead set — on an ADR it records
77
+ a rejected *proposal*, so the rejection binds until its premise is shown to
78
+ have changed.
79
+ 3. **Surface** the change, the lock, the condition it recorded, and what has
80
+ changed since.
81
+ 4. **Route it** — council by default (below), user only for the reserved set.
82
+ 5. **Record** the outcome with scope and `revisit-if`.
83
+
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.
92
+
93
+ Full catalog (honest nulls, don't-relitigate notes, budget-canon lines, ADRs,
94
+ hard structural caps), the per-step detail, when-NOT-to-fire and the failure
95
+ modes remain in [`skill:decision-review` § Decision-revisit gate — mechanics](../skills/decision-review/SKILL.md).
47
96
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
48
97
 
98
+ ## Who decides — the owner-reserved set
99
+
100
+ The discriminator, in one question: **does the proposed transition weaken an
101
+ owner-reserved invariant, or create an undelegated external, irreversible, or
102
+ destructive commitment?** No, and reversible inside the authorised envelope →
103
+ the council decides. Yes, or not establishable from tree evidence → the owner.
104
+
105
+ The routing unit is the **transition**, never the document: the same ADR may be
106
+ strengthened by the council and weakened only by the owner.
107
+
108
+ | Reserved to the owner | Council-decidable |
109
+ |---|---|
110
+ | Changes the project's purpose or a declared non-negotiable outcome | Any mechanism serving that purpose |
111
+ | **Lowers or removes** a recorded security / privacy / safety / data-handling floor | Strengthening a floor, or an equivalent swap above it |
112
+ | Irreversible or materially destructive | Reversible within the envelope |
113
+ | Spend or liability **above** a delegated threshold | Budgeted, threshold-bounded spend |
114
+ | Creates / removes / weakens a legal, regulatory, contractual, licensing, compatibility, or public commitment | Internal-only commitments |
115
+ | Governance self-amendment — reopening authority, quorum, escalation, this set | What the rules already permit |
116
+ | Cannot be bounded from available evidence | Bounded, with the evidence cited |
117
+
118
+ Council split, abstention, or no quorum is an **escalation condition**, not a
119
+ class: that transition escalates, the ADR does not become owner-reserved
120
+ forever. Availability is `agent-config council:status`, never a project file
121
+ ([`council-availability`](council-availability.md)).
122
+
123
+ 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
126
+ 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
128
+ precedent-creates-no-authority clause: [`adr-layout § Reopen authority`](../docs/contracts/adr-layout.md).
129
+
49
130
  ## See also
50
131
 
132
+ - [`recurring-criticism`](recurring-criticism.md) — the **other entrance**: this
133
+ rule fires when a lock blocks a change, that one when the same criticism arrives
134
+ again. It reuses the five steps and the owner-reserved table below.
51
135
  - [`decision-review`](../skills/decision-review/SKILL.md) — the backward-audit
52
136
  procedure + the migrated gate mechanics.
53
137
  - [`ai-council`](../skills/ai-council/SKILL.md) — the re-evaluation mechanism;
54
138
  owns the convergence-summary scope + `revisit-if` contract.
55
139
  - [`decision-record`](../skills/decision-record/SKILL.md) — forward-flow decision
56
- locking; the escalation litmus there names the reopening condition up front.
140
+ locking; its **§ 4 Lock the choice + consequences** requires the `Revisit-if:`
141
+ line that names the reopening condition up front. (This pointer used to cite an
142
+ "escalation litmus" heading; `grep` over `src/` + `docs/` returns two hits and
143
+ neither is in that file — the heading never existed, so the pointer led
144
+ nowhere. Corrected to the section that carries the obligation.)
57
145
  - [`token-budget-discipline`](token-budget-discipline.md) — the frugality-canon
58
146
  value-over-budget escalation this rule's budget-lock case defers to.
59
147
  - [`no-cheap-questions`](no-cheap-questions.md) — the question-quality floor a
60
148
  revisit-offer must still clear.
61
149
  - [`ask-when-uncertain`](ask-when-uncertain.md) — the numbered-options shape
62
150
  used to present the revisit offer.
151
+
152
+ ## Honest enforcement — `enforced_by: none`
153
+
154
+ `adr_cite_check` is deterministic where it runs, and nothing makes it run. No
155
+ gate can observe an agent citing a decision it never opened, so step 2 above is
156
+ model-carried — the same honesty boundary
157
+ [`security-sensitive-stop`](security-sensitive-stop.md) and
158
+ [`active-remediation`](active-remediation.md) state for their own obligations.
159
+
160
+ Two reach limits, named rather than implied. The tool lives in this repository's
161
+ `src/scripts/` and is **not** exposed as an `agent-config` verb, so a consumer
162
+ install performs step 2 by hand; wiring the verb touches six further surfaces
163
+ plus the curated `dist/agent-src/scripts/` list and is deliberately out of this
164
+ change. And `docs/decisions/` is projected into no agent-visible tree at all —
165
+ the agent sees ADR *numbers* cited across rules and skills, almost never ADR
166
+ *text*. Until that changes, "evaluate before citing" means opening the file.
@@ -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`](../domains/analysis-workbench/analyze/inbox/command.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
 
@@ -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]