@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +128 -0
- package/dist/agent-src/commands/analyze/decision.md +7 -0
- package/dist/agent-src/commands/optimize/project.md +10 -0
- package/dist/agent-src/commands/roadmap/process-full.md +45 -3
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +130 -1
- package/dist/agent-src/rules/decision-revisit-gate.md +108 -7
- package/dist/agent-src/skills/adr-create/SKILL.md +25 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +18 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/cli-delegate/{chunk-ZPSXJTLI.js → chunk-P6LQDIWK.js} +15 -1
- package/dist/cli-delegate/cmd_conformance.js +1 -1
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +8 -8
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +334 -77
- package/dist/mcp/registry-manifest.json +2 -2
- package/dist/mcp/server.json +2 -2
- package/dist/router.json +1 -1
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +49 -0
- package/package.json +1 -1
- package/src/config/estate-count-budget.json +29 -1
- package/src/config/pack-size-budget.json +3 -2
- package/src/scripts/_lib/layer_overlap_notice.ts +85 -0
- package/src/scripts/_lib/scope_guard.sh +62 -3
- package/src/scripts/_lib/subagent_capsule.ts +81 -1
- package/src/scripts/adr/regenerate_index.ts +13 -2
- package/src/scripts/adr_cite_check.ts +424 -0
- package/src/scripts/check_adr_frontmatter.ts +187 -1
- package/src/scripts/check_single_delivery.ts +473 -0
- package/src/scripts/hooks/run_continuation_hook.ts +884 -68
- package/src/scripts/install.sh +12 -2
- package/src/scripts/memory_consolidation.ts +189 -0
- package/src/scripts/memory_eviction.ts +384 -0
- package/src/scripts/report_layer_overlap.ts +72 -0
- package/src/scripts/report_memory_pointers.ts +622 -0
- 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.
|
|
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
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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;
|
|
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.
|