@event4u/agent-config 14.17.0 → 14.18.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 (74) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +170 -79
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/pr/merge.md +35 -44
  7. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +2 -0
  8. package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +27 -1
  9. package/dist/agent-src/skills/code-intelligence/SKILL.md +60 -12
  10. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +27 -0
  11. package/dist/agent-src/skills/design-review/SKILL.md +2 -0
  12. package/dist/agent-src/skills/feature-planning/SKILL.md +34 -0
  13. package/dist/agent-src/skills/git-workflow/SKILL.md +37 -12
  14. package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +176 -0
  15. package/dist/agent-src/skills/laravel-mail/SKILL.md +44 -0
  16. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +40 -0
  17. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +12 -0
  18. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +53 -8
  19. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +3 -1
  20. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  21. package/dist/cli-delegate/cmd_conformance.js +335 -659
  22. package/dist/discovery/deprecation-report.md +1 -1
  23. package/dist/discovery/discovery-manifest.json +15 -15
  24. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  25. package/dist/discovery/discovery-manifest.summary.md +1 -1
  26. package/dist/discovery/dormancy-report.md +1 -1
  27. package/dist/discovery/orphan-report.md +1 -1
  28. package/dist/discovery/packs.json +2 -2
  29. package/dist/discovery/trust-report.md +1 -1
  30. package/dist/discovery/workspaces.json +2 -2
  31. package/dist/hooks/dispatch.js +959 -1304
  32. package/dist/mcp/registry-manifest.json +2 -2
  33. package/dist/mcp/server.json +2 -2
  34. package/dist/mcp/server.mjs +671 -1002
  35. package/dist/shared/settingsConsent.js +1 -1
  36. package/package.json +1 -1
  37. package/src/config/conformance-claim-baseline.json +9 -0
  38. package/src/config/gate-violation-baselines.json +3 -3
  39. package/src/config/release-gate-locality.yml +129 -0
  40. package/src/scripts/_lib/release_highlights.ts +172 -1
  41. package/src/scripts/_lib/release_material.ts +66 -0
  42. package/src/scripts/_lib/repeated_run.ts +77 -0
  43. package/src/scripts/_lib/tamper_vocabulary.ts +242 -0
  44. package/src/scripts/_lib/unified_diff.ts +121 -0
  45. package/src/scripts/check_finding_dispositions.ts +179 -3
  46. package/src/scripts/check_installed_hooks_fresh.ts +381 -0
  47. package/src/scripts/check_release_highlights.ts +25 -13
  48. package/src/scripts/check_suppression_hygiene.ts +11 -0
  49. package/src/scripts/code_graph/build.ts +230 -33
  50. package/src/scripts/code_graph/extract.ts +168 -33
  51. package/src/scripts/code_graph/types.ts +37 -2
  52. package/src/scripts/code_graph/validate.ts +12 -1
  53. package/src/scripts/conformance_scan.ts +2 -2
  54. package/src/scripts/detect_silent_catch.ts +403 -0
  55. package/src/scripts/detect_verification_tampering.ts +538 -0
  56. package/src/scripts/git_authorization_hook.ts +153 -17
  57. package/src/scripts/hook_manifest.json +1 -1
  58. package/src/scripts/hook_manifest.yaml +33 -19
  59. package/src/scripts/hooks/block_no_verify.ts +3 -3
  60. package/src/scripts/hooks/concern_registry.ts +2 -2
  61. package/src/scripts/hooks/evidence_independence.ts +21 -2
  62. package/src/scripts/hooks/{block_unauthorized_git.ts → git_command_classifier.ts} +25 -369
  63. package/src/scripts/hooks/push_settle_hook.ts +250 -0
  64. package/src/scripts/hooks/ship_diff_volume_hook.ts +1 -1
  65. package/src/scripts/install-hooks.sh +134 -1
  66. package/src/scripts/language_mirror_hook.ts +27 -5
  67. package/src/scripts/release.ts +31 -143
  68. package/src/scripts/release_drill.ts +71 -1
  69. package/src/scripts/release_publication.ts +243 -3
  70. package/src/scripts/release_verify.ts +220 -0
  71. package/src/scripts/schemas/review-findings.schema.json +1 -1
  72. package/src/scripts/schemas/skill.schema.json +11 -1
  73. package/src/scripts/self_review_gate.ts +10 -1
  74. package/src/shared/settingsConsent.ts +1 -1
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "event4u-agent-config",
3
3
  "description": "Governed agent system — skills, rules, commands, and guidelines for AI-assisted development.",
4
- "version": "14.17.0",
4
+ "version": "14.18.0",
5
5
  "owner": {
6
6
  "name": "event4u",
7
7
  "email": "dev@event4u.app"
8
8
  },
9
9
  "metadata": {
10
10
  "description": "A policy-driven execution system that enforces quality, consistency, and developer-like behavior for AI agents.",
11
- "version": "14.17.0"
11
+ "version": "14.18.0"
12
12
  },
13
13
  "plugins": [
14
14
  {
15
15
  "name": "agent-config",
16
16
  "description": "Full governed agent system — rules, skills, commands, guidelines, and runtime tooling.",
17
- "version": "14.17.0",
17
+ "version": "14.18.0",
18
18
  "source": ".",
19
19
  "category": "governance",
20
20
  "tags": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-config",
3
3
  "description": "A governed skill framework for AI agents — runtime execution, tooling, observability, feedback, and lifecycle management with policy-driven quality enforcement.",
4
- "version": "14.17.0",
4
+ "version": "14.18.0",
5
5
  "author": {
6
6
  "name": "event4u",
7
7
  "email": "dev@event4u.app"
@@ -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.17.0",
9
+ "version": "14.18.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/CHANGELOG.md CHANGED
@@ -30,6 +30,37 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
30
30
 
31
31
  ## [Unreleased]
32
32
 
33
+ ### Fixed
34
+
35
+ - **Release gates now refuse before the push, not on the release PR.** 14.17.0
36
+ (PR #1856) failed `check_release_highlights` on a missing
37
+ `> **Governance mix:**` line — an assertion reproducible locally in under two
38
+ seconds, discovered instead after a branch, a pull request and a CI run had
39
+ been spent. It was the second instance of the shape in three releases
40
+ (14.14.0 / PR #1812 was the first, on the curated head), and
41
+ `docs/contracts/CHANGELOG-conventions.md` had **recorded** the gap rather than
42
+ closed it. Three changes: `render_changelog_entry` now emits the response
43
+ block with the measured level and a placeholder sentinel the guards refuse
44
+ (never a finished answer — a generator that discharged a written-answer
45
+ obligation for itself would make it a formality); one predicate
46
+ (`mix_response_blockers`) is read by the CI gate and both local guards, so the
47
+ two sides cannot drift; and the missing `Tests: N` footer joins it as a
48
+ section-level publication blocker, which until now also existed only inside
49
+ `release-validation.yml`.
50
+
51
+ ### Added
52
+
53
+ - **A release-gate locality registry, so the next orphan cannot land silently.**
54
+ `src/config/release-gate-locality.yml` relates every job in
55
+ `release-validation.yml` to the command that reproduces it locally;
56
+ `tests/scripts/release_gate_locality.test.ts` fails when a job has no row, or
57
+ when a row claims a script that is not in the tree, or when a missing local
58
+ command carries no classified `NEEDS_*` reason. `task release:verify` runs the
59
+ reproducible set from that same registry — and `task release` now runs its
60
+ `--cheap` subset itself, before the branch is pushed. Three jobs genuinely
61
+ cannot run pre-PR; the registry names which and why, and a green run prints
62
+ what it did not cover rather than reading as a clearance.
63
+
33
64
  ### Changed
34
65
 
35
66
  - **Docs hygiene — retired stale authoring-source pointers.** 43 stale
@@ -436,113 +467,173 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
436
467
  > keeps the active era under the 250-line drift cap enforced by
437
468
  > `tests/test_changelog_eras.py`.
438
469
 
439
- # Era: 14.17.x — current
470
+ # Era: pre-14.18.0 — archived
471
+
472
+ > All entries before `14.18.0` live in
473
+ > [`docs/archive/CHANGELOG-pre-14.18.0.md`](docs/archive/CHANGELOG-pre-14.18.0.md).
474
+ > The archive is read-only; git tags remain the canonical
475
+ > source for what shipped. Splitting them out of the main file
476
+ > keeps the active era under the 250-line drift cap enforced by
477
+ > `tests/test_changelog_eras.py`.
478
+
479
+ # Era: 14.18.x — current
440
480
 
441
- > Started at `14.17.0`. Full entries live inline below.
481
+ > Started at `14.18.0`. Full entries live inline below.
442
482
  > The drift test caps this era at 250 lines of entry body; growth past
443
- > that forces a new era split (`# Era: 14.18.x`, etc.) — see
483
+ > that forces a new era split (`# Era: 14.19.x`, etc.) — see
444
484
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
445
485
 
446
- ## [14.17.0](https://github.com/event4u-app/agent-config/compare/14.16.0...14.17.0) (2026-09-05)
486
+ ## [14.18.0](https://github.com/event4u-app/agent-config/compare/14.17.0...14.18.0) (2026-09-06)
447
487
 
448
488
  ### Release highlights
449
489
 
450
- - **Behaviour changes:** the corpus is held — the wave that proved it, preserved (removes src/skills/ai-council/evals/triggers.json, src/skills/dependency-upgrade/evals/triggers.json, src/skills/judge-bug-hunter/evals/triggers.json, src/skills/judge-code-quality/evals/triggers.json, src/skills/judge-security-auditor/evals/triggers.json, src/skills/judge-test-coverage/evals/triggers.json, src/skills/quality-tools/evals/triggers.json, src/skills/recursive-verification/evals/triggers.json, src/skills/requesting-code-review/evals/triggers.json, src/skills/review-routing/evals/triggers.json, src/skills/rtk-output-filtering/evals/triggers.json, src/skills/sql-writing/evals/triggers.json, src/skills/subagent-orchestration/evals/triggers.json, src/skills/using-git-worktrees/evals/triggers.json) (a502114); hold commit-conventions at its stub ceiling (1ebf5ac); measured house commit convention outranks the shipped default (7651c88).
451
- - **Default changes + migration:** measured house commit convention outranks the shipped default (7651c88).
452
- - **Security and correctness:** anchor_coverage_gaps honours the dated-measurement marker (3df2156); re-derive the two description-dependent pins (fc1d6f4); no check may report passed on input it cannot see (3ad7d26).
453
- - **Honest nulls:** _none_
490
+ - **Behaviour changes:** say that a finding id is a finding id, not a commit SHA (d6ca2b7); bump skill.schema.json to 1.1.0 for the added enforced_by key (ab87d6a); a standard-conformance claim names its resolver or declares its gap (9a013fa).
491
+ - **Default changes + migration:** _none_
492
+ - **Security and correctness:** resolve --git-path output before comparing it (f5d3c5c); honour core.hooksPath, name the destination, and repair two weak pins (89305f3); make the staleness check advisory, and stop it prescribing a downgrade (6b7e6c2); drop the write-swallow assertions the removed guard owned (9deec70); drop consumer-dead paths and re-derive the corpus pins (934cd71); declare conformance-claim-baseline in the suppression inventory (45bf83e); +15 more.
493
+ - **Honest nulls:** track the hook this change could not reach (3802ea5); close road-to-checklist-rows (29f63fe).
454
494
  - **Known limitations:** _none_
455
495
 
456
- > **Governance mix:** governance-only 31 vs consumer-only 13 (taxonomy 1.0.0).
457
- > Next cycle ships the rows four shipped-skill lists are missing — the render
458
- > state matrix, the plan criteria the two planning skills judge against, and what
459
- > a transactional email needs to survive a mail client — tracked in
460
- > `agents/roadmaps/road-to-checklist-rows.md`.
496
+ > **Governance mix:** governance-only 55 vs consumer-only 16 (taxonomy 1.0.0).
497
+ > Next cycle ships the installed MCP bridge repair — a version-pinned server
498
+ > entry instead of an `npx -y` resolution of `latest` at every start, a
499
+ > registration that migrates itself when the bridge shape changes under an
500
+ > update, and setup docs that document the command the installer actually
501
+ > writes — tracked in `road-to-mcp-bridge-integrity-and-reach-truth`.
461
502
 
462
503
  ### Features
463
504
 
464
- * **delivery-mode:** a held change set and an owner decision packet, nothing flipped ([14330b8](https://github.com/event4u-app/agent-config/commit/14330b86810483e5d8f471826c9dbd0666977abb))
465
- * **triggers:** a 14-file corpus wave, selected by a declared rule ([1ce64c8](https://github.com/event4u-app/agent-config/commit/1ce64c8b9dd2a411361c2f9e575a732bf57812b8))
466
- * **commands:** /fix commit-messages — retro-fit past subjects to one convention ([47ff61d](https://github.com/event4u-app/agent-config/commit/47ff61ddfc4ef38ffbcde9e2638a624fcde6ee22))
467
- * **rules:** measured house commit convention outranks the shipped default ([7651c88](https://github.com/event4u-app/agent-config/commit/7651c884debeaa80daf6cbb51608a54fa1391f89))
468
- * **production-validator:** bind check_web_launch_readiness, its first non-test consumer ([56acac8](https://github.com/event4u-app/agent-config/commit/56acac87d0537fefea0e71d04bd78c3dcebef802))
469
- * **release:** refuse a release that owes a governance-mix response ([f76b334](https://github.com/event4u-app/agent-config/commit/f76b3341a3f69af6b9546f20c0385e89f3afb3e6))
470
- * **release:** measure the governance-vs-product mix of a release ([ef91095](https://github.com/event4u-app/agent-config/commit/ef910954544a7a6e66af00476b9a73c63236c137))
471
- * **threat-modeling:** add an infrastructure surface class and its threat rows ([279061c](https://github.com/event4u-app/agent-config/commit/279061c2f01582f3699359d24218a934c4558832))
472
- * **analyze-inbox:** give every extracted point a disposition it cannot escape ([176e7db](https://github.com/event4u-app/agent-config/commit/176e7db8971ba8f65f833621cf4f12508097c076))
505
+ * **hooks:** report when the installed git hooks go stale ([6b12be5](https://github.com/event4u-app/agent-config/commit/6b12be5d66a6efc08fe3bc467719b851960b68c5))
506
+ * **roadmaps:** add the receiver for the tenth arrival's carried AC-3 ([576de5f](https://github.com/event4u-app/agent-config/commit/576de5f3fafb290dbcec54cda5f9a18075f84d8a))
507
+ * **authz:** remove the git-authorization gate — enforcement returns to the model ([7f5bc37](https://github.com/event4u-app/agent-config/commit/7f5bc37321404d39ffe22b7401b2ee694d7d82af))
508
+ * **release:** register every release-validation job against a local command ([e9f272b](https://github.com/event4u-app/agent-config/commit/e9f272b87723879f2afeb064d98d58880527a4e6))
509
+ * **detectors:** flag a newly introduced silent catch, warn-first ([85b1db3](https://github.com/event4u-app/agent-config/commit/85b1db34bb08acd7a41a00d4273475fa427d3628))
510
+ * **detectors:** decide verification tampering by shape, loop-local ([f7a8e16](https://github.com/event4u-app/agent-config/commit/f7a8e16163c4ce495171c76feb6711864538b6c4))
511
+ * **skills:** a standard-conformance claim names its resolver or declares its gap ([9a013fa](https://github.com/event4u-app/agent-config/commit/9a013fac54fd1d50126ef11bc3be681e76d085cc))
512
+ * **hooks:** make a push say whether it finished, not only whether it worked ([b3fff64](https://github.com/event4u-app/agent-config/commit/b3fff64e1b0e9dc57215e8b718cf11c003dc1709))
513
+ * **prepush:** ask the staleness question the hook has always claimed to ask ([10a3168](https://github.com/event4u-app/agent-config/commit/10a3168426e23d3e9501ab3f62ff4bc1b7cfb5e2))
514
+ * **planning:** state the four criteria a plan can be failed on ([1d77901](https://github.com/event4u-app/agent-config/commit/1d77901ebbeaf12c01ce3bde6c02f1eaae99438c))
515
+ * **ai-code-blindspots:** add the four completeness rows to the render surface ([339c40d](https://github.com/event4u-app/agent-config/commit/339c40dae2aa27e1b76bf6f2e25d40de189fe545))
473
516
 
474
517
  ### Bug Fixes
475
518
 
476
- * **contracts:** review the sixteen beta deadlines that lapsed on 2026-09-04 ([183cd68](https://github.com/event4u-app/agent-config/commit/183cd6804365e2541571da7c2184338850550db3))
477
- * **evidence:** re-derive the 5.1 routing-signal record after the body rewrite ([77ca9f9](https://github.com/event4u-app/agent-config/commit/77ca9f9766e103aefd7cacd6ab82c73e93ae1cc3))
478
- * **roadmaps:** risk-register ranks must ascend ([8867c7e](https://github.com/event4u-app/agent-config/commit/8867c7e1d0915adea31669387afc5f02d8ad7618))
479
- * **proof:** regenerate docs/proof.md after the corpus revert ([59a19ed](https://github.com/event4u-app/agent-config/commit/59a19ed0847ba63f32549329c368c3f24b12e19a))
480
- * repair the defects a neutral review found in both procedures ([ef33f92](https://github.com/event4u-app/agent-config/commit/ef33f921266ff9627931bc2fee6e2180c247145a))
481
- * **gate:** anchor_coverage_gaps honours the dated-measurement marker ([3df2156](https://github.com/event4u-app/agent-config/commit/3df21567ab47659180e506e896143ade471570ec))
482
- * **tests:** re-derive the two description-dependent pins ([fc1d6f4](https://github.com/event4u-app/agent-config/commit/fc1d6f40eadcf609634371741d06e0a4f0c6ac22))
483
- * **rules:** hold commit-conventions at its stub ceiling ([1ebf5ac](https://github.com/event4u-app/agent-config/commit/1ebf5ac16778499b13ff44716bc6ce4a7c6104d5))
484
- * **skills:** name manifest peers so the tier-1 probe stays framework-neutral ([152af29](https://github.com/event4u-app/agent-config/commit/152af29b7977394de4424e1976275e9a9dd755e1))
485
- * **web-launch-readiness:** no check may report passed on input it cannot see ([3ad7d26](https://github.com/event4u-app/agent-config/commit/3ad7d268bdcc090efc2834018cfda629548fb82f))
486
- * **skills:** drop the duplicated grounding invocation from both IaC sections ([42cfa5b](https://github.com/event4u-app/agent-config/commit/42cfa5b3d9ce4d8b32f9e04c807b5b1b7930c674))
487
- * **terraform:** correct the encryption backstop grep flags ([8c43c49](https://github.com/event4u-app/agent-config/commit/8c43c4925c5fa9e83efaf43080a92742ddd9a973))
488
- * **analyze-inbox:** write the new prose in the canonical house dialect ([a7a1275](https://github.com/event4u-app/agent-config/commit/a7a1275fcd793320f14c3de6592710046c2001fe))
489
-
490
- ### Reverts
491
-
492
- * **triggers:** the corpus is held — the wave that proved it, preserved ([a502114](https://github.com/event4u-app/agent-config/commit/a502114a9fa0e87ab883c8a5ca00dbe8681f7860))
519
+ * **tests:** resolve --git-path output before comparing it ([f5d3c5c](https://github.com/event4u-app/agent-config/commit/f5d3c5ce47b4744344b428dc682db2069f38fbe2))
520
+ * **hooks:** honour core.hooksPath, name the destination, and repair two weak pins ([89305f3](https://github.com/event4u-app/agent-config/commit/89305f333f4c44efcc71c56d9c46bdd8f6e5e88c))
521
+ * **hooks:** make the staleness check advisory, and stop it prescribing a downgrade ([6b7e6c2](https://github.com/event4u-app/agent-config/commit/6b7e6c2a62949475aad9b5dedc0167fd9c0f88f2))
522
+ * **roadmaps:** land the AC-6 cancellation PR #1860 archived without ([d92f9a6](https://github.com/event4u-app/agent-config/commit/d92f9a60e512ddae3adbb9eaeff7bf7f2432cf45))
523
+ * **docs:** keep the skill reference portable and the dialect canonical ([500da8b](https://github.com/event4u-app/agent-config/commit/500da8b781ee8af1a5c44946123964d8c0c94440))
524
+ * **test:** drop the write-swallow assertions the removed guard owned ([9deec70](https://github.com/event4u-app/agent-config/commit/9deec705af2d4242e93613f6e8cb3abfda52f0c4))
525
+ * **adr:** ADR-254 carries no agentic_mode — the decision had none ([7e38059](https://github.com/event4u-app/agent-config/commit/7e38059c23aab7d8b4989cf639591e26b4629662))
526
+ * **testing-anti-patterns:** use the house dialect in the five new prose lines ([72acd36](https://github.com/event4u-app/agent-config/commit/72acd36a8864890dd47551c0bd0c5b65b127d109))
527
+ * **code-intelligence:** drop consumer-dead paths and re-derive the corpus pins ([934cd71](https://github.com/event4u-app/agent-config/commit/934cd7117eb71b113114bcba8dbaca9b3d939483))
528
+ * **gates:** declare conformance-claim-baseline in the suppression inventory ([45bf83e](https://github.com/event4u-app/agent-config/commit/45bf83e1e72a1a07d0cd58b90d0fb705086bd380))
529
+ * **test:** drop the three imports the deleted enforcement tests owned ([9fd6a80](https://github.com/event4u-app/agent-config/commit/9fd6a8022143964b70d6bfe7b66367e2f2c95218))
530
+ * **skills:** name feature-planning instead of linking it from complexity-first-planning ([ed70287](https://github.com/event4u-app/agent-config/commit/ed702875ef4c87c78e3df7e58120d8001ca8f99f))
531
+ * **evidence:** declare review independence on the 14.16.0 findings ledger ([848dd8e](https://github.com/event4u-app/agent-config/commit/848dd8e2a86df20d5d9ab59fc1eeeb880d5ded26))
532
+ * **release:** stop the runner reporting a clearance it did not earn ([47412ed](https://github.com/event4u-app/agent-config/commit/47412ed6d1780be01f172943b424f8c4fea34e5f))
533
+ * **release:** move the tests-footer refusal off the site that cannot recover ([4394eda](https://github.com/event4u-app/agent-config/commit/4394eda093c9fe9c301b7d462d62981b79979a8a))
534
+ * **release:** the mix predicate was wrong in both directions ([f71e975](https://github.com/event4u-app/agent-config/commit/f71e975fb4c1b0ddeae3bea67aa8072890a6fd2c))
535
+ * **release:** drop the two box-rule section comments this branch added ([1355604](https://github.com/event4u-app/agent-config/commit/1355604d8554cf4ae106901b7cd49e6a5f97d8ad))
536
+ * **release:** drop the imports this branch's own relocation orphaned ([6282594](https://github.com/event4u-app/agent-config/commit/6282594ad7d7b55fbcb12f0881dd91ef3ad877d4))
537
+ * **release:** refuse both writer placeholders, not only the first ([6fd1e67](https://github.com/event4u-app/agent-config/commit/6fd1e67866b5925e428ef2e3155d618014242a97))
538
+ * **release:** skip the release-PR-shape row off a release branch, and say so ([67dfddc](https://github.com/event4u-app/agent-config/commit/67dfddc4097d72b48acfe4599a1785c113560e78))
539
+ * **release:** refuse the governance-mix obligation before the push, not on the PR ([23cc153](https://github.com/event4u-app/agent-config/commit/23cc153ccc8344e99e2b35985858388d46793377))
540
+ * **code-graph:** bind imports to their module specifier, stop guessing by name ([87a5bf9](https://github.com/event4u-app/agent-config/commit/87a5bf9dc920594786950ac9aa78837e60925b37))
541
+ * **release-truth:** absence is not evidence of zero ([d318926](https://github.com/event4u-app/agent-config/commit/d318926eaa16703608623b223c68a1de47634849))
542
+ * **self-review:** say that a finding id is a finding id, not a commit SHA ([d6ca2b7](https://github.com/event4u-app/agent-config/commit/d6ca2b790c9b09c5351f59758e3c5a24f9630a7a))
543
+ * **roadmap:** the carrier was already there — 1.2 claimed otherwise without looking ([466c45b](https://github.com/event4u-app/agent-config/commit/466c45b637b83dfca533039103c1883611f92645))
544
+ * **hooks:** stop swallowing a failed write at all four sites, not the two that were reported ([6b41475](https://github.com/event4u-app/agent-config/commit/6b4147531e2b87e54942d0c1121d8d1db5f94a61))
545
+ * **hooks:** record the push-settle admission, and drop the last maintainer verb ([0196513](https://github.com/event4u-app/agent-config/commit/0196513f8f761567cd83e9bc07b4d8ca92517e81))
546
+ * **git-workflow:** keep the shipped skill shippable, and speak the house dialect ([4658fdf](https://github.com/event4u-app/agent-config/commit/4658fdfe5f589161ab43cc5dd4395188436dde0a))
547
+ * **git-workflow:** say the install lifecycle without naming one ecosystem's tool ([01fa985](https://github.com/event4u-app/agent-config/commit/01fa985fd1569b1d9f49d1c04b9fdbf8735375b7))
548
+ * **git-auth:** route isRevocation through the one clause-scoped negation parser ([c19f4d7](https://github.com/event4u-app/agent-config/commit/c19f4d7246cab5da2f19834e69a2cbbb34fe5311))
549
+ * **roadmaps:** correct two stale line citations in the archived roadmap ([455f3f2](https://github.com/event4u-app/agent-config/commit/455f3f2491a3d07769d20b79c5a2b64f4a6ac02f))
550
+ * **claims:** retire the surviving no-runtime-daemon wording and repair the README ([d6992c8](https://github.com/event4u-app/agent-config/commit/d6992c867b61543d17e18afb927ba68f04f39577))
493
551
 
494
552
  ### Documentation
495
553
 
496
- * **evidence:** record the council round, the split, and the two required repairs ([3d5033d](https://github.com/event4u-app/agent-config/commit/3d5033db93c4c5abb999dc36302b00024af85d2e))
497
- * **evidence:** record the run-20 drain, its two open roadmaps and its carrier ([2be3bb3](https://github.com/event4u-app/agent-config/commit/2be3bb3fcadc1b03777c0de308e6ccfb36a6ec82))
498
- * **roadmaps:** close road-to-the-tenth-arrival with its per-step evidence ([2df5556](https://github.com/event4u-app/agent-config/commit/2df5556570df82548500b4ea372f9ad14f56a02b))
499
- * **claims:** publish the skill-activation census as its own ledger row ([5fad7e3](https://github.com/event4u-app/agent-config/commit/5fad7e3ed29a3d2a5e46863f5752e6f105480fc6))
500
- * **disposition:** the lock cited over the ninth arrival gates a different question ([f1324ce](https://github.com/event4u-app/agent-config/commit/f1324ce3ed0c9c7d3142e54319c0fc334f9fb128))
501
- * **roadmaps:** AC-6 stays open, awaiting owner disposition ([287f5ec](https://github.com/event4u-app/agent-config/commit/287f5ec54c4f55ec314ca0f5018a01e706cf620e))
502
- * **roadmaps:** record the outcome of road-to-the-check-that-cannot-see ([d238f3d](https://github.com/event4u-app/agent-config/commit/d238f3d13c761de1cb397f4cc14c5a6ef87de136))
503
- * **roadmaps:** stop citing a superseded contract as the live-app reason ([c2a1d8f](https://github.com/event4u-app/agent-config/commit/c2a1d8f27db651ab6567588faae6f888c3522ace))
504
- * **evidence:** describe the council response tree without naming its path ([ee0af99](https://github.com/event4u-app/agent-config/commit/ee0af993ffd5ec22911f294dc06af33638322169))
505
- * **roadmaps:** close road-to-meta-ratio-measured ([6aaabdf](https://github.com/event4u-app/agent-config/commit/6aaabdf42c1fe3ee29432b431ba65518c6d87273))
506
- * **evidence:** publish the first two release-mix readings as levels ([eadf59a](https://github.com/event4u-app/agent-config/commit/eadf59ae141fdc3a09d4d0ce5a60fa4ed6d765d7))
507
- * **decisions:** decline the same-PR user-artefact gate (ADR-253) ([b23bb45](https://github.com/event4u-app/agent-config/commit/b23bb45e5ee1973b16c7cd100b954c831be74159))
508
- * **roadmaps:** close road-to-decided-but-not-done at 12 of 12 ([43ecfa1](https://github.com/event4u-app/agent-config/commit/43ecfa1e0a849463fe90619f0018508a193af81d))
509
- * **roadmaps:** name the receiver the carried-to promise pointed at ([29c4ad2](https://github.com/event4u-app/agent-config/commit/29c4ad20cee638a7d663d8e268367dd5cd1c5961))
510
- * **evidence:** record whether secret scanning reaches a consumer IaC diff ([afd17bc](https://github.com/event4u-app/agent-config/commit/afd17bc446eb21e523767a11905fdf8a72420a9d))
511
- * **skills:** give terraform and aws-infrastructure the permissiveness canon ([e33e233](https://github.com/event4u-app/agent-config/commit/e33e233dba49468f87c1f75f16d0a95b6b32e9d6))
512
- * **roadmaps:** two roadmaps from the 2026-09-f and -g proposal rounds ([a978b66](https://github.com/event4u-app/agent-config/commit/a978b661cdba3709a64324fdcbefd18eb3ab25cb))
513
- * **evidence:** verify and disposition the inbox-2026-09-f and -g rounds ([26dac19](https://github.com/event4u-app/agent-config/commit/26dac198f966a41adbb3e4a3d4d055786cb77afc))
514
- * **roadmaps:** the gate reported this analysis diff as ten findings ([9caefb6](https://github.com/event4u-app/agent-config/commit/9caefb62c36b1c187200d66e62d61046feef143a))
515
- * **roadmaps:** satisfy the relates, language and evidence-type gates ([8f53476](https://github.com/event4u-app/agent-config/commit/8f534765c7611cbebc1a3172afa5b8703da2a5a2))
516
- * **roadmaps:** claim the one-in-one-out half of the estate ratchet ([89901b6](https://github.com/event4u-app/agent-config/commit/89901b6d0939aaafd349563bd188dd58fbfb3c03))
517
- * **evidence:** verify and disposition the inbox-2026-09-e round ([f3e3579](https://github.com/event4u-app/agent-config/commit/f3e3579f91e6caebe899307671bc6f20e59655d3))
518
- * **evidence:** declare the completion-review skip for the inbox-2026-09-d diff ([c28d094](https://github.com/event4u-app/agent-config/commit/c28d09446840231f75966286462ee60897054a7b))
519
- * **roadmaps:** three roadmaps from the inbox-2026-09-d round ([f83b75f](https://github.com/event4u-app/agent-config/commit/f83b75f35fa0b942ffcdce3f35f95c77fa7ef7b6))
520
- * **evidence:** record the inbox-2026-09-d verification and disposition ([77ab8e5](https://github.com/event4u-app/agent-config/commit/77ab8e5636a48b0f4382c7be2f964e1569dfacdc))
521
-
522
- ### Refactoring
523
-
524
- * remove attest_artifact, enforcing the 2026-08-25 ruling ([e58e11f](https://github.com/event4u-app/agent-config/commit/e58e11f9bb3dcf482086d51e99eb21e14adffd1e))
525
- * **explain-last:** drop the .agent-memory sidecar read path ([aaf049d](https://github.com/event4u-app/agent-config/commit/aaf049dbb8cb319f7af195c63ccd814f24b52697))
554
+ * **evidence:** correct the run-21 record after lane B's review landed ([df1203f](https://github.com/event4u-app/agent-config/commit/df1203f86bf5d8248b4d982d62b491fcc8f1091e))
555
+ * **roadmaps:** record arrival counts on the objects nine rounds hit ([cd0d572](https://github.com/event4u-app/agent-config/commit/cd0d5722ac3a652f83fc96577bb69bd6f5628b63))
556
+ * **roadmaps:** add road-to-observed-learning-signal ([ce41a05](https://github.com/event4u-app/agent-config/commit/ce41a05f0c80453ae648cbd2ab5599be669d156b))
557
+ * **roadmaps:** add road-to-scan-that-fails-closed ([070076d](https://github.com/event4u-app/agent-config/commit/070076d0e9cb24ba0b5fa670018667e0b397ec57))
558
+ * **roadmaps:** add road-to-admissible-council-seats ([708b575](https://github.com/event4u-app/agent-config/commit/708b57545c1953889b04582dbdd6b3d113d0d760))
559
+ * **roadmaps:** add road-to-authorization-that-reaches-further ([d84cc1c](https://github.com/event4u-app/agent-config/commit/d84cc1c92c6e2ed89cda6b11b7a88959bb6a2c1f))
560
+ * **roadmaps:** add road-to-one-motion-authority ([572b778](https://github.com/event4u-app/agent-config/commit/572b7789c1e43b061104223b5f97957a076a7b35))
561
+ * **roadmaps:** add road-to-mcp-bridge-integrity-and-reach-truth ([8ed7d7b](https://github.com/event4u-app/agent-config/commit/8ed7d7b496671c2c4860a43b679dee33d176ee84))
562
+ * **roadmaps:** add road-to-asked-not-parked ([c74eaa5](https://github.com/event4u-app/agent-config/commit/c74eaa5a5a58377018f37f096e066be3ea0ac00b))
563
+ * **roadmaps:** add road-to-host-enforcement-truth ([ba136b4](https://github.com/event4u-app/agent-config/commit/ba136b4dadb994aae1681e3678d4ffae6e8a2d15))
564
+ * **roadmaps:** add road-to-bounded-reference-harvest-loop ([23ab3df](https://github.com/event4u-app/agent-config/commit/23ab3dfcd69220a289816ebcf6329b2791125a0d))
565
+ * **evidence:** record the cross-session hook revert the detector caught ([2da72d3](https://github.com/event4u-app/agent-config/commit/2da72d36ac2292b12f126ca53519451e58f45884))
566
+ * **evidence:** state the run-21 base-update and ci_settle-exit-2 detail ([4365727](https://github.com/event4u-app/agent-config/commit/4365727ddbba9ff0b82f5149fa9c20b3f16d4010))
567
+ * **evidence:** record the run-21 autonomous roadmap drain ([1a49336](https://github.com/event4u-app/agent-config/commit/1a49336427e7df6ac24fd60d682927fdce1ec94e))
568
+ * **adr:** ADR-254 discloses what it rests on ([b003cc0](https://github.com/event4u-app/agent-config/commit/b003cc0423b35cc9d1f5332b8b8522193be0219c))
569
+ * **roadmap:** re-pin the DONE-note line citations after the reorder ([a4f75c7](https://github.com/event4u-app/agent-config/commit/a4f75c7a22564d9a6c684e481120c4f46c0c7c6b))
570
+ * **roadmaps:** resolve the worth-building blocker W-NO ([6e9f0c5](https://github.com/event4u-app/agent-config/commit/6e9f0c5c016b4680327b602a72cb179ac55c80d7))
571
+ * **hooks:** answer the consumer question and record the refused repair ([77bafdf](https://github.com/event4u-app/agent-config/commit/77bafdfca0b193f276ff6f6fac9126337ee1766c))
572
+ * **roadmaps:** carry the tenth arrival's AC-3 rather than claiming it ([b92952c](https://github.com/event4u-app/agent-config/commit/b92952c978016f8506f1edab7786a19d76297dab))
573
+ * **evidence:** reproduce the tenth-arrival AC-3 constraint at n=1 ([1476bfa](https://github.com/event4u-app/agent-config/commit/1476bfa7d23dd7337730da68ef9f48426538b402))
574
+ * **evidence:** record the 2026-09-05 PR drain run ([d5c8c75](https://github.com/event4u-app/agent-config/commit/d5c8c75727d41bdf389a4b21db30a47a210190c8))
575
+ * **release:** correct three claims this branch got wrong, and name the surface ([21d0f58](https://github.com/event4u-app/agent-config/commit/21d0f584777a99206d444f0b72e279e4c2f78794))
576
+ * **authz:** ADR-254 supersedes ADR-252, and every doc that claimed a window ([c1dabe5](https://github.com/event4u-app/agent-config/commit/c1dabe561b7c4d8af278319d3903112a8e1b074d))
577
+ * **release:** correct the coverage paragraph that documented the gap ([3cd0376](https://github.com/event4u-app/agent-config/commit/3cd0376fc2018a71a452c3d77be2cbd246b39fea))
578
+ * **worktrees:** name the cwd cost of a worktree outside the repo root ([e4ad278](https://github.com/event4u-app/agent-config/commit/e4ad278bff745b19f75cd9702ffa8c3229963766))
579
+ * **index:** regenerate for the code-intelligence description change ([f8e7955](https://github.com/event4u-app/agent-config/commit/f8e7955b25e3bbbfee7fb884de90a791728c795a))
580
+ * **roadmaps:** archive road-to-the-graph-that-lies-confidently ([a53789a](https://github.com/event4u-app/agent-config/commit/a53789ab507169d7f267483ab944cecc8839bfff))
581
+ * **roadmaps:** close the graph-that-lies-confidently with its findings ([3d23a90](https://github.com/event4u-app/agent-config/commit/3d23a9070bb201adb46b580877965f923248b7f9))
582
+ * **code-intelligence:** re-anchor the published measurement to the re-run ([9d5042c](https://github.com/event4u-app/agent-config/commit/9d5042c614f92daafee2aa7db250a0abfdeda5f4))
583
+ * **code-intelligence:** apply the retraction where the claim still lives ([7d36b11](https://github.com/event4u-app/agent-config/commit/7d36b11010f719d8e0f9acb3b5f42c2870a89e24))
584
+ * **roadmaps:** archive road-to-the-unwritten-ledger ([4b68884](https://github.com/event4u-app/agent-config/commit/4b6888446013df14d9409fcf2618fc34b5f9ad14))
585
+ * **roadmaps:** close the unwritten ledger, and move the sibling review date ([0493a64](https://github.com/event4u-app/agent-config/commit/0493a64f9ce674a59e7186dd108a12203ebeed0d))
586
+ * **self-review:** record why the enforcement flip is not safe to take yet ([6e89069](https://github.com/event4u-app/agent-config/commit/6e890690e28d05198e4425528e9eea6e95441d1a))
587
+ * **evidence:** write the findings ledger 14.16.0 never got ([c507353](https://github.com/event4u-app/agent-config/commit/c5073530e44d6f464cbfafbee2e5e08204d2923e))
588
+ * **contracts:** name two test smells, and give flakiness a state ([e795899](https://github.com/event4u-app/agent-config/commit/e7958998d0d6699417354fd58b844e7074284b9b))
589
+ * **roadmaps:** record the three counted populations, and report AC-5 failed rather than claim it ([5626df0](https://github.com/event4u-app/agent-config/commit/5626df095363b7cec8d206e3b3e322a662c3c76f))
590
+ * **roadmaps:** inline the council convergence summary instead of linking it ([387b1d0](https://github.com/event4u-app/agent-config/commit/387b1d03ad58c0c30e2bfa3399c8783f3d519100))
591
+ * **roadmaps:** close road-to-one-negation-vocabulary ([c8b9771](https://github.com/event4u-app/agent-config/commit/c8b97710aecea7628a0db83927e504cd11e9e288))
592
+ * **git-workflow:** name the hole this change leaves open ([722c8cb](https://github.com/event4u-app/agent-config/commit/722c8cbfb24708d89b56ce654591c2e012430d40))
593
+ * **git-workflow:** a push closes its own loop ([e3f681d](https://github.com/event4u-app/agent-config/commit/e3f681df062143f75d26e5bf931ef31cd45de904))
594
+ * **roadmaps:** close road-to-checklist-rows ([29f63fe](https://github.com/event4u-app/agent-config/commit/29f63fe57b54e9faf46dd4bfce9a547188c36642))
595
+ * **laravel-mail:** cover what a transactional email needs to survive a client ([30bcc27](https://github.com/event4u-app/agent-config/commit/30bcc27433d6bc6f46e66f0c932efed9994f2561))
526
596
 
527
597
  ### Tests
528
598
 
529
- * **distribution:** cover the canonical-channel invariant, which had no test ([d978081](https://github.com/event4u-app/agent-config/commit/d9780819b6e8303d163ce63093753f028d1d8d00))
599
+ * **authz:** drop the enforcement tests, keep every ledger and classifier test ([3030265](https://github.com/event4u-app/agent-config/commit/30302652699d9d9674d3b2ba972adc6828627248))
600
+ * **release:** prove the pre-push gate run can actually stop a release ([13e7bb3](https://github.com/event4u-app/agent-config/commit/13e7bb38b778e9ad0c260e2a8451fd04e1c6c9d3))
601
+ * **bench:** re-pin the re-run to the engine tree that actually ships ([bd8a222](https://github.com/event4u-app/agent-config/commit/bd8a222c602b7b7a305b63d50fccf3c19868feac))
602
+ * **bench:** publish the v2 re-run, zero classes won again ([5264732](https://github.com/event4u-app/agent-config/commit/52647327c64a4eda9bf25adb2844cbd8075e6d7a))
603
+ * **bench:** warn on every re-run that a measured root is live source ([20af461](https://github.com/event4u-app/agent-config/commit/20af461be6cdbac56892dd2543dbe134b8b7a3d7))
604
+ * **bench:** let the v2 runner write a dated re-run without overwriting v2 ([4988954](https://github.com/event4u-app/agent-config/commit/4988954f4268aee9f0fddfa4fc55e3311ed9473f))
605
+ * **fixtures:** commit the tamper corpus before any detector exists ([c62402c](https://github.com/event4u-app/agent-config/commit/c62402c7c7c49e24cc036b9e93032530127c91e1))
606
+ * **git-auth:** derive the operation set, and name every guard rather than only the covered one ([e6dd88e](https://github.com/event4u-app/agent-config/commit/e6dd88e5e0b5f123a08c130b227e68c5de5f0f3e))
607
+ * **git-auth:** assert the negation corpus against both functions ([c01c6e7](https://github.com/event4u-app/agent-config/commit/c01c6e7227eed02898c78eb4a98f6835cba5f882))
530
608
 
531
609
  ### Chores
532
610
 
533
- * **roadmaps:** archive road-to-the-tenth-arrival ([249ab53](https://github.com/event4u-app/agent-config/commit/249ab535ec20805aef4dca2ebcbe204013e6ceef))
534
- * **wedge:** re-sync the production-validator wedge doc after the gate binding ([7f95d05](https://github.com/event4u-app/agent-config/commit/7f95d056d6a356cbc99b8c097c04dedd9217f2fc))
535
- * **web-launch-readiness:** stop retyping the check count ([9ec7544](https://github.com/event4u-app/agent-config/commit/9ec754461d941b441ca9536d4a781c4a1180dcc4))
536
- * **roadmaps:** archive road-to-meta-ratio-measured ([ffd65ff](https://github.com/event4u-app/agent-config/commit/ffd65ff92ff176c6798d0211c6655ccd9b76d032))
537
- * **adr:** regenerate the evidence census for ADR-253 ([5b29d74](https://github.com/event4u-app/agent-config/commit/5b29d74b04bd1c47b920cbd0601451937ba1be2a))
538
- * **roadmaps:** archive road-to-decided-but-not-done ([11b0222](https://github.com/event4u-app/agent-config/commit/11b0222b3a81da07d0a0786b2771883654d8b9c7))
539
- * **roadmaps:** archive road-to-infra-threat-floor ([81007b4](https://github.com/event4u-app/agent-config/commit/81007b45af35528c8834a5e6a46603db8f21a3ca))
611
+ * **roadmaps:** archive road-to-second-trigger-corpus-generation ([666d2a8](https://github.com/event4u-app/agent-config/commit/666d2a882fefa7f3abaf60bd47444f6c8daef9bb))
612
+ * **adr:** regenerate the evidence census for ADR-254 ([88e16ff](https://github.com/event4u-app/agent-config/commit/88e16ff938f38e89573d910d5e36f7bdae9aa008))
613
+ * **roadmaps:** archive road-to-the-tenth-arrival ([4f34c15](https://github.com/event4u-app/agent-config/commit/4f34c157fc2480b942e4fb557c541302c3fc0407))
614
+ * **reports:** regenerate the skill-overlap report after the dialect fix ([3fcfe81](https://github.com/event4u-app/agent-config/commit/3fcfe81a5a0485eab903ffc441f8d8876d296958))
615
+ * **meta:** regenerate the meta pack token passport after the main merge ([c4747a8](https://github.com/event4u-app/agent-config/commit/c4747a88131da2d8bb40eb7e654762c301952001))
616
+ * **code-graph:** drop a box-rule comment lint_code_comments rejects ([10fcf0c](https://github.com/event4u-app/agent-config/commit/10fcf0c1bfa3d258c97298c0786e151308f54082))
617
+ * **evidence:** re-anchor the routing body-signal verdict after a skill-body edit ([44db916](https://github.com/event4u-app/agent-config/commit/44db91672b0092a293b5645e5ce083ae47f96e8a))
618
+ * **roadmaps:** archive road-to-deterministic-defect-detectors ([b256143](https://github.com/event4u-app/agent-config/commit/b256143d917c8e1ccd0e1e3e3818025a924834e4))
619
+ * **schemas:** bump skill.schema.json to 1.1.0 for the added enforced_by key ([ab87d6a](https://github.com/event4u-app/agent-config/commit/ab87d6ae01ce48a69eda6946408d8346f832e878))
620
+ * **evidence:** declare the evidence type on the three census artifacts ([003963e](https://github.com/event4u-app/agent-config/commit/003963eff51a1acc5f235d8d760aee4517bed697))
621
+ * **roadmaps:** archive road-to-defect-population-sweeps ([1b5f60a](https://github.com/event4u-app/agent-config/commit/1b5f60ab19926142ba7cdb5514201797b0b088a8))
622
+ * **roadmaps:** archive road-to-one-negation-vocabulary ([45e4036](https://github.com/event4u-app/agent-config/commit/45e4036e84b4eb28062a68ec4bf49768865fdff7))
623
+ * **roadmaps:** archive road-to-checklist-rows ([34f109f](https://github.com/event4u-app/agent-config/commit/34f109ff334a7c77f032e21aad86529b29a0fc9e))
540
624
 
541
625
  ### Other
542
626
 
543
- * **dialect:** write the new prose in the canonical house dialect ([e051ed8](https://github.com/event4u-app/agent-config/commit/e051ed8fcc20a387012d4ec16f645199fe4b1a86))
627
+ * **r2:** rebind the artefact after the base merge ([922a6dc](https://github.com/event4u-app/agent-config/commit/922a6dc9b8448623334ab1e2f81aefa3f7516f22))
628
+ * **r2:** rebind the round-2 artefact against origin/main ([735888d](https://github.com/event4u-app/agent-config/commit/735888df79ace437ecb0576fbd13862f11347106))
629
+ * **r2:** round-2 dispositions, all eleven terminal ([79eb0cf](https://github.com/event4u-app/agent-config/commit/79eb0cf752bf95f10eb4093353bda0368a8b755e))
630
+ * **r2:** record the blind completion review, findings open ([23884ad](https://github.com/event4u-app/agent-config/commit/23884ad2ec01ec63ec395c56c15decbcb025f9f1))
631
+ * complete road-to-the-hook-that-was-never-installed ([a8c0ddc](https://github.com/event4u-app/agent-config/commit/a8c0ddc51ad71097a585e54fdb9a21ca5f483009))
632
+ * close road-to-the-check-that-cannot-see under delegated disposition ([cfb696f](https://github.com/event4u-app/agent-config/commit/cfb696fdd0a954d1320b9aa49c51a22818795dab))
633
+ * **detectors:** drop markdown headings from the new docstrings ([63e9263](https://github.com/event4u-app/agent-config/commit/63e9263d6ac7da023f5c437dd1f7a7e5602eda5f))
634
+ * track the hook this change could not reach ([3802ea5](https://github.com/event4u-app/agent-config/commit/3802ea5e2fc47d9346179a8edb184d4e64efd6cd))
544
635
 
545
- Tests: 21007 (+33 since 14.16.0)
636
+ Tests: 21190 (+183 since 14.17.0)
546
637
 
547
638
  # Era: pre-4.0.0 — archived
548
639
 
package/README.md CHANGED
@@ -483,7 +483,7 @@ When a prompt matches a command's purpose ("setze ticket ABC-123 um" → `/imple
483
483
  - **Verify with real execution** — no "should work"
484
484
  - **Challenge to improve** — agents are thought partners, not yes-machines
485
485
  - **Strict by design** — quality over flexibility
486
- - **Zero overhead by default** — nothing runs until you ask for it
486
+ - **Governed runtime** — resident processes require supervision, scoped writes, and a stop control
487
487
 
488
488
  ---
489
489
 
@@ -34,12 +34,13 @@ ACTIVATION NEEDS THE OWNER DECISION IN THE `merge-authority` BLOCKER OF
34
34
  `road-to-drain-commands` — NEVER A COMMAND EDIT, AND NEVER A GUARD EDIT.
35
35
  ```
36
36
 
37
- **The invocation is the authorization, and nothing else is.** `pr-merge` is a
38
- `BLOCK_OPS` member in `block_unauthorized_git.ts` because it is irreversible.
39
- This command would consume the authorization the user's own prompt text already
40
- wrote to the per-session ledger on `UserPromptSubmit`; it introduces no second
41
- authorization store, and it never writes one. When that window closes the run
42
- stops and reports (§ 7) — the window never grows.
37
+ **The invocation is the authorization, and nothing else is.** `pr-merge` is
38
+ irreversible, and since 2026-09-04 (ADR-254) NOTHING MECHANICAL CHECKS IT —
39
+ the gate that did was removed after it refused authorizations the owner had in
40
+ fact given. The per-session ledger still records what the user's own prompt
41
+ authorized, and this command still reads it as an audit trail; it introduces no
42
+ second authorization store, and it never writes one. When the work left is
43
+ outside what the owner authorized, the run stops and reports (§ 7).
43
44
 
44
45
  Why it ships inert rather than not at all: everything before § 9 — the target
45
46
  manifest, the four conflict classes, the superseded check, the bounded CI
@@ -266,54 +267,44 @@ exceeds the remaining window, stop entering CI-fix loops and merge everything
266
267
  already green first. Pre-greening several PRs ahead of their merge is forbidden
267
268
  under window pressure.
268
269
 
269
- **The signal, named — otherwise neither this rule nor § 7 is actionable.** The
270
- window is the per-session authorization ledger's own freshness bound. Read it,
271
- never write it:
270
+ **No mechanical window remains, and that is the change.** Until 2026-09-04 the
271
+ run read a freshness bound off the authorization ledger and paused when it
272
+ closed. The owner removed the enforcing gate (ADR-254) after it was measured
273
+ refusing authorizations that had in fact been given, so there is no constant to
274
+ read and no expiry to schedule against. Authorization is carried by the
275
+ conversation and by `non-destructive-by-default`, not by a clock.
276
+
277
+ The per-session ledger is still written, and is still read-only to this run:
272
278
 
273
279
  ```bash
274
280
  cat "agents/state/git-authorization/$(<session-slug>).json" # detected_at
275
281
  ```
276
282
 
277
- Remaining window = `detected_at + LEDGER_MAX_AGE_MS − now`. Take the constant
278
- from the guard source **only after** `check_hook_bundle_content` says the
279
- source and the executing bundle agree — reading the source alone is the
280
- 2026-08-21 failure re-expressed as an instruction, since the bundle is what
281
- enforces the value and a source edit without a rebuild is silently inert. Under
282
- pressure means
283
- the remaining window is shorter than one CI cycle on this repository. The read
284
- is the whole interaction: the run never edits that file, the constant, or the
285
- built bundle.
283
+ It records what a turn authorized. It no longer gates anything, so treat it as
284
+ an audit trail, never as permission. The run never edits that file.
286
285
 
287
- ## 7. Expiry is a reported state, never a stall
286
+ ## 7. Authorization is the owner's sentence, not a timer
288
287
 
289
288
  ```
290
- WHEN THE AUTHORIZATION WINDOW CLOSES WITH WORK LEFT, THE RUN PAUSES, REPORTS,
291
- AND ASKS FOR RE-AUTHORIZATION. IT NEVER RETRIES THE GUARD, AND IT NEVER EDITS
292
- THE GUARD, ITS SOURCE, OR ITS BUNDLES — READ-ONLY VERIFICATION ONLY.
289
+ THE RUN MERGES WHAT THE OWNER AUTHORIZED AND NOTHING ELSE. WHEN THE WORK LEFT
290
+ IS OUTSIDE WHAT WAS AUTHORIZED, THE RUN PAUSES, REPORTS, AND ASKS. IT NEVER
291
+ INFERS A WIDER MANDATE FROM A LONG RUN OR FROM MOMENTUM.
293
292
  ```
294
293
 
295
- **Unreachable while the merge step is gated**, and stated rather than left for
296
- a reader to discover: with nothing merging, the run performs no `BLOCK_OPS`
297
- operation (`push` and `commit` are `WARN_OPS`), so the window governs nothing
298
- it does. This section is the contract for when the gate opens.
299
-
300
- Write the summary as-is with a `window-expired` disposition per unprocessed PR
301
- and name the exact re-authorization needed. Then STOP and wait — do not end the
302
- run, and do not proceed to the next PR. ADR-251 (2026-08-30) decided this
303
- shape: expiry is a pause, not a termination.
304
-
305
- **The operator's reply is what resumes it, and it renews the window through the
306
- path that already exists.** `git_authorization_hook.ts` rewrites this session's
307
- ledger with a fresh `detected_at` on every human-typed prompt, so a reply
308
- carrying the re-authorization you named resets the age the guard compares
309
- against — no new mechanism, and the signal still comes from text the user typed.
310
- Re-verify the manifest entry (number and head SHA) before resuming, exactly as
311
- § 8 requires: the pause is a window in which the world can move.
312
-
313
- Widening `LEDGER_MAX_AGE_MS` is still forbidden practice, and ADR-251 kept the
314
- 30-minute value deliberately rather than by omission: on 2026-08-21 it was
315
- patched to six hours for a drain run and the widening reached the trunk. The run proposes no value for it, edits neither it nor its bundles,
316
- and treats a refusal as the answer.
294
+ With the gate removed nothing refuses an unauthorized merge, which makes this
295
+ section the whole control rather than a second layer behind one. Two rules
296
+ follow, and they are stricter than the ones they replace:
297
+
298
+ - **A cardinality word does not authorize a PR the owner never named.** "All the
299
+ open PRs" is an instruction to work the queue as it stood when the owner said
300
+ it. A PR opened after that sentence is new work and needs its own go-ahead.
301
+ - **A one-shot authorization is spent on the operation it named.** Per
302
+ `commit-policy`, "merge #1499" does not authorize the next merge, and a
303
+ conflict cycle or a CI fix in between does not renew it.
304
+
305
+ Write the summary as-is with an `unauthorized` disposition per unprocessed PR
306
+ and name the exact authorization needed. Then STOP and wait — do not end the
307
+ run, and do not proceed to the next PR.
317
308
 
318
309
  ## 8. Kill switches, and what happens after a merge
319
310
 
@@ -5,6 +5,8 @@ description: "Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard
5
5
  personas:
6
6
  - frontend-engineer
7
7
  domain: quality
8
+ enforced_by:
9
+ - "test:tests/contracts/accessibility_wcag_version_claim.test.ts"
8
10
  workspaces:
9
11
  - engineering
10
12
  packs:
@@ -47,7 +47,7 @@ Run the row(s) for what you touched. The grep is a fast authoring-time backstop
47
47
  | **HTTP endpoint / route** | authorization (this principal may act on this resource — not just authenticated); tenant scope; **the three negative tests** (unauth→401, non-owner→403/404, cross-tenant→403/404); input validation at the boundary; rate limit actually wired; state-changing → CSRF + audit log | `broken-access-control`, `authz-review`, `threat-modeling` |
48
48
  | **DB query / ORM** | parameterized, never string-built; tenant predicate present; no `SELECT *` across a serialization boundary; N+1 avoided (eager load) | `source-discovery`, `security` |
49
49
  | **Migration** | reversible (`down`); expand-contract for drop/rename (never a bare `DROP COLUMN` before code stops reading it); transaction; index on new FK/filter column | `engineering-safety-floor`, `migration-architect` |
50
- | **User-controlled render (FE)** | output-encoded; no `dangerouslySetInnerHTML`/`v-html`/`innerHTML`/`eval` on non-constant input; no secret/token in client code; token not in `localStorage` | `frontend-render-security` |
50
+ | **User-controlled render (FE)** | output-encoded; no `dangerouslySetInnerHTML`/`v-html`/`innerHTML`/`eval` on non-constant input; no secret/token in client code; token not in `localStorage`. **This surface also carries the four completeness rows below — they are part of it, not an optional extra.** | `frontend-render-security` |
51
51
  | **Third-party asset in shipped markup / CSS** | delivery is self-hosted through the project's own route (framework font/asset primitive, bundled package, or locally-served file) — a font/icon/stylesheet CDN link transmits the **visitor's IP** to that third party on every page view; a hotlink only on a stated consumer opt-in; `integrity` + `crossorigin` if a CDN link stays | `design-fidelity-mechanics` § Asset & imagery discipline (owner), `typography-system` |
52
52
  | **File / outbound fetch** | path confined to an allowed base; SSRF allow-list + private-IP block on user-supplied URLs; size limit; **explicit timeout** (no unbounded/default-infinite wait); server-side validation (never client-only) | `security`, `defense-in-depth` |
53
53
  | **Infra / IaC** | least-privilege (no `Action:*`/`Resource:*`); encryption at rest; no `0.0.0.0/0` to mgmt/DB ports; no hardcoded creds; scanner-verified, not `plan`-verified | `engineering-safety-floor`, `terraform`, `secrets-management` |
@@ -57,6 +57,32 @@ Run the row(s) for what you touched. The grep is a fast authoring-time backstop
57
57
  | **Concurrency / shared state** | check-then-act guarded (DB lock / atomic op / transaction — not a read-modify-write race); retried write carries an idempotency key; no unbounded parallel fan-out; shared mutable state synchronized | `source-discovery`, `security` |
58
58
  | **Test** | asserts general behavior; expected derived from inputs/seeded data, not hardcoded; boundary + error + abuse cases, not only happy path | `testing-anti-patterns`, `test-driven-development` |
59
59
 
60
+ ### Render surface — the completeness rows
61
+
62
+ Every row above is a **security** control. These four are the **completeness**
63
+ controls for the same surface — the states an agent most reliably omits, because
64
+ the prompt named the happy path and nothing else. A render that ships only the
65
+ populated state is not finished; it is one of four states written.
66
+
67
+ **The grep polarity is INVERTED here, and reading it the other way is the failure
68
+ mode this table has.** Above, zero hits is the pass. Below, **zero hits next to a
69
+ render that fetches or iterates is the prompt to look** — the state is probably
70
+ absent. A hit is not a pass either: the column is a `heuristic`, a locator for
71
+ code to read, never proof the state behaves. A framework abstraction can
72
+ implement all four correctly and match none of these patterns, and a codebase can
73
+ match all four while shipping a broken empty state.
74
+
75
+ | State | Assert on the render you wrote | Backstop grep (heuristic — zero hits is the prompt) |
76
+ |---|---|---|
77
+ | **Empty** | the zero-rows / no-results case renders a deliberate state, not a bare frame or a collapsed layout; it says what is missing and what the user can do next | `rg -n -e '\.length\s*[=<]' -e '\bisEmpty\b' -e 'count\(\)\s*[=<]' -e '\bempty\b'` — over the file that maps the collection |
78
+ | **Loading** | the pending case renders (skeleton, spinner, disabled control); no layout shift on arrival; the state is reachable from the actual async call, not only defined | `rg -n -e 'isLoading' -e 'isPending' -e 'isFetching' -e 'Skeleton' -e 'Spinner' -e 'aria-busy'` |
79
+ | **Error** | the failed case renders a recoverable state with a retry or a next step; the message carries no stack, secret or PII (the `frontend-render-security` row owns that half) | `rg -n -e 'isError' -e 'onError' -e 'ErrorBoundary' -e '\.catch\(' -e 'role="alert"'` |
80
+ | **Keyboard path** | every interactive element is reachable and operable by keyboard alone, with a visible focus ring; a click handler on a non-button element carries a role, `tabindex` and a key handler | `rg -n -e 'onClick' -e '@click' -e 'v-on:click'` lists the handlers, then `rg -n -e 'tabIndex' -e 'tabindex' -e 'onKeyDown' -e '@keydown' -e 'role='` on the same file — a handler with no match on the second is the prompt |
81
+
82
+ Route to `accessibility-auditor` for the keyboard row when the surface is more
83
+ than a handful of controls — this row asserts the path exists, it is not a WCAG
84
+ pass.
85
+
60
86
  ### Backstop greps (authoring-time, cross-stack)
61
87
 
62
88
  ```bash