@event4u/agent-config 14.5.0 → 14.6.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 (45) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +128 -0
  3. package/dist/agent-src/commands/analyze/decision.md +7 -0
  4. package/dist/agent-src/commands/optimize/project.md +10 -0
  5. package/dist/agent-src/commands/roadmap/process-full.md +45 -3
  6. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +130 -1
  7. package/dist/agent-src/rules/decision-revisit-gate.md +108 -7
  8. package/dist/agent-src/skills/adr-create/SKILL.md +25 -3
  9. package/dist/agent-src/skills/decision-review/SKILL.md +18 -0
  10. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  11. package/dist/cli-delegate/{chunk-ZPSXJTLI.js → chunk-P6LQDIWK.js} +15 -1
  12. package/dist/cli-delegate/cmd_conformance.js +1 -1
  13. package/dist/cli-delegate/cmd_handoff.js +1 -1
  14. package/dist/cli-delegate/cmd_session_recycle.js +1 -1
  15. package/dist/discovery/deprecation-report.md +1 -1
  16. package/dist/discovery/discovery-manifest.json +8 -8
  17. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  18. package/dist/discovery/discovery-manifest.summary.md +1 -1
  19. package/dist/discovery/dormancy-report.md +1 -1
  20. package/dist/discovery/orphan-report.md +1 -1
  21. package/dist/discovery/packs.json +2 -2
  22. package/dist/discovery/trust-report.md +1 -1
  23. package/dist/discovery/workspaces.json +2 -2
  24. package/dist/hooks/dispatch.js +334 -77
  25. package/dist/mcp/registry-manifest.json +2 -2
  26. package/dist/mcp/server.json +2 -2
  27. package/dist/router.json +1 -1
  28. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +49 -0
  29. package/package.json +1 -1
  30. package/src/config/estate-count-budget.json +29 -1
  31. package/src/config/pack-size-budget.json +3 -2
  32. package/src/scripts/_lib/layer_overlap_notice.ts +85 -0
  33. package/src/scripts/_lib/scope_guard.sh +62 -3
  34. package/src/scripts/_lib/subagent_capsule.ts +81 -1
  35. package/src/scripts/adr/regenerate_index.ts +13 -2
  36. package/src/scripts/adr_cite_check.ts +424 -0
  37. package/src/scripts/check_adr_frontmatter.ts +187 -1
  38. package/src/scripts/check_single_delivery.ts +473 -0
  39. package/src/scripts/hooks/run_continuation_hook.ts +884 -68
  40. package/src/scripts/install.sh +12 -2
  41. package/src/scripts/memory_consolidation.ts +189 -0
  42. package/src/scripts/memory_eviction.ts +384 -0
  43. package/src/scripts/report_layer_overlap.ts +72 -0
  44. package/src/scripts/report_memory_pointers.ts +622 -0
  45. package/src/scripts/session_register_hook.ts +104 -15
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Bootstrap shim for the event4u agent-config suite. This plugin ships ONLY the dispatcher hooks plus one install-pointer skill — ALL content (skills, rules, commands) is installed via `npx -y @event4u/agent-config init`, which writes the file projection AND registers the same hooks in ~/.claude/settings.json. DEPRECATED as a content channel; kept so the marketplace listing stays discoverable and existing installs keep working hooks.",
9
- "version": "14.5.0",
9
+ "version": "14.6.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/CHANGELOG.md CHANGED
@@ -384,6 +384,134 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
384
384
  > that forces a new era split (`# Era: 14.6.x`, etc.) — see
385
385
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
386
386
 
387
+ ## [14.6.0](https://github.com/event4u-app/agent-config/compare/14.5.0...14.6.0) (2026-08-19)
388
+
389
+ ### Release highlights
390
+
391
+ <!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
392
+ - **Behaviour changes:** _auto-derived, rewrite before merge:_ rule/schema diffs, breaking commits or removed public surface in 6ebae09, cafb8a2.
393
+ - **Default changes + migration:** _none_
394
+ - **Security and correctness:** _auto-derived, rewrite before merge:_ security-scoped commits or fixes to executable surface in 6ebae09, 5fd366f, 2de07e2, 3245188, 4510f6d, 406cb22 +13 more.
395
+ - **Honest nulls:** _auto-derived, rewrite before merge:_ commits recording a null, waived or falsified result in 93c30da.
396
+ - **Known limitations:** _none_
397
+
398
+ ### Features
399
+
400
+ * **adr:** sweep the twelve locks that blocked work, and wire two dead gates ([56276c9](https://github.com/event4u-app/agent-config/commit/56276c90c0fd1c5330df806b8d436bcd3c0964f9))
401
+ * **adr:** make an amended decision visible — reciprocal links, index columns ([d06c95e](https://github.com/event4u-app/agent-config/commit/d06c95ee304528fd3945e21d766a18e7bab9fbae))
402
+ * **adr-layout:** reopen authority — the transition decides, not the document ([e8543f4](https://github.com/event4u-app/agent-config/commit/e8543f4f75bdb3bbaa56eb5bc38efb838da87be2))
403
+ * **adr:** add adr_cite_check — evaluate a decision before citing it as a blocker ([1bba5ff](https://github.com/event4u-app/agent-config/commit/1bba5ffb828e269d5cf3a157efbbedac0934ffb2))
404
+ * **decision-revisit-gate:** route lock re-evaluation to the council, not the user ([cafb8a2](https://github.com/event4u-app/agent-config/commit/cafb8a2553f1105ef1d90e4f62068fc84f5f07c9))
405
+ * **generate-tools:** say what writing the project layer costs ([7fbfe02](https://github.com/event4u-app/agent-config/commit/7fbfe02c38b39149cc2d4c040888e1e7a7ecbd60))
406
+ * **gates:** add check_single_delivery, and it finds a third duplicated type ([e666899](https://github.com/event4u-app/agent-config/commit/e6668993f2270a27992d0d51ab6a05d8ddbdd248))
407
+ * **install:** make the scope guard report what a same-version duplicate costs ([4db44f1](https://github.com/event4u-app/agent-config/commit/4db44f182ca898da17a73ba48c5a87e13a87a16f))
408
+ * **roadmap:** a runnable-work precondition and a blocked terminal outcome ([f14a287](https://github.com/event4u-app/agent-config/commit/f14a28735059ec5ba604a019a6d53ee227e494d0))
409
+ * **memory:** stamp the curated store and run the ladder once ([803a392](https://github.com/event4u-app/agent-config/commit/803a3921947e8b41bb0d312756e47a981facdd7c))
410
+ * **memory:** three instruments for the curated store — pointers, duplicates, eviction ([4b00f6f](https://github.com/event4u-app/agent-config/commit/4b00f6f62dd68edcf9c293bc7d7ad0dd1f22ee02))
411
+
412
+ ### Bug Fixes
413
+
414
+ * **adr:** respond to the R2 review — five confirmed, one refuted ([6ebae09](https://github.com/event4u-app/agent-config/commit/6ebae092658839b4d1103ae8536817a704be2c15))
415
+ * **hooks:** clear the state on blocked, and stop deleting a legacy file nobody adopted ([5fd366f](https://github.com/event4u-app/agent-config/commit/5fd366f83276e7726d3338ca24cbb7814df17f46))
416
+ * **size-budget:** move the overlap notice out of condense.ts entirely ([2de07e2](https://github.com/event4u-app/agent-config/commit/2de07e2fd672e428d173794f0f36f398f125424a))
417
+ * **hooks:** give run-continuation the blocked terminal, and repair four state defects ([3245188](https://github.com/event4u-app/agent-config/commit/32451887c0db1df9c22b4cf2841e1ca985e71570))
418
+ * **gates:** close the remaining R2 findings, with a test that discriminates ([4510f6d](https://github.com/event4u-app/agent-config/commit/4510f6daee89ae3dcc5344730a3779a0a6bb5d72))
419
+ * **gates:** repair the three high R2 findings in this branch's own work ([406cb22](https://github.com/event4u-app/agent-config/commit/406cb22a0a3c512abdfea9e3bfbab6c3b7db50a6))
420
+ * **hooks:** key the run state on the roadmap, and stop one absence from reclaiming a budget ([084b5c3](https://github.com/event4u-app/agent-config/commit/084b5c3002f45e43f21b34912e1abaac87dc97bc))
421
+ * **hooks,register:** close all seven round-6 findings ([61e6910](https://github.com/event4u-app/agent-config/commit/61e69100f9dc564f301454e7368b5506c3e2d457))
422
+ * **hooks,register:** close all eleven round-5 findings ([544f0fb](https://github.com/event4u-app/agent-config/commit/544f0fba55b3580a54234ccd0f8dd2592cdfead1))
423
+ * **memory:** drop the retired-path literal from the pointer-report docstring ([ac2b338](https://github.com/event4u-app/agent-config/commit/ac2b33869eef14bfce2d73900984261e1a8c560f))
424
+ * **hooks,register:** stop the fallback from masking an archival, and name the file read ([a01b5a0](https://github.com/event4u-app/agent-config/commit/a01b5a0bcb2761b953871c57fc728e4fe027f4d3))
425
+ * **hooks,register:** resolve the run against the session tree, and walk up to it ([5fa347a](https://github.com/event4u-app/agent-config/commit/5fa347a5ae9496eb0b4876ffd0e93361f03048ef))
426
+ * **memory:** strip a raw NUL byte from the pointer report and unbreak two cf04 citations ([dd2f09e](https://github.com/event4u-app/agent-config/commit/dd2f09e4eefeca54c0ce22671b526bfe81f006ef))
427
+ * **hooks:** close the five round-3 findings that are not the two-tree decision ([2c73756](https://github.com/event4u-app/agent-config/commit/2c73756b04fcf3003630fb38a66022567e163c79))
428
+ * **memory:** satisfy noUncheckedIndexedAccess in the three new scripts and their tests ([d6f9cc7](https://github.com/event4u-app/agent-config/commit/d6f9cc715d55ebbab2ebc09762c7136d1e4def78))
429
+ * **hooks:** make a degraded session-root resolution readable, and correct the discriminator prose ([7db8896](https://github.com/event4u-app/agent-config/commit/7db889696374c2c9f8d001d5b905d262f1e6cecf))
430
+ * **capsule,roadmaps:** answer the R2 findings ([cda1a53](https://github.com/event4u-app/agent-config/commit/cda1a53cb9e30a547d2beeadeafbc198649a6914))
431
+ * **roadmap:** reopen the acceptance criterion its own text asked to reopen ([4822ff6](https://github.com/event4u-app/agent-config/commit/4822ff6a6c8ba89253ca108e6a9809f1daf1eb3a))
432
+ * **hooks:** derive the two-tree provenance from the session tree, not the reader ([19001b7](https://github.com/event4u-app/agent-config/commit/19001b759a4762c5520d68e588cd5c3b133bb7eb))
433
+ * **capsule:** enforce the path-ref shape do_not_touch already claimed ([2ca6fc6](https://github.com/event4u-app/agent-config/commit/2ca6fc66640b999546097aa003ad779f94f55885))
434
+
435
+ ### Documentation
436
+
437
+ * **review:** re-bind round 9 after the base merge ([f17a613](https://github.com/event4u-app/agent-config/commit/f17a6130db8f898b6ed710534945ea340d65d0c7))
438
+ * **review:** close round 9's seven findings against their fixes ([6b8d007](https://github.com/event4u-app/agent-config/commit/6b8d0071587069c64fe15a9fafd44139b8455314))
439
+ * **ratchet:** reconcile the open_blockers row instead of asserting it ([11c5aef](https://github.com/event4u-app/agent-config/commit/11c5aeffadeb8dd12a94ccf644593bbbea432972))
440
+ * **review:** record round 9 findings before their fixes ([243c547](https://github.com/event4u-app/agent-config/commit/243c547aafb61dc36a174d5010c16d7112c35214))
441
+ * **review:** re-bind after the size-budget repair ([110d7a6](https://github.com/event4u-app/agent-config/commit/110d7a6eb873049f7e166ade3784ba72c6fc8ff6))
442
+ * **review:** close round 8's eight findings against their fixes ([08fd977](https://github.com/event4u-app/agent-config/commit/08fd977d849f1b1b4a3d6bb864dc33fd1468a3b4))
443
+ * **roadmap:** couple the two blockedness predicates, and stop quoting a count that keeps going stale ([bf72169](https://github.com/event4u-app/agent-config/commit/bf72169cef2bc14257d09afd8da8fdfa8e3a2edf))
444
+ * **review:** re-bind after the evidence-type declaration ([6ec2095](https://github.com/event4u-app/agent-config/commit/6ec209555495e77037e43cffb18da2964c5151b8))
445
+ * **evidence:** declare the census's evidence type ([7f3fd03](https://github.com/event4u-app/agent-config/commit/7f3fd034f383c726f63e8b6db4772bf9f9a1c7f1))
446
+ * **review:** re-bind after the base merge and ADR renumber ([ef2b3c1](https://github.com/event4u-app/agent-config/commit/ef2b3c122eafeeaccadaef92c76f36679d366d57))
447
+ * **review:** re-bind the findings artefact to the current scope ([f9b7be6](https://github.com/event4u-app/agent-config/commit/f9b7be68244566555fa5c52562cd8201f63e2a18))
448
+ * **review:** record round 8 findings before their fixes ([00ea023](https://github.com/event4u-app/agent-config/commit/00ea0239a99feedf87a021710d32e203cb29fc2f))
449
+ * **review:** fill the 17 R2 findings with their dispositions ([f28ffeb](https://github.com/event4u-app/agent-config/commit/f28ffebf23d70a18d91b4d949a164a90d916ccc4))
450
+ * **roadmaps:** correct the backwards CI claim and close four satisfied criteria ([d52c41e](https://github.com/event4u-app/agent-config/commit/d52c41e9c0c90170fbeb2c3b25227b6634a904f5))
451
+ * **review:** record the 17 R2 findings before any repair ([7ca43da](https://github.com/event4u-app/agent-config/commit/7ca43da318805898824dfd8cc44075df9a0f3111))
452
+ * **roadmaps:** halt single-delivery Phase 2 on an unstated precondition ([60671af](https://github.com/event4u-app/agent-config/commit/60671af4ddf3d9f3d05c67d83730f0bbe53f1faf))
453
+ * **adr:** supersede ADR-226 with ADR-235 one-artefact-one-layer ([b96115b](https://github.com/event4u-app/agent-config/commit/b96115bb96d278841b002258997d02de50eb3791))
454
+ * **evidence:** pin the single-delivery census with its projection shape ([4cfe282](https://github.com/event4u-app/agent-config/commit/4cfe282623da421facb2a2184cf76920a3d00bb4))
455
+ * **roadmaps:** adopt road-to-single-delivery from a four-draft inbox reconciliation ([6c743c1](https://github.com/event4u-app/agent-config/commit/6c743c181498ac4e1fac403ea11e9baf62c689f1))
456
+ * **adr:** record the blocked terminal outcome for process-full ([a0bc6af](https://github.com/event4u-app/agent-config/commit/a0bc6af62f9ab0dd7723e26e0860b477e75dba2d))
457
+ * **roadmap:** record the second partial on 0.1 and refute its blocker premise ([1ac0cf0](https://github.com/event4u-app/agent-config/commit/1ac0cf061d4434607862a63176510cb2d5016fbc))
458
+ * **roadmap:** re-review the risk register after the Phase 2 close ([8ecc398](https://github.com/event4u-app/agent-config/commit/8ecc3982001e9773dcb41f73b1e7612633331eba))
459
+ * **roadmap:** close Phase 2 of road-to-context-fidelity ([cf5505d](https://github.com/event4u-app/agent-config/commit/cf5505db4e72495e4f8276d20ae83908e564738c))
460
+ * **memory:** ADR-234 plus the honest null on pointer liveness ([93c30da](https://github.com/event4u-app/agent-config/commit/93c30dab88a7bef4f70d414899fa3b383f61307b))
461
+ * **roadmap:** record the live event that refuted the provenance fields ([03360b2](https://github.com/event4u-app/agent-config/commit/03360b28c7dfb66f2d820dcc5bd35716b8c730be))
462
+ * **review:** unwrap the verification table the findings parser reads as rows ([244ba2c](https://github.com/event4u-app/agent-config/commit/244ba2c3257f3f39fda533667246a7843b9906ef))
463
+ * **review:** declare the completion-review skip for a no-code-surface change ([a306f7e](https://github.com/event4u-app/agent-config/commit/a306f7e2a45091d8de709accff1e8e9888bfbe3f))
464
+ * **roadmaps:** regenerate the dashboard for the resumed roadmap ([9fb938a](https://github.com/event4u-app/agent-config/commit/9fb938a9b100f57b74ef5a6556e53827888c6be9))
465
+ * **roadmaps:** resume request-scoped-rule-load out of later/ on a satisfied condition ([abab942](https://github.com/event4u-app/agent-config/commit/abab94288b3d6e981ed471e967a9207b6a5ed2df))
466
+
467
+ ### Chores
468
+
469
+ * **router:** regenerate router.json for the new decision-revisit-gate triggers ([6e05281](https://github.com/event4u-app/agent-config/commit/6e05281b1eada88d00d3e749e0295d399760ce92))
470
+ * **roadmaps:** archive road-to-adr-revisit-governance, fully closed ([9e0a331](https://github.com/event4u-app/agent-config/commit/9e0a331e19402e92b4ee3d6b944a1db0aa7aa8ac))
471
+ * **roadmap:** park run-continuation-observation, its open work is gated on a run the estate cannot supply ([42e8c05](https://github.com/event4u-app/agent-config/commit/42e8c056aceb9953e45d6e572e8d28f43f0a8a6c))
472
+ * **regen:** regenerate derived outputs after the base merge and ADR renumber ([c69068e](https://github.com/event4u-app/agent-config/commit/c69068ed1d4a89edafb8553a5ec135a0bb2cbdd1))
473
+ * **review:** close round 7 — 55 findings over seven rounds, six of seven highs in the previous round ([c1bb91d](https://github.com/event4u-app/agent-config/commit/c1bb91d8587bda81051251ad1329b6cf72e9e6e6))
474
+ * **roadmaps:** regenerate the dashboard after the second base merge ([5586c26](https://github.com/event4u-app/agent-config/commit/5586c26124e488badc93e0db856ad54f08753c32))
475
+ * **review:** record round 7 findings before their fixes — two high, both in round 6 ([1d420fe](https://github.com/event4u-app/agent-config/commit/1d420fe9f9c6c85b80c79d74de6709ea0f025196))
476
+ * **review:** archive round 6 and bind round 7 on the maintainer call ([c97dcfd](https://github.com/event4u-app/agent-config/commit/c97dcfd37c7b40bb8cfb025b7f12bccd46c090cf))
477
+ * **review:** close round 6 and state where the loop stopped ([4f49346](https://github.com/event4u-app/agent-config/commit/4f493467a502614abc001ccec8d10abbc2a0a3f2))
478
+ * **review:** record round 6 findings before their fixes ([3ef7320](https://github.com/event4u-app/agent-config/commit/3ef7320699e45932a64ce89827c0e0af8f516897))
479
+ * **review:** archive round 5 and bind round 6 ([d320319](https://github.com/event4u-app/agent-config/commit/d320319f4e21f5969d461bb99a7d583a056a5e17))
480
+ * **ratchet:** walk open_blockers 71 -> 70 after resolving memory-sweep-instrument ([7d5114d](https://github.com/event4u-app/agent-config/commit/7d5114dbd4ef3340e992717921eb6b919165136a))
481
+ * **review:** record round 5 findings before their fixes — eleven, two high ([cc62940](https://github.com/event4u-app/agent-config/commit/cc62940004d811c5927381de00fef6aced7d3ded))
482
+ * **review:** archive round 4 and bind round 5 to the fixed head ([578d021](https://github.com/event4u-app/agent-config/commit/578d02189621c62f304eb5780068d2ff22cf32ba))
483
+ * **roadmap:** regenerate the dashboard after merging origin/main ([b7b0838](https://github.com/event4u-app/agent-config/commit/b7b0838c8cd57e633226f58760e8e57d09269ffe))
484
+ * **review:** record round 4 findings before their fixes ([31e5895](https://github.com/event4u-app/agent-config/commit/31e58953462127e5d07f8fef6819a6ad7717a8ee))
485
+ * **roadmaps:** regenerate the dashboard after merging the un-park ([58ddc41](https://github.com/event4u-app/agent-config/commit/58ddc415b9d7f8e07814926fb1fce90e2a7728c5))
486
+ * **review:** archive round 3 and bind round 4 to the fixed head ([ccac473](https://github.com/event4u-app/agent-config/commit/ccac4736a8fa25cf74a7cd7518fd32ff2407849a))
487
+ * **estate:** walk the ratchet down to the estate this closure earned ([c2d744c](https://github.com/event4u-app/agent-config/commit/c2d744cd50097ad31d320b1513553a032b15eb60))
488
+ * **review:** record round 3 findings before their fixes — two highs ([14b9ddd](https://github.com/event4u-app/agent-config/commit/14b9ddd7dd4f82336d1d29db0d713f4c41bd2d46))
489
+ * **review:** archive round 2 and re-bind the live artefact to the fixed head ([03dc008](https://github.com/event4u-app/agent-config/commit/03dc0080b13d5da2f1448150f73fe6ad0b3f3605))
490
+ * **review:** record round 2 findings before their fixes ([45426cc](https://github.com/event4u-app/agent-config/commit/45426cc59ad5fea501313afcfa5ceb98f6a58651))
491
+ * **review:** close the nine findings and re-type the artefact as historical ([b7ecf02](https://github.com/event4u-app/agent-config/commit/b7ecf0207a049570f62cf24ab12247878cda31a6))
492
+ * **review:** bind the R2 review scope for this branch before the reviewer runs ([34dcdab](https://github.com/event4u-app/agent-config/commit/34dcdab73dae97539882bb78fa9c057045af1b51))
493
+ * **roadmaps:** re-review the lifecycle-integrity risk register for the relocated step ([0bc79b0](https://github.com/event4u-app/agent-config/commit/0bc79b09bae0c025ea54920616c195667e0c76a2))
494
+ * **ratchet:** record the un-park in the estate baseline ([4254a87](https://github.com/event4u-app/agent-config/commit/4254a87628912fcc8439e714c204d7281f0cfd41))
495
+ * **roadmaps:** regenerate the dashboard after merging origin/main ([411bb74](https://github.com/event4u-app/agent-config/commit/411bb74164e1bc70f43b7fc4c651ade784e91394))
496
+ * **roadmaps:** archive dispatch-safety, its last step closed ([5b25cbe](https://github.com/event4u-app/agent-config/commit/5b25cbee9ebfe4eb00ea76c3290db03fdfe598a0))
497
+ * **review:** record the R2 findings before their fixes ([da6f4a7](https://github.com/event4u-app/agent-config/commit/da6f4a70eb965f1fdc287daa91e20bef84666c88))
498
+ * **roadmaps:** close dispatch-safety 3.4 and relocate the guard intact ([4ca5ebd](https://github.com/event4u-app/agent-config/commit/4ca5ebd66bdec0d08531dfc073dcff4039bd84cf))
499
+
500
+ ### Other
501
+
502
+ * **adr-revisit-governance:** re-bind to the router-regen scope ([7c248f2](https://github.com/event4u-app/agent-config/commit/7c248f2e975fea9e1be836edcc8cd8916aa5a116))
503
+ * **adr-revisit-governance:** re-bind after the base merge, commit the input package ([921df0c](https://github.com/event4u-app/agent-config/commit/921df0c03291accccb458e941224ee67f3a1007a))
504
+ * **adr-revisit-governance:** re-bind the R2 artefact to the post-fix scope ([330ece6](https://github.com/event4u-app/agent-config/commit/330ece6332c861d4a2152f2d50ff5fe53b44a453))
505
+ * **adr-revisit-governance:** R2 completion-review findings, before any fix ([3389935](https://github.com/event4u-app/agent-config/commit/3389935977f182961f32ddb9f90e89eaf8d4db04))
506
+ * **dispatch-safety-do-not-touch:** re-bind all three anchors after the second merge ([91653ad](https://github.com/event4u-app/agent-config/commit/91653ad11107eaa7572943a53b3d0e9532fe222c))
507
+ * **dispatch-safety-do-not-touch:** carry the roadmap hash through the re-bind too ([43ed4d7](https://github.com/event4u-app/agent-config/commit/43ed4d76aab920f3dbc23dc6fdcba06e6594fb48))
508
+ * **dispatch-safety-do-not-touch:** re-bind after merging the un-park ([2528af7](https://github.com/event4u-app/agent-config/commit/2528af7356264a53b08303eb8f857cd589acdc30))
509
+ * **dispatch-safety-do-not-touch:** re-bind after the ratchet walk-down ([ed2caa5](https://github.com/event4u-app/agent-config/commit/ed2caa5f2e75446a241dc7fd14f58d725262977a))
510
+ * **dispatch-safety-do-not-touch:** dispose the findings and re-bind ([c87d86c](https://github.com/event4u-app/agent-config/commit/c87d86cea2cad02fa38589c74d1bf0b8962642bf))
511
+ * **dispatch-safety-do-not-touch:** the R2 findings, before any fix ([ac03a25](https://github.com/event4u-app/agent-config/commit/ac03a257c4b5cdcd64f742d5d637f0ec9e4ba105))
512
+
513
+ Tests: 15397 (+125 since 14.5.0)
514
+
387
515
  ## [14.5.0](https://github.com/event4u-app/agent-config/compare/14.4.0...14.5.0) (2026-08-19)
388
516
 
389
517
  ### Release highlights
@@ -93,6 +93,13 @@ suggest deferring or strengthening evidence before proposing.
93
93
  ### Rules
94
94
 
95
95
  - Do NOT commit, push, or open a PR.
96
+ - Do NOT report an ADR as still binding without evaluating it first —
97
+ `./scripts-run src/scripts/adr_cite_check <ADR-NNN>` resolves status,
98
+ `review_trigger` state, amendments, successors, and back-references in one
99
+ call. A `superseded` / `deprecated` ADR is not a live decision
100
+ to audit, and an amended one is not the text its body's top half claims.
101
+ (`rejected` is NOT in that set — on an ADR it records a rejected *proposal*,
102
+ so the rejection is the live decision.)
96
103
  - Do NOT auto-promote — `/memory propose` is the intake.
97
104
  - Do NOT re-litigate a decision confirmed still valid — acknowledge it,
98
105
  note the validation date, stop.
@@ -166,6 +166,16 @@ Hard rules for this step:
166
166
  and its recorded revisit-conditions first; if it truly blocks, the
167
167
  only flip path offered is option 3 (council re-eval) — "Flip" is not
168
168
  offered for locks.
169
+ - **An ADR lock is evaluated before it is reported.** When the lock is a
170
+ numbered ADR, the FIRST action is
171
+ `./scripts-run src/scripts/adr_cite_check <ADR-NNN>` — not "report the
172
+ lock". A `superseded` / `deprecated` status means there is no
173
+ live lock to route at all, and an amended ADR means the cited text may not
174
+ be the operative one. `rejected` stays live — it records a rejected
175
+ *proposal*, so reopening it means showing the premise it rejected on has
176
+ changed. Reporting an unevaluated ADR as a blocker is the
177
+ ordering defect `decision-revisit-gate` exists over: it costs the owner a
178
+ turn to discover what one command answers.
169
179
  - **Session budget:** at most 5 interview questions by default
170
180
  (`--max-questions=N` to override). Budget exhausted → remaining
171
181
  candidates go to Step 4 as "further candidates".
@@ -46,10 +46,15 @@ with the **scope delta below**.
46
46
  - **Working set:** every open step across every phase, in document
47
47
  order. Phase-internal annotations like `(deferred)` / `(optional)` /
48
48
  "gated on Phase N" do not narrow the working set.
49
- - **Stop after:** the entire roadmap reaches `count_open == 0`, or a
50
- halt condition fires (Hard-Floor, council-off + ambiguity — the
51
- latter only outside an accepted contract with council available,
49
+ - **Stop after:** the entire roadmap reaches `count_open == 0`
50
+ (`complete`), or the runnable set is empty with steps still open
51
+ (`blocked` — see the terminal-outcomes section below), or a halt
52
+ condition fires (Hard-Floor, council-off + ambiguity — the latter only
53
+ outside an accepted contract with council available,
52
54
  security-sensitive, scope-out-of-roadmap, test/quality red).
55
+ - **Do not start** when NO open step is runnable: that is
56
+ `blocked-preflight`, and it creates no branch and takes no grant. The
57
+ runnable test is § 3c of the loop.
53
58
  - **Phase boundary handling:** at every phase boundary, run the
54
59
  per-phase quality pipeline when `quality_cadence: per_phase` (or
55
60
  `per_step`) AND `quality.local_auto_run: true` — under the default
@@ -91,6 +96,8 @@ FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
91
96
  · "avoid a PR pile-up" / "let the open PRs merge first"
92
97
  · "this phase is large / touches a deep subsystem"
93
98
  · "phase-checkpoints mode, so I'll checkpoint and wait"
99
+ · "this step looks human-gated" — `blocked` is reached by the § 3c
100
+ runnable test over PRE-EXISTING blockers, never by how a step feels
94
101
  · any agent-invented caution not in the five halt conditions above.
95
102
  INVENTING A HALT REASON IS A VIOLATION OF THE COMMAND AND THE USER'S WILL.
96
103
  IF CONTEXT RUNS OUT MID-RUN, KEEP LANDING COMPLETE STEPS UNTIL IT DOES —
@@ -110,6 +117,41 @@ roadmap carries such phrasing — whether by legacy or by an opt-in
110
117
  setting — treat it as ordinary prose during execution, never as a
111
118
  gate. Phase ordering and explicit dependency gates govern the loop.
112
119
 
120
+ ## Terminal outcomes — and why `blocked` is not a sixth halt
121
+
122
+ The five halt conditions answer *"what interrupts runnable work"*. They never
123
+ answered *"what does the run report when no runnable work is left and the roadmap
124
+ is not finished"*, and the omission was not academic: measured 2026-08-19 across
125
+ the twelve most nearly complete roadmaps in the estate, **zero** could reach
126
+ `count_open == 0` in one PR — every remaining open step needed a human action, a
127
+ repo-admin setting, a paid authorisation, an absent binary, or an elapsed soak
128
+ window. Under the contract as written, such a roadmap had no legal stopping point,
129
+ so the command could be neither obeyed nor honestly declined.
130
+
131
+ | Outcome | When | Success? |
132
+ |---|---|---|
133
+ | `complete` | `count_open == 0` | yes — archival check runs |
134
+ | `blocked` | `count_open > 0` and no open step is runnable per § 3c | **no** — partial progress, labelled as such |
135
+ | `blocked-preflight` | no open step was runnable before the run started | **no** — nothing was attempted; no branch |
136
+ | a halt | one of the five conditions fired | **no** — the halt is reported |
137
+
138
+ ```
139
+ `blocked` IS NEVER REPORTED AS COMPLETION. count_open STAYS > 0.
140
+ NEVER FLIP A BOX TO [~] TO REACH IT — THAT LAUNDERS OPEN WORK THROUGH A GLYPH.
141
+ A PR OPENED ON A BLOCKED RUN SAYS PARTIAL PROGRESS IN ITS FIRST LINE.
142
+ REVALIDATE THE RUNNABLE SET BEFORE REPORTING IT. ONE RUNNABLE STEP REJECTS THE CLAIM.
143
+ ```
144
+
145
+ **It is a terminal outcome, not a halt, and the distinction is the safety
146
+ property.** The Iron Law above and its forbidden list hold their full authority
147
+ over mid-run stopping: an agent that may not stop for "this phase is large" may
148
+ equally not stop for "this step looks human-gated". Runnability is decided by the
149
+ § 3c test over blockers that **pre-date the run** — a citation the run wrote
150
+ itself buys nothing. AI council 2026-08-19, 2/2 convergent on exactly this
151
+ separation.
152
+
153
+ Recorded in [`ADR-235`](../../../../docs/decisions/ADR-235-process-full-blocked-terminal-outcome.md).
154
+
113
155
  ## Iron Law — Real-time dashboard
114
156
 
115
157
  ```
@@ -180,6 +180,83 @@ change in § 3a.
180
180
  `commit-policy` § NEVER ask about committing holds regardless of
181
181
  autonomy).
182
182
 
183
+ ### 3c. Runnable-work precondition — refuse a run with nothing to do
184
+
185
+ ```
186
+ A RUN WITH NO RUNNABLE OPEN STEP DOES NOT START.
187
+ NAME THE BLOCKERS. CREATE NO BRANCH. WRITE NOTHING.
188
+ THIS IS A PRECONDITION, NEVER A HALT — IT CANNOT FIRE MID-RUN.
189
+ ```
190
+
191
+ Run once, at the end of the pre-scan, before any grant is exercised.
192
+
193
+ **Runnable** is decided from the roadmap's own `## Blockers` section and nothing
194
+ else. An open step is **not** runnable when a blocker satisfies all four:
195
+
196
+ 1. it exists in `## Blockers` **before this run started** — a blocker the run
197
+ itself authored does not count (see the gaming note below);
198
+ 2. its `Class:` is `2` (consent-once) or `3` (human-only) — classes `0` and `1`
199
+ are agent-runnable by construction and carry a `Run:` the agent executes,
200
+ per [`templates/roadmaps.md`](../../templates/roadmaps.md);
201
+ 3. its `Blocks:` field names this step, by phase-and-step identifier or by a
202
+ phase whose scope contains it;
203
+ 4. it names what would clear it.
204
+
205
+ Every other open step is runnable. **No blocker citation → runnable**, and the
206
+ default direction is deliberate: the failure this precondition must not have is
207
+ refusing work an agent could have done.
208
+
209
+ - **At least one runnable open step** → the run proceeds. It does *not* matter
210
+ how many steps are blocked; the blocked ones are skipped in place (never
211
+ flipped — see the terminal-outcomes section), and the run works the rest.
212
+ - **Zero runnable open steps** → `blocked-preflight`. Report the roadmap, the
213
+ open-step count, and each blocker with its class and its clearing action.
214
+ Create no branch, write no state, take no grant.
215
+
216
+ **A step this precondition judges non-runnable carries a `blocked-by:` marker on
217
+ its own line.** The obligation is here because two mechanisms read blockedness
218
+ from two different places and only one of them reads this section: `run-continuation`,
219
+ the stop-slot concern that re-engages an autonomous run, decides open-vs-blocked
220
+ from the inline `<!-- blocked-by: <id> -->` marker and never parses `## Blockers`
221
+ at all. Without the marker a step that IS blocked per the four conditions above
222
+ still counts as open work to the concern, which re-engages the agent into it every
223
+ stop fire until the stall rung fires — the mechanism whose job is to detect a
224
+ stall manufacturing one, which is the failure shape this file already records once
225
+ for the roadmap-root split.
226
+
227
+ Round 8 finding 7 caught the two predicates as disjoint. The fix is this coupling
228
+ sentence rather than teaching the concern to parse `## Blockers`: a second
229
+ implementation of the four conditions is a second thing to keep in step, and the
230
+ one-line marker is checkable by eye at the step it belongs to. **The residual is
231
+ real and is not papered over:** nothing enforces the pairing, so a `## Blockers`
232
+ entry authored without its marker is caught by review or not at all.
233
+
234
+ **Why a precondition and not a sixth halt.** The five halt conditions interrupt
235
+ work that is still runnable; this decides whether any runnable work exists at
236
+ all. Keeping them structurally separate is what preserves the forbidden-list's
237
+ authority over mid-run stopping — an agent that may not stop for "this phase is
238
+ large" also may not stop for "this feels human-gated". AI council 2026-08-19,
239
+ 2/2 convergent, explicitly on this point: *"keep this structurally separate from
240
+ 'five, and only five': the five are exceptional halts; `blocked` is an
241
+ exhaustion-of-runnable-work terminal outcome."*
242
+
243
+ **The gaming vector, named because it is the one thing that would make this
244
+ worse than the gap it closes.** An agent meets a hard step, writes a `## Blockers`
245
+ entry claiming Class 3, cites it, and stops — a comfort-stop wearing a citation.
246
+ Condition 1 is the whole defence: a blocker must pre-date the run, which is
247
+ checkable from git rather than from the agent's word. A blocker discovered
248
+ mid-run is recorded (that is honest and useful) and does **not** make the step
249
+ non-runnable in this run.
250
+
251
+ **One imprecision, recorded rather than smoothed over.** The class taxonomy has
252
+ four rows and none of them says *"waiting on time"* or *"waiting on another
253
+ roadmap"*. A soak window and a cross-roadmap dependency are authored as `3`
254
+ today, because absence of `Class:` already means `3` — so they are decidable but
255
+ mislabelled as human-only. A fifth class is a taxonomy change with a linter
256
+ behind it (`lint_roadmap_blockers`) and is not made here.
257
+ *Revisit-if:* a run is refused on a blocker whose real content is "wait", and
258
+ the report reads wrong to the person holding it.
259
+
183
260
  ## 4. Resolve cadences — read once, cache for the run
184
261
 
185
262
  Read both keys from `.agent-settings.yml` once and cache for the whole
@@ -430,6 +507,52 @@ artifact drafting, council enablement), not safety.
430
507
 
431
508
  On halt: stop, surface state, do **not** auto-fix outside the failing step.
432
509
 
510
+ ### Terminal outcomes — `complete`, `blocked`, or a halt
511
+
512
+ The halt list above answers *"what interrupts runnable work"*. It does not answer
513
+ *"what does the run report when there is no runnable work left and the roadmap is
514
+ not finished"*, and until this section there was no answer: the wrapper's stop
515
+ condition was `count_open == 0` or a halt, so a roadmap whose remaining steps all
516
+ need a human had **no legal stopping point**.
517
+
518
+ That is not a hypothetical. Measured 2026-08-19 across the twelve most nearly
519
+ complete roadmaps in the estate: **zero** could reach `count_open == 0` in one
520
+ PR. Every remaining open step needed a human action — flip branch protection,
521
+ delete committed evidence, authorise paid spend, install an absent binary, wait
522
+ out a soak window, use the maintainer's own machine, or edit a file an armed host
523
+ hook denies.
524
+
525
+ Three outcomes, and only one of them is success:
526
+
527
+ | Outcome | When | What it reports |
528
+ |---|---|---|
529
+ | `complete` | `count_open == 0` | the roadmap is finished; archival check runs (§ 6) |
530
+ | `blocked` | `count_open > 0` **and** no open step is runnable | the work that DID close, plus every blocker with its clearing action |
531
+ | a halt | one of the five conditions above fired | the halt, its evidence, and what remains |
532
+
533
+ ```
534
+ `blocked` IS NEVER PRESENTED AS COMPLETION.
535
+ count_open STAYS > 0. NO CHECKBOX IS FLIPPED TO [~] TO REACH IT.
536
+ A PR OPENED ON A BLOCKED RUN IS LABELLED PARTIAL PROGRESS.
537
+ REVALIDATE IMMEDIATELY BEFORE REPORTING IT — ONE RUNNABLE STEP LEFT REJECTS THE CLAIM.
538
+ ```
539
+
540
+ The `[~]` prohibition is load-bearing and was the one point the council split on.
541
+ Deferring a blocked step to `[~]` would let the run reach `count_open == 0` and
542
+ report completion — laundering unfinished work through a glyph, which is exactly
543
+ what Iron Law 3 of [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md)
544
+ exists to catch on the archival side. So the boxes stay open and the outcome
545
+ carries the truth instead.
546
+
547
+ Revalidation is the second half of the same discipline: the runnable set is
548
+ recomputed at the moment of reporting, because steps unblock during a run (a
549
+ prerequisite closes, a `Run:` succeeds, a peer merges). If any open step is
550
+ runnable, `blocked` is refused and the loop continues.
551
+
552
+ **Runnability is decided by the § 3c test**, unchanged — the same four conditions,
553
+ including that a qualifying blocker must pre-date the run. A blocker the run
554
+ authored is recorded and does not make a step non-runnable in that run.
555
+
433
556
  ### Forbidden non-halt reasons — agent-invented cautions
434
557
 
435
558
  The halt list above is **exhaustive**. An agent running `process-full` (or any
@@ -446,9 +569,15 @@ a violation of the command and the user's will:
446
569
  a phase boundary emits a non-blocking status line and the run **continues**;
447
570
  the stop-and-wait reading of `phase-checkpoints` applies only to
448
571
  `process-phase`.
572
+ - **"this step looks human-gated"** — the `blocked` outcome above is reached by
573
+ the § 3c test over blockers that pre-date the run, never by a judgement about
574
+ how a step feels. A step with no qualifying blocker citation is runnable, and
575
+ writing the citation yourself does not make it one. This entry exists because
576
+ the terminal outcome is the single most abusable thing on this page.
449
577
 
450
578
  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.
579
+ halt conditions fired, or because the runnable set is empty by the § 3c test —
580
+ surface THAT, with the blockers named, not a manufactured caution.
452
581
 
453
582
  ### Non-halt — gating notes, "optional" tags
454
583
 
@@ -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,24 +34,99 @@ 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
 
51
132
  - [`decision-review`](../skills/decision-review/SKILL.md) — the backward-audit
@@ -53,10 +134,30 @@ Trigger-set above activates this routing on demand, independent of the disciplin
53
134
  - [`ai-council`](../skills/ai-council/SKILL.md) — the re-evaluation mechanism;
54
135
  owns the convergence-summary scope + `revisit-if` contract.
55
136
  - [`decision-record`](../skills/decision-record/SKILL.md) — forward-flow decision
56
- locking; the escalation litmus there names the reopening condition up front.
137
+ 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.)
57
142
  - [`token-budget-discipline`](token-budget-discipline.md) — the frugality-canon
58
143
  value-over-budget escalation this rule's budget-lock case defers to.
59
144
  - [`no-cheap-questions`](no-cheap-questions.md) — the question-quality floor a
60
145
  revisit-offer must still clear.
61
146
  - [`ask-when-uncertain`](ask-when-uncertain.md) — the numbered-options shape
62
147
  used to present the revisit offer.
148
+
149
+ ## Honest enforcement — `enforced_by: none`
150
+
151
+ `adr_cite_check` is deterministic where it runs, and nothing makes it run. No
152
+ gate can observe an agent citing a decision it never opened, so step 2 above is
153
+ model-carried — the same honesty boundary
154
+ [`security-sensitive-stop`](security-sensitive-stop.md) and
155
+ [`active-remediation`](active-remediation.md) state for their own obligations.
156
+
157
+ Two reach limits, named rather than implied. The tool lives in this repository's
158
+ `src/scripts/` and is **not** exposed as an `agent-config` verb, so a consumer
159
+ install performs step 2 by hand; wiring the verb touches six further surfaces
160
+ plus the curated `dist/agent-src/scripts/` list and is deliberately out of this
161
+ change. And `docs/decisions/` is projected into no agent-visible tree at all —
162
+ the agent sees ADR *numbers* cited across rules and skills, almost never ADR
163
+ *text*. Until that changes, "evaluate before citing" means opening the file.