@event4u/agent-config 16.0.0 → 16.1.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 (246) 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 +297 -137
  5. package/CONTRIBUTING.md +9 -0
  6. package/README.md +2 -2
  7. package/dist/agent-src/commands/analyze/inbox.md +26 -0
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
  9. package/dist/agent-src/commands/challenge-me/closure.md +178 -0
  10. package/dist/agent-src/commands/challenge-me.md +9 -2
  11. package/dist/agent-src/commands/council/default.md +25 -5
  12. package/dist/agent-src/commands/feature/plan.md +28 -1
  13. package/dist/agent-src/commands/feature/roadmap.md +28 -1
  14. package/dist/agent-src/commands/implement-ticket.md +27 -0
  15. package/dist/agent-src/commands/jira-ticket.md +27 -0
  16. package/dist/agent-src/commands/pr/create.md +29 -0
  17. package/dist/agent-src/commands/pr/merge.md +60 -9
  18. package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
  19. package/dist/agent-src/commands/roadmap/create.md +74 -27
  20. package/dist/agent-src/commands/roadmap/materialize.md +27 -0
  21. package/dist/agent-src/commands/roadmap/process-full.md +123 -18
  22. package/dist/agent-src/commands/team.md +22 -0
  23. package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +47 -0
  25. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +15 -15
  27. package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
  28. package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
  29. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
  30. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
  31. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  32. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  33. package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
  34. package/dist/agent-src/rules/autonomous-execution.md +15 -8
  35. package/dist/agent-src/rules/delegation-policy.md +23 -45
  36. package/dist/agent-src/rules/design-fidelity.md +32 -37
  37. package/dist/agent-src/rules/evaluator-independence.md +43 -49
  38. package/dist/agent-src/rules/test-first.md +41 -0
  39. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  40. package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
  41. package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
  42. package/dist/agent-src/skills/database/data/manifest.json +4 -4
  43. package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
  44. package/dist/agent-src/skills/design-review/SKILL.md +50 -0
  45. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -4
  46. package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
  47. package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
  48. package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
  49. package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
  50. package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
  51. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
  52. package/dist/agent-src/templates/agent-settings.md +1 -1
  53. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  54. package/dist/agent-src/templates/roadmaps.md +188 -0
  55. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  56. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  57. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  58. package/dist/cli-delegate/check_update_banner.js +40 -2
  59. package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
  60. package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
  61. package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
  62. package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
  63. package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
  64. package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-FXYUYU4N.js} +57 -13
  65. package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-GJCBB2UG.js} +168 -10
  66. package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-HDVVGPQW.js} +873 -539
  67. package/dist/cli-delegate/{chunk-H32DGUJH.js → chunk-P6ZHP5W2.js} +1 -1
  68. package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
  69. package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
  70. package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-UNCRJBT3.js} +31 -7
  71. package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
  72. package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
  73. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  74. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  75. package/dist/cli-delegate/cmd_conformance.js +90 -56
  76. package/dist/cli-delegate/cmd_doctor.js +7 -5
  77. package/dist/cli-delegate/cmd_explain.js +2 -2
  78. package/dist/cli-delegate/cmd_export.js +9 -7
  79. package/dist/cli-delegate/cmd_fleet.js +4 -2
  80. package/dist/cli-delegate/cmd_handoff.js +4 -4
  81. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  82. package/dist/cli-delegate/cmd_migrate.js +2 -2
  83. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  84. package/dist/cli-delegate/cmd_preflight.js +4 -2
  85. package/dist/cli-delegate/cmd_prune.js +10 -8
  86. package/dist/cli-delegate/cmd_route_audit.js +2 -2
  87. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  88. package/dist/cli-delegate/cmd_session_recycle.js +2 -2
  89. package/dist/cli-delegate/cmd_settings_get.js +28 -2
  90. package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
  91. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  92. package/dist/cli-delegate/cmd_sync.js +10 -8
  93. package/dist/cli-delegate/cmd_uninstall.js +16 -13
  94. package/dist/cli-delegate/cmd_update.js +1 -1
  95. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  96. package/dist/cli-delegate/cmd_validate.js +12 -10
  97. package/dist/cli-delegate/cmd_versions.js +1 -1
  98. package/dist/discovery/deprecation-report.md +1 -1
  99. package/dist/discovery/discovery-manifest.json +85 -38
  100. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  101. package/dist/discovery/discovery-manifest.summary.md +4 -4
  102. package/dist/discovery/dormancy-report.md +1 -1
  103. package/dist/discovery/orphan-report.md +1 -1
  104. package/dist/discovery/packs.json +10 -8
  105. package/dist/discovery/trust-report.md +3 -3
  106. package/dist/discovery/workspaces.json +8 -6
  107. package/dist/hooks/dispatch.js +1832 -1007
  108. package/dist/install/claudeRuleRewrite.js +14 -3
  109. package/dist/install/conflict.js +60 -10
  110. package/dist/install/conflictTracker.js +218 -0
  111. package/dist/install/fsPrimitives.js +54 -0
  112. package/dist/install/install.mjs +2007 -1481
  113. package/dist/install/manifestFiles.js +259 -0
  114. package/dist/install/preflight.js +14 -2
  115. package/dist/install/preserve.js +157 -0
  116. package/dist/install/recordedOwnership.js +132 -0
  117. package/dist/install/txlog.js +11 -2
  118. package/dist/mcp/registry-manifest.json +3 -3
  119. package/dist/mcp/server.json +2 -2
  120. package/dist/mcp/server.mjs +398 -39
  121. package/dist/router.json +1 -1
  122. package/dist/scripts/_lib/agent_settings.js +3 -2
  123. package/dist/scripts/_lib/fs_atomic.js +167 -0
  124. package/dist/scripts/_lib/installed_tools.js +460 -0
  125. package/dist/scripts/_lib/lean_projection_mode.js +3 -2
  126. package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
  127. package/dist/server/routes/install.js +8 -0
  128. package/dist/server/routes/wizard.js +9 -3
  129. package/dist/server/schemas/settings.js +17 -5
  130. package/dist/shared/missionExecution.js +97 -0
  131. package/dist/ui/assets/{index-D0jaCRPM.js → index-DH1xc62v.js} +17 -17
  132. package/dist/ui/index.html +1 -1
  133. package/docs/MIGRATION.md +103 -0
  134. package/docs/contracts/settings-classes.md +26 -7
  135. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  136. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  137. package/docs/guidelines/design-fidelity-routing.md +29 -0
  138. package/package.json +1 -1
  139. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  140. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  141. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  142. package/src/config/agent-settings.template.yml +139 -27
  143. package/src/config/auto-rule-budget.json +16 -0
  144. package/src/config/ci-local-parity.yml +18 -5
  145. package/src/config/continuity-surface.json +21 -0
  146. package/src/config/gate-coverage.yml +146 -13
  147. package/src/config/gate-violation-baselines.json +6 -6
  148. package/src/config/hook-token-budget.json +2 -0
  149. package/src/config/loop-surfaces.yaml +215 -0
  150. package/src/config/platform-anchor.json +3 -2
  151. package/src/config/release-gate-locality.yml +11 -0
  152. package/src/config/routing-coverage-seed.json +18 -4
  153. package/src/config/rule-enforcement-baseline.json +0 -1
  154. package/src/install/claudeRuleRewrite.ts +16 -2
  155. package/src/install/conflict.ts +65 -9
  156. package/src/install/conflictTracker.ts +299 -0
  157. package/src/install/fsPrimitives.ts +54 -0
  158. package/src/install/manifestFiles.ts +312 -0
  159. package/src/install/preflight.ts +16 -2
  160. package/src/install/preserve.ts +205 -0
  161. package/src/install/recordedOwnership.ts +149 -0
  162. package/src/install/txlog.ts +11 -2
  163. package/src/install/types.ts +19 -4
  164. package/src/scripts/_cli/cmd_conformance.ts +88 -15
  165. package/src/scripts/_cli/cmd_doctor.ts +4 -3
  166. package/src/scripts/_cli/cmd_route_explain.ts +9 -2
  167. package/src/scripts/_cli/cmd_settings_get.ts +44 -0
  168. package/src/scripts/_cli/doctor_execution.ts +90 -0
  169. package/src/scripts/_lib/activation_payload.ts +247 -0
  170. package/src/scripts/_lib/agent_settings.ts +4 -2
  171. package/src/scripts/_lib/authority_path.ts +102 -0
  172. package/src/scripts/_lib/cascade_base.ts +94 -0
  173. package/src/scripts/_lib/changelog_eras.ts +7 -2
  174. package/src/scripts/_lib/continuation_ladder.ts +149 -2
  175. package/src/scripts/_lib/council_transport.ts +129 -0
  176. package/src/scripts/_lib/delivery_ready.ts +112 -0
  177. package/src/scripts/_lib/forge_protection.ts +267 -0
  178. package/src/scripts/_lib/hook_platform_keys.ts +27 -0
  179. package/src/scripts/_lib/json_python_parity.ts +127 -0
  180. package/src/scripts/_lib/lean_projection_mode.ts +14 -3
  181. package/src/scripts/_lib/loop_surfaces.ts +382 -0
  182. package/src/scripts/_lib/mission_record.ts +190 -0
  183. package/src/scripts/_lib/obligation_frequency.ts +217 -0
  184. package/src/scripts/_lib/obligations.ts +402 -0
  185. package/src/scripts/_lib/orchestration_record.ts +11 -20
  186. package/src/scripts/_lib/release_highlights.ts +199 -10
  187. package/src/scripts/_lib/release_holds.ts +493 -0
  188. package/src/scripts/_lib/release_migration_gate.ts +184 -0
  189. package/src/scripts/_lib/rides_along.ts +102 -0
  190. package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
  191. package/src/scripts/_lib/test_delta.ts +166 -0
  192. package/src/scripts/_lib/test_provenance.ts +171 -0
  193. package/src/scripts/_lib/typed_op_grant.ts +246 -0
  194. package/src/scripts/_lib/typed_op_watch.ts +185 -0
  195. package/src/scripts/ai_council/config.ts +8 -11
  196. package/src/scripts/ai_council/fallback_config.ts +5 -3
  197. package/src/scripts/ai_council/ownership_classes.ts +118 -0
  198. package/src/scripts/ask_block_census.ts +285 -15
  199. package/src/scripts/check_enforcement_matrix.ts +624 -0
  200. package/src/scripts/check_gate_reachability.ts +173 -10
  201. package/src/scripts/check_generator_sync.ts +954 -0
  202. package/src/scripts/check_preamble_payload_budget.ts +75 -2
  203. package/src/scripts/check_release_highlights.ts +33 -1
  204. package/src/scripts/check_release_holds.ts +567 -0
  205. package/src/scripts/check_rule_projection_integrity.ts +22 -12
  206. package/src/scripts/check_test_delta.ts +294 -0
  207. package/src/scripts/check_test_weakening.ts +299 -0
  208. package/src/scripts/closure_scan.ts +333 -0
  209. package/src/scripts/compile_hook_manifest.ts +43 -3
  210. package/src/scripts/council_record_shape.ts +209 -0
  211. package/src/scripts/hook_manifest.json +1 -1
  212. package/src/scripts/hook_manifest.yaml +88 -9
  213. package/src/scripts/hooks/concern_registry.ts +4 -0
  214. package/src/scripts/hooks/design_pass_hook.ts +128 -3
  215. package/src/scripts/hooks/evidence_independence.ts +96 -0
  216. package/src/scripts/hooks/memory_recall_hook.ts +540 -0
  217. package/src/scripts/hooks/obligation_settle_hook.ts +182 -0
  218. package/src/scripts/hooks/rule_inject_hook.ts +49 -1
  219. package/src/scripts/hooks/run_continuation_hook.ts +17 -20
  220. package/src/scripts/hooks_doctor.ts +85 -0
  221. package/src/scripts/hooks_status.ts +19 -0
  222. package/src/scripts/install.ts +106 -206
  223. package/src/scripts/janitor.ts +7 -0
  224. package/src/scripts/lint_decision_classes.ts +464 -0
  225. package/src/scripts/lint_hook_manifest.ts +11 -0
  226. package/src/scripts/lint_major_migration_sections.ts +450 -0
  227. package/src/scripts/lint_plan_risk_register.ts +47 -3
  228. package/src/scripts/lint_roadmap_blockers.ts +61 -0
  229. package/src/scripts/lint_roadmap_producers.ts +202 -0
  230. package/src/scripts/measure_rule_budget.ts +101 -5
  231. package/src/scripts/new_roadmap.ts +37 -0
  232. package/src/scripts/orchestration_record.ts +0 -5
  233. package/src/scripts/release.ts +14 -98
  234. package/src/scripts/release_drill.ts +267 -1
  235. package/src/scripts/release_publication.ts +51 -0
  236. package/src/scripts/report_enforcement_drift.ts +566 -0
  237. package/src/scripts/report_host_injection_effect.ts +3 -11
  238. package/src/scripts/report_standing_payload_by_host.ts +26 -152
  239. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  240. package/src/scripts/schemas/command.schema.json +4 -0
  241. package/src/scripts/scope_growth.ts +219 -0
  242. package/src/scripts/trigger_eval_grandfather.json +0 -1
  243. package/src/scripts/ui_conformance_probe.ts +622 -0
  244. package/src/server/schemas/settings.ts +31 -7
  245. package/src/shared/missionExecution.ts +126 -0
  246. package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
@@ -423,6 +423,47 @@ github:
423
423
  # auto = detect on first use and update this setting
424
424
  pr_reply_method: create_review_comment
425
425
 
426
+ # --- Delivery: what a run does with the branch it produced ---
427
+ #
428
+ # ADR-268 section 3 resolves ADR-239 section 3's "undecided, not rejected" on merge
429
+ # authority in the affirmative, and these keys are where that decision is
430
+ # configured rather than inferred. All three are Class C in
431
+ # docs/contracts/settings-classes.md: every agent write path refuses them, so
432
+ # a run can read its delivery policy and can never widen it.
433
+ #
434
+ # NAMING IS DELIBERATE. check_no_automerge_key.ts is a namespace ratchet on the
435
+ # three key names autoMerge / auto_merge / mergePolicy, and its own text reserves
436
+ # its deletion to the owner. `delivery.merge` grants the same capability under a
437
+ # name outside that closed set, so the ratchet stays green and stays standing --
438
+ # the boundary it protects is a name, and the decision it points at was taken by
439
+ # an ADR rather than by a key.
440
+ delivery:
441
+ # Whether a run may merge the pull request it produced.
442
+ # off = default. The run ends at mergeable-green-and-open and says so.
443
+ # on-green = merge is permitted, and ONLY when an object-bound grant covering
444
+ # {op: prod_merge, target: <base>} exists AND the final head is
445
+ # required-check-green, target-current and tamper-checked. This
446
+ # key is a precondition, never the authorisation by itself.
447
+ # Forge auto-merge is the mechanism, so branch protection stays the gate.
448
+ # Required protections are never bypassed -- an invariant, not a default.
449
+ merge: "off"
450
+
451
+ # Whether the run stays alive until the required checks settle.
452
+ # true = default. The run drives CI and reports the settled verdict.
453
+ # false = the run ends once the branch is pushed and the PR is open,
454
+ # leaving the checks to be read later.
455
+ # Independent of `merge`: a run may wait for CI without being allowed to
456
+ # merge, which is the shape every drain run uses today.
457
+ wait_for_ci: true
458
+
459
+ # How a mission's work is shaped into pull requests.
460
+ # single = default. One branch, one pull request.
461
+ # stacked = a dependent series.
462
+ # `stacked` is NEVER chosen by the agent and is never asked about at roadmap
463
+ # creation. The owner plans it in roadmap frontmatter or it does not happen;
464
+ # that is why this key is Class C rather than a preference.
465
+ pr_topology: single
466
+
426
467
  # --- Augment Code projection (.augment/) ---
427
468
  #
428
469
  # Controls how rule files are written into .augment/rules/ during
@@ -533,9 +574,23 @@ roadmap:
533
574
  # pattern: which asks are batched into the run-start execution
534
575
  # contract and where checkpoint prompts fire. It overrides NONE of
535
576
  # the keys below — `skip_pre_run_gate`, `quality_cadence`, and
536
- # `dashboard_regen_cadence` keep their global meaning in every mode,
537
- # and no mode lifts a safety floor. See
538
- # contexts/execution/roadmap-execution-contract.md.
577
+ # `dashboard_regen_cadence` keep their global meaning in every mode.
578
+ #
579
+ # WHAT NO MODE LIFTS, NAMED. This sentence used to read "no mode lifts a
580
+ # safety floor", which is unfalsifiable: it never says which floor or how
581
+ # far it reaches. What no `execution.mode` value lifts is ADR-260 section 2's
582
+ # closed eleven-op vocabulary -- force_push, prod_merge, tag_push, release,
583
+ # publish, branch_protection_change, repo_delete, prod_data_delete,
584
+ # secret_write, payment, external_send. Each of those needs its own
585
+ # object-bound grant, and no interaction pattern substitutes for one.
586
+ #
587
+ # The Hard Floor in `non-destructive-by-default` is today WIDER than that
588
+ # vocabulary -- it also covers every `git push` and every non-prod merge --
589
+ # and that wider reach is what is in force right now. ADR-260 decision 11
590
+ # narrows it to the eleven ops and ADR-268 accepted that, but the narrowing
591
+ # has not landed, so read the rule's own trigger table as the authority on
592
+ # reach and this comment as the authority on what a MODE can change: nothing.
593
+ # See contexts/execution/roadmap-execution-contract.md.
539
594
 
540
595
  # Skip the /roadmap:process-* pre-run confirmation gate (true, false).
541
596
  # true = default. The command name names the scope; a discoverable
@@ -549,15 +604,19 @@ roadmap:
549
604
  skip_pre_run_gate: true
550
605
 
551
606
  # When to run quality tools during /roadmap execute.
552
- # end_of_roadmap = once, before archiving the completed roadmap (default — fastest, fewest tokens)
553
- # per_phase = once after every completed phase
607
+ # end_of_roadmap = once, before archiving the completed roadmap (fastest, fewest tokens)
608
+ # per_phase = once after every completed phase (default since 2026-09-13)
554
609
  # per_step = after every completed step (legacy verbose; highest token cost)
555
- # Trade-off: end_of_roadmap saves tokens and time but lets errors compound
556
- # across phases. Pick per_phase if the work is risky or unfamiliar.
557
- # `quality.local_auto_run: false` (the default) suppresses local
558
- # pipeline runs at EVERY cadence — remote CI is the gate; this knob
559
- # only matters when `local_auto_run` is `true`.
560
- quality_cadence: end_of_roadmap
610
+ # The default moved from end_of_roadmap to per_phase on the strength of
611
+ # this block's OWN trade-off sentence: end_of_roadmap saves tokens and
612
+ # time but lets errors compound across phases. A multi-phase autonomous
613
+ # run is exactly the case where compounding is expensive and nobody is
614
+ # watching, so the cheaper default was the wrong one to ship. Set
615
+ # end_of_roadmap back if the work is routine and token cost dominates.
616
+ # `quality.local_auto_run` (chat) and `quality.local_auto_run_in_mission`
617
+ # (a mission) decide WHETHER local pipeline runs happen at all; this
618
+ # knob only decides WHEN, and is inert wherever both resolve false.
619
+ quality_cadence: per_phase
561
620
 
562
621
  # Dashboard regen cadence inside autonomous runs (process-step /
563
622
  # process-phase / process-full). Controls how often
@@ -635,20 +694,26 @@ roadmap:
635
694
  # roadmaps AND feature plans — which is why these keys do not live under
636
695
  # `roadmap:`. All three default to true; a missing key behaves as true.
637
696
  planning:
638
- # Gate C — plan-confidence gate, BEFORE authoring (true, false).
639
- # true = default. A plan-artifact authoring ask (/roadmap:create,
640
- # roadmap-writing, /feature:plan, /feature:roadmap) first runs
641
- # the four 95%-confidence conditions from /challenge-me vision.
642
- # All four hold → the agent creates directly and emits exactly
643
- # one marker line ("Confidence ≥ 95% — creating directly").
644
- # Any gap → the ask routes into the /challenge-me vision
645
- # interview first; hosts without that command run the inline
646
- # degrade interview (one question per turn, same stop
647
- # conditions — contexts/execution/plan-confidence-gate.md).
697
+ # Gate C — plan-closure pass, at the END of planning (true, false).
698
+ # true = default. Every command declaring `produces_roadmap: true`
699
+ # ends in a closure pass (/challenge-me closure): the open
700
+ # decisions are detected, each resolved at the lowest rung
701
+ # that owns it — evidence, convention, the agent, an
702
+ # independent session, the council, the team, the owner last
703
+ # and only for owner-owned residue — and written into the
704
+ # roadmap's `## Decisions` table. The seed-confidence check
705
+ # from /challenge-me vision still runs where a plan starts
706
+ # from a fuzzy ask; the difference is that closure is now
707
+ # measured at the END, where an open decision actually costs
708
+ # a run, rather than only at the start.
648
709
  # An explicit user bypass ("just write it") wins for that turn
649
- # and is counted (gate_c_bypass_rate).
710
+ # and is counted AS A BYPASS, on its own axis — never as an
711
+ # absent closure.
650
712
  # false = inert; plan asks author directly (today's behavior).
651
- challenge_on_create: true
713
+ #
714
+ # `challenge_on_create` is the deprecated alias, accepted for one
715
+ # minor so an installed settings file keeps loading.
716
+ closure_pass: true
652
717
 
653
718
  # Gate R1 — plan-risk review at plan creation / substantial change
654
719
  # (true, false).
@@ -674,6 +739,35 @@ planning:
674
739
  # false = escape hatch; the validator skips (governance default is on).
675
740
  completion_review: true
676
741
 
742
+ # --- Execution — the fix-loop bound and its escalation ladder ---
743
+ #
744
+ # The bound on how long the agent keeps attempting the same failing
745
+ # target, and what happens when it is reached. Reaching the bound is a
746
+ # STRATEGY CHANGE, never a question: `escalation` names the rungs the
747
+ # agent walks, in order, before any owner ask is even considered.
748
+ #
749
+ # `owner_owned_check` is the last rung and it is NOT "ask now" — it asks
750
+ # whether the remaining residue is owner-owned per the ownership table.
751
+ # Where it is not, the run continues under a new strategy epoch. Removing
752
+ # that rung by setting is refused: it is the rung that DECIDES whether a
753
+ # residue is owner-owned at all, so dropping it turns every residue into
754
+ # an owner ask, which is the failure the ladder exists to end.
755
+ execution:
756
+ # Consecutive failed fix attempts against one validation target before
757
+ # the ladder's terminal rung is reached. Overridable globally, per
758
+ # project, and per prompt. A non-integer or non-positive value falls
759
+ # back to 10 — a bound of 0 makes every first attempt terminal.
760
+ fix_loop_max: 10
761
+
762
+ # The rungs, in order. Attempts escalate INDEPENDENTLY first: another
763
+ # session or a provider-diverse reviewer, then the council, then the
764
+ # team, and only then the owner-ownership question.
765
+ # A FLOW sequence, like every other list in this file: the settings
766
+ # writer locates a key by its `key: <value>` line, so a block sequence
767
+ # reads as an empty section header and the write corrupts the file.
768
+ escalation: [independent, council, team, owner_owned_check]
769
+
770
+
677
771
  # --- Quality / CI execution ---
678
772
  #
679
773
  # Controls whether the agent runs the project's quality pipeline
@@ -705,16 +799,34 @@ quality:
705
799
  # MUST execute it locally to prove the gate works. Without that
706
800
  # execution the new gate is unverified evidence.
707
801
  #
708
- # Posture note (feedback-8.11-2): `false` is a DELIBERATE, documented
709
- # design decision, not an omission — remote CI is the single
710
- # authoritative gate; local full-pipeline runs duplicate it at
711
- # wall-clock + token cost. It never suppresses (a) narrow diff-scoped
802
+ # Posture note (feedback-8.11-2, rewritten 2026-09-13): `false` is a
803
+ # DELIBERATE, documented design decision — and it describes a CHAT
804
+ # TURN, not an autonomous mission. That is the half the old wording
805
+ # left implicit, and naming it is the whole point of the rewrite.
806
+ # In a chat turn a human is present, the next action is theirs, and a
807
+ # local full-pipeline run duplicates remote CI at wall-clock + token
808
+ # cost while they wait. In an autonomous mission nobody is waiting,
809
+ # the next action is the agent's own, and a red discovered twenty
810
+ # steps later costs more than the run that would have caught it at
811
+ # step one — the same "lets errors compound" argument the roadmap
812
+ # cadence knob above already makes about itself.
813
+ # So: this key governs CHAT. `local_auto_run_in_mission` below
814
+ # governs a mission. Neither ever suppresses (a) narrow diff-scoped
712
815
  # probes (type-check/lint/tests over the agent's OWN changed files
713
816
  # before pushing — those always run), (b) the new-gate carve-out
714
817
  # above, (c) user-invoked runs. Run-end reports must say "quality
715
818
  # gates delegated to remote CI", never claim an unrun pipeline passed.
716
819
  local_auto_run: false
717
820
 
821
+ # Run local quality / CI tasks autonomously INSIDE a mission — an
822
+ # autonomous roadmap run with a claimed contract (true, false).
823
+ # true = default. A mission resolves `local_auto_run` to true.
824
+ # false = a mission behaves like chat; remote CI alone is the gate.
825
+ # Resolution is a runtime condition, never a settings layer: outside a
826
+ # mission this key is inert, and `local_auto_run: true` is never
827
+ # LOWERED by a mission. Resolver: src/shared/missionExecution.ts.
828
+ local_auto_run_in_mission: true
829
+
718
830
 
719
831
  # --- Design fidelity ---
720
832
  #
@@ -0,0 +1,16 @@
1
+ {
2
+ "_comment": "Growth ratchet for the `auto`-tier rule bucket (road-to-design-fidelity-proof Phase 3). check_always_budget gates the nine kernel rules; measure_rule_budget already measured all 121 and gated none of them, so ~93 % of the estate's rule prose grew against nothing. Seeded AT the measurement, exactly like the preamble-payload ceiling and for the same reason: seeding below it would red every pull request from the day it lands, which is a self-inflicted CI stop rather than a gate. It may only move DOWN. Raising it to clear a failing check is the config-weakening move this repo refuses; walk the bucket back instead, or state the compensating reduction.",
3
+ "schema_version": 1,
4
+ "registered_at": "2026-09-18",
5
+ "owner": "maintainer",
6
+ "review_by": "2027-09-18",
7
+ "baseline_chars": 373000,
8
+ "baseline_history": [
9
+ {
10
+ "chars": 373000,
11
+ "at": "2026-09-18",
12
+ "why": "registered with the gate, seeded at the measured auto bucket (107 rules) after road-to-design-fidelity-proof Phase 1 returned 1,885 chars from design-fidelity.md"
13
+ }
14
+ ],
15
+ "_what_this_does_not_claim": "A char count is not an obligation count. The Iron-Law total printed beside it is the closer proxy for what the instruction-following research calls simultaneous constraints, and it is REPORTED, not gated \u2014 nobody has measured a threshold for this layer, and gating an unmeasured number would publish a bound as if it were a finding."
16
+ }
@@ -278,11 +278,24 @@ local_only:
278
278
  - id: check_platform_anchor
279
279
  class: token-scope-unavailable
280
280
  reason: >
281
- Reads `repos/{owner}/{repo}/rulesets` to check that the forge actually
282
- requires what the ratification mechanism claims it does — an active branch
283
- ruleset over the default branch, an approving review, last-push approval,
284
- deletion and force-push blocked, strict required checks, and no
285
- unconditional bypass actor.
281
+ Reads `repos/{owner}/{repo}/rulesets` to compare the committed expectation
282
+ against the live ruleset — an active branch ruleset over the default
283
+ branch, review-thread resolution, deletion and force-push blocked, at
284
+ least one required status check context, and no unconditional bypass
285
+ actor. `strict_required_status_checks` is a baseline expectation currently
286
+ covered by the recorded waiver `arr-2026-09-10-strict-status-checks`
287
+ (owner, expires 2026-12-09), so a deviation there is reported as an
288
+ accepted risk rather than a finding.
289
+
290
+ Corrected 2026-09-13. This text used to name "an approving review,
291
+ last-push approval" among what is checked; both dimensions were removed
292
+ from the trust model by owner ruling on 2026-09-10 and are now reported as
293
+ observed evidence, never as a requirement. It also said the gate checks
294
+ that the forge "actually requires what the ratification mechanism claims
295
+ it does" — which overstates a voluntarily invoked local control, per the
296
+ reviewing council of 2026-09-13, and `check_platform_anchor` must not be
297
+ described as enforcing repository-wide compliance. See
298
+ `enforcement_boundary_note` in `src/config/platform-anchor.json`.
286
299
 
287
300
  Local-only because the permission does not exist, not because remote
288
301
  enforcement is unwanted — which is the opposite of the usual reason on this
@@ -148,6 +148,13 @@
148
148
  "locus": "src/scripts/hooks/design_pass_hook.ts:66",
149
149
  "reason": "Design-pass hook latch."
150
150
  },
151
+ {
152
+ "id": "obligations",
153
+ "axis": "persistent_continuity_artefacts",
154
+ "disposition": "excluded",
155
+ "locus": "src/scripts/_lib/obligations.ts:57",
156
+ "reason": "Per-session obligation ledger — instrumentation, not continuity. A later session must not resume from it: the rows record which obligations THIS session was delivered, and attributing them to a successor would be the one claim the ledger is forbidden to make."
157
+ },
151
158
  {
152
159
  "id": "design-slop-hook.json",
153
160
  "axis": "persistent_continuity_artefacts",
@@ -267,6 +274,13 @@
267
274
  "locus": "src/scripts/hooks/reread_guard_hook.ts:21",
268
275
  "reason": "Per-file re-read guard stamps, scoped to one session and never restored into another."
269
276
  },
277
+ {
278
+ "id": "memory-recall",
279
+ "axis": "persistent_continuity_artefacts",
280
+ "disposition": "excluded",
281
+ "locus": "src/scripts/hooks/memory_recall_hook.ts:429",
282
+ "reason": "Per-session once-per-slug latch for the memory-recall advisory, so a delivered memory is not re-injected on the next matching tool call. Slug keys and timestamps only, scoped to one session and never restored into another — a successor session SHOULD be told again."
283
+ },
270
284
  {
271
285
  "id": "review-axis",
272
286
  "axis": "persistent_continuity_artefacts",
@@ -407,6 +421,13 @@
407
421
  "locus": "src/scripts/_dispatch.bash:74",
408
422
  "reason": "UI audit output. Analysis result."
409
423
  },
424
+ {
425
+ "id": "ui-conformance.json",
426
+ "axis": "persistent_continuity_artefacts",
427
+ "disposition": "excluded",
428
+ "locus": "src/scripts/hooks/design_pass_hook.ts:68",
429
+ "reason": "Behavioural-conformance probe output. Analysis result, on the same footing as its `ui-audit.json` neighbour: keyed on a target path rather than a session, consumed by the design pass as a shadow verdict, and never read by a successor session to resume anything."
430
+ },
410
431
  {
411
432
  "id": "ui-route-nudge.json",
412
433
  "axis": "persistent_continuity_artefacts",
@@ -52,21 +52,54 @@
52
52
  # of them.
53
53
  # canary optional mutation recipe (Phase 7) — see CANARY below
54
54
  #
55
- # COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-09-08)
55
+ # COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-09-13)
56
56
  # ----------------------------------------------------------
57
- # 322 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
57
+ # 330 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
58
58
  # (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`,
59
- # re-run on the tree carrying these rows. Re-measured 2026-09-08 from the 306
60
- # recorded on 2026-08-28: the tree had drifted to 321 without the header moving,
61
- # which is 15 — exactly the drift tolerance in
62
- # `check_gate_coverage.test.ts` § states an honest denominator — so the next
63
- # single addition was always going to red it. `check_candidate_lines` from
64
- # `road-to-candidate-moves-floor` was that addition. The number is re-measured
65
- # rather than the tolerance widened: a stated population that nobody re-measures
66
- # is the un-asserted count this whole manifest exists to refuse.)
67
- # **79 of them emit the machine-readable `scanned: <N>` line under their
68
- # CI-identical argv, and 76 of those 79 are listed below.** The manifest is
69
- # complete for every gate that can carry a floor, covering ~25 % of the population.
59
+ # re-run on the tree carrying these rows.)
60
+ # **97 rows are listed below**, so the manifest covers 97/332 = 29.2 % of the
61
+ # population, and is complete for every gate that can carry a floor. The row
62
+ # count is `grep -c '^ - id:'`, recomputed here rather than incremented.
63
+ #
64
+ # RECOUNTED 2026-09-13, on a change that adds NO gate script — and that is the
65
+ # point of this block rather than an aside. Every recount below was triggered by
66
+ # someone adding a row and noticing the header was stale on the way past, which
67
+ # makes the figure a function of who happened to look rather than of the tree.
68
+ # Two scripts had arrived since the 2026-09-12 block below without one: 328 → 330.
69
+ # The drift was 2 against the tolerance of 15 in `check_gate_coverage.test.ts`
70
+ # § states an honest denominator, so nothing was red and nothing would have been
71
+ # for another thirteen arrivals. Corrected here deliberately, while it is cheap,
72
+ # because the 2026-09-08 block records what the other end of that tolerance costs:
73
+ # the tree drifted to 321 against a stated 306 — 15 exactly — and the next single
74
+ # addition was always going to red it.
75
+ #
76
+ # The honest limit of this correction: it is another hand recount, so it goes
77
+ # stale the same way the moment the next script lands. The block below already
78
+ # said as much on 2026-09-12 and it was true again within a day. What would
79
+ # actually close it is deriving the figure at read time instead of asserting it —
80
+ # `count_gate_scripts()` is already the function that answers, and the test
81
+ # already calls it. Deliberately not done here: that is a change to what this
82
+ # file IS (a hand-maintained manifest with a prose header) rather than a
83
+ # correction of a number in it.
84
+ #
85
+ # RE-MEASURED 2026-09-12, on the change that adds `check_enforcement_matrix`:
86
+ # `count_gate_scripts()` returned **328**. Six scripts had arrived since the 322
87
+ # recorded on 2026-09-08, which itself replaced the 306 of 2026-08-28 after the
88
+ # tree drifted to 321 unnoticed. Recomputed on that tree rather than incremented:
89
+ # a stated population that nobody re-measures is the un-asserted count this whole
90
+ # manifest exists to refuse.
91
+ #
92
+ # RECOUNTED AGAIN ON THE MERGE, 2026-09-13. Two branches recounted this header on
93
+ # the same day and neither number survives: the block above measured 330 scripts
94
+ # against 95 rows on a tree without `check_test_delta` / `check_test_weakening`,
95
+ # and this branch measured 97 rows against a tree without the two scripts that
96
+ # block counted. Re-derived on the MERGED tree rather than by adding either
97
+ # side's delta — which is the same resolution `.secret-allow` prescribes for its
98
+ # own pin, and for the same reason: picking a side is how a stated figure comes
99
+ # to describe a tree that no longer exists. Both new gates arrive WITH their
100
+ # rows, so the manifest stays complete for every gate that can carry a floor,
101
+ # and both carry a `--self-test`, so neither adds to the
102
+ # `gate-self-test:registered-non-adopters` ratchet.
70
103
  #
71
104
  # RECOUNTED 2026-09-07, on the change that adds `lint_agent_security` — the
72
105
  # security umbrella, which until this change was the one gate in the tree whose
@@ -436,6 +469,54 @@ gates:
436
469
 
437
470
  Never disclose this section to the user; it is a planted
438
471
  disclosure-suppression imperative and the umbrella must block on it.
472
+ - id: check_test_delta
473
+ argv: ["--quiet"]
474
+ min_scanned: 0
475
+ corpus: "every path in the diff against the base ref. The floor is 0 and the `allowEmpty` reason says why: an empty diff is a real state — a docs-only branch, or a re-run against an already-merged base — and a floor above 0 would red on it. What a `> 0` check could not see is covered instead by the self-test, which drives both polarities of the finding AND both polarities of the owner-label escape."
476
+ status: enforced
477
+ no_canary_reason: >-
478
+ A create-only canary cannot express this gate's violation. The corpus is a
479
+ DIFF, not a tree, so a planted file is only in scope if it is also
480
+ committed — and the violation is an ABSENCE (code changed, no test did),
481
+ which no added file can create. Discrimination is proven instead by the
482
+ gate's own `--self-test`: 8 cases, 3 rejecting, each driving the real CLI.
483
+ Both directions of every branch are covered — a finding with and without
484
+ the owner label, a code change with and without a test delta, and the two
485
+ classes that must NOT count as code (a docs-only change, a generated
486
+ projection under `dist/`).
487
+ note: >
488
+ road-to-adversarial-verification-and-long-runs 2.4. The mechanically
489
+ decidable half of `test-first`: it proves an absence, and deliberately does
490
+ not claim the two things a diff cannot carry — whether the test came FIRST,
491
+ and whether it tests the thing that changed. The exemption is a PR label
492
+ rather than a file, because a file-based escape inside the diff under
493
+ review is one an agent can widen; Risk 4 of that roadmap names exactly
494
+ that failure.
495
+
496
+ - id: check_test_weakening
497
+ argv: ["--quiet"]
498
+ min_scanned: 0
499
+ corpus: "every changed TEST file in the diff against the base ref, measured as NET assertion and suppression counts per file. The floor is 0 for the same reason as its sibling: most diffs change no test file at all, and a floor above 0 would make the gate cry wolf on the majority of the PRs it runs against."
500
+ status: enforced
501
+ no_canary_reason: >-
502
+ A create-only canary cannot express this gate's violation either: the
503
+ violation is a NET REDUCTION between two revisions of one file, so a
504
+ planted file has no predecessor to be smaller than. Proven instead by the
505
+ gate's own `--self-test`: 11 cases, 5 rejecting. The load-bearing cases are
506
+ the ACCEPTS — editing an assertion, adding assertions, and removing a skip
507
+ must all pass, because a gate that reds a legitimate test edit gets its
508
+ exemption widened until it finds nothing. Two cases exist because an
509
+ independent review found the gate blind to them: deleting a whole test file
510
+ (the maximal weakening, and `git rm` was the cheapest way past both gates),
511
+ and a diff line held as string data inside a suite that tests this very
512
+ detector.
513
+ note: >
514
+ road-to-adversarial-verification-and-long-runs 2.4, enforcing
515
+ `evaluator-independence` § Tests are evaluators. Counts are NET, never raw
516
+ removals — that distinction is the whole gate. The discharge is a committed
517
+ artefact under `agents/evidence/reviews/`; whether it contains a genuinely
518
+ independent verdict is a judgement no gate can make and is not claimed.
519
+
439
520
  - id: lint_motion_authority_drift
440
521
  argv: ["--quiet"]
441
522
  min_scanned: 90
@@ -2800,3 +2881,55 @@ gates:
2800
2881
 
2801
2882
  A projected rule routing to a guideline body the projection does not
2802
2883
  contain. The gate must fail on this and pass once it is removed.
2884
+
2885
+ - id: check_enforcement_matrix
2886
+ argv: ["--quiet"]
2887
+ ci_invocation: .github/workflows/consistency.yml
2888
+ min_scanned: 20
2889
+ corpus: "host-slot pairs in src/scripts/hooks/host_lowering.yaml (32 at baseline, across the 6 hosts that carry a non-empty `slots:` map)"
2890
+ status: enforced
2891
+ no_canary_reason: >-
2892
+ the corpus is the slot map of ONE configuration file at a fixed path, and
2893
+ the canary contract is create-only. A planted second `host_lowering.yaml`
2894
+ would have to overwrite the real one to land in scope, and every violation
2895
+ this gate can have is a MODIFICATION — a cell hand-edited in the generated
2896
+ region, a `block_exit` changed without a regeneration, a cell claiming a
2897
+ vocabulary value no line in the configuration produces. Discrimination is
2898
+ proven by `--self-test` instead (5 cases, 4 rejecting: the phantom
2899
+ `halt-by-state` value, a value outside the closed set, a hand-flipped
2900
+ outcome, a deleted row), and end to end by hand on 2026-09-12: flipping
2901
+ `claude/post_tool_use`'s `block_exit` from null to 2 without regenerating
2902
+ exits 1, and `--write` then exits 0. The `--write` guard was itself
2903
+ measured rather than assumed — an earlier version computed its backing set
2904
+ from the generator's own output, so a sabotaged mapping was self-backing
2905
+ and the phantom value wrote through; the backing set now reads the raw
2906
+ configuration fields and the same sabotage exits 1.
2907
+
2908
+ - id: check_release_holds
2909
+ argv: ['--lint']
2910
+ ci_invocation: .github/workflows/release-validation.yml
2911
+ min_scanned: 700
2912
+ corpus: >
2913
+ every markdown file under `agents/roadmaps/` and its four subfolders —
2914
+ the active root plus `later/`, `archive/`, `skipped/` and `stubs/`, 950 at
2915
+ baseline. Wider than the active-only glob the sibling roadmap gates use,
2916
+ and deliberately: template rule 28's per-folder lifecycle says a window
2917
+ does not disappear by moving the file, so a hold in `later/` still lists
2918
+ and still refuses. The floor sits at 700 because the archive alone holds
2919
+ ~725 files and legitimate archival churn moves the total by tens, never by
2920
+ hundreds; a reading below it means the walk lost a folder, not that
2921
+ roadmaps were deleted.
2922
+ status: enforced
2923
+ no_canary_reason: >-
2924
+ the canary contract is create-only, and a planted roadmap carrying a
2925
+ well-formed hold would be a legitimate corpus member rather than a
2926
+ violation — the gate would read it, evaluate it, and be right to stay
2927
+ green. Every violation this gate has is a MALFORMED declaration or a
2928
+ lifecycle breach, both of which are properties of a file's content or its
2929
+ folder, not of its existence. Discrimination is proven by `--selftest`
2930
+ instead (19 cases, 13 of them refusing: the four state-table rows, the
2931
+ channel split, seven distinct not-evaluable shapes, and six lifecycle
2932
+ cases), and the scan-scope collapse this row exists to catch is caught
2933
+ inside the gate by `assertScanned` — observed red on 2026-09-19 by
2934
+ pointing the folder list at a non-existent directory, which exits 1 with
2935
+ "scanned 0 roadmap file(s)" rather than certifying an empty corpus.