@event4u/agent-config 14.7.0 → 14.9.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 (230) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +175 -390
  3. package/README.md +1 -1
  4. package/agents/templates/.ai-council.yml.example +34 -4
  5. package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
  6. package/dist/agent-src/commands/evals/roadmap.json +17 -1
  7. package/dist/agent-src/commands/pr/create.md +14 -2
  8. package/dist/agent-src/commands/pr/merge.md +383 -0
  9. package/dist/agent-src/commands/review/changes.md +95 -14
  10. package/dist/agent-src/commands/roadmap/process-full.md +157 -3
  11. package/dist/agent-src/commands/roadmap.md +1 -1
  12. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
  13. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
  14. package/dist/agent-src/contexts/execution/host-capability-manifest.md +77 -0
  15. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +100 -2
  16. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
  17. package/dist/agent-src/contexts/execution/subagent-response-contract.md +80 -0
  18. package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
  19. package/dist/agent-src/rules/decision-revisit-gate.md +65 -33
  20. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  21. package/dist/agent-src/rules/roadmap-progress-sync.md +19 -0
  22. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  23. package/dist/agent-src/rules/untrusted-input-defense.md +9 -3
  24. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +7 -4
  25. package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
  26. package/dist/agent-src/scripts/update_roadmap_progress.ts +47 -48
  27. package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
  28. package/dist/agent-src/skills/code-review/evals/evals.json +87 -46
  29. package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
  30. package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
  31. package/dist/agent-src/skills/humanizer/SKILL.md +39 -0
  32. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +57 -0
  33. package/dist/agent-src/skills/humanizer/references/fixtures.md +54 -0
  34. package/dist/agent-src/skills/judge-spec-compliance/SKILL.md +154 -0
  35. package/dist/agent-src/skills/judge-synthesis/SKILL.md +45 -0
  36. package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
  37. package/dist/agent-src/skills/roadmap-writing/SKILL.md +18 -18
  38. package/dist/agent-src/skills/security/SKILL.md +8 -0
  39. package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
  40. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  41. package/dist/agent-src/templates/roadmaps.md +28 -2
  42. package/dist/cli/registry.js +3 -0
  43. package/dist/cli/registry.js.map +1 -1
  44. package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-77GR3VD4.js} +68 -43
  45. package/dist/cli-delegate/{chunk-JZ4NR2TW.js → chunk-7PRE6ZV2.js} +1 -1
  46. package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-CYH5SP6M.js} +4 -23
  47. package/dist/cli-delegate/{chunk-Q26HT4QT.js → chunk-E46KPN6K.js} +251 -150
  48. package/dist/cli-delegate/{chunk-74E3TKWV.js → chunk-H4VIVD4C.js} +5 -5
  49. package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
  50. package/dist/cli-delegate/{chunk-4VR4ORQ6.js → chunk-LPPWO5CE.js} +4 -3
  51. package/dist/cli-delegate/{chunk-7F3VYSM2.js → chunk-PLSG6UL5.js} +14 -14
  52. package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
  53. package/dist/cli-delegate/cmd_conformance.js +101 -25
  54. package/dist/cli-delegate/cmd_converge.js +3 -3
  55. package/dist/cli-delegate/cmd_doctor.js +7 -7
  56. package/dist/cli-delegate/cmd_export.js +6 -6
  57. package/dist/cli-delegate/cmd_handoff.js +7 -6
  58. package/dist/cli-delegate/cmd_memory_get.js +2 -1
  59. package/dist/cli-delegate/cmd_migrate.js +2 -2
  60. package/dist/cli-delegate/cmd_preflight.js +5 -5
  61. package/dist/cli-delegate/cmd_prune.js +6 -6
  62. package/dist/cli-delegate/cmd_route_audit.js +6 -5
  63. package/dist/cli-delegate/cmd_route_explain.js +3 -3
  64. package/dist/cli-delegate/cmd_session_recycle.js +3 -3
  65. package/dist/cli-delegate/cmd_settings_get.js +4 -4
  66. package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
  67. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  68. package/dist/cli-delegate/cmd_sync.js +6 -6
  69. package/dist/cli-delegate/cmd_uninstall.js +6 -6
  70. package/dist/cli-delegate/cmd_update.js +3 -3
  71. package/dist/cli-delegate/cmd_upgrade.js +3 -3
  72. package/dist/cli-delegate/cmd_validate.js +6 -6
  73. package/dist/cli-delegate/cmd_versions.js +3 -3
  74. package/dist/discovery/deprecation-report.md +1 -1
  75. package/dist/discovery/discovery-manifest.json +83 -30
  76. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  77. package/dist/discovery/discovery-manifest.summary.md +4 -4
  78. package/dist/discovery/dormancy-report.md +1 -1
  79. package/dist/discovery/orphan-report.md +1 -1
  80. package/dist/discovery/packs.json +11 -9
  81. package/dist/discovery/trust-report.md +2 -2
  82. package/dist/discovery/workspaces.json +9 -7
  83. package/dist/hooks/dispatch.js +1295 -812
  84. package/dist/install/globalRuleLayers.js +169 -0
  85. package/dist/install/globalRuleLayers.js.map +1 -0
  86. package/dist/install/partitionEligibility.js +156 -0
  87. package/dist/install/partitionEligibility.js.map +1 -1
  88. package/dist/install/ruleLayerPartition.js +157 -0
  89. package/dist/install/ruleLayerPartition.js.map +1 -0
  90. package/dist/mcp/registry-manifest.json +3 -3
  91. package/dist/mcp/server.json +2 -2
  92. package/dist/mcp/server.mjs +1358 -805
  93. package/dist/scripts/_lib/claude_plugin.js +162 -0
  94. package/dist/scripts/_lib/claude_plugin.js.map +1 -0
  95. package/dist/scripts/_lib/environment_detector.js +397 -0
  96. package/dist/scripts/_lib/environment_detector.js.map +1 -0
  97. package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
  98. package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
  99. package/dist/scripts/_lib/spawn_env.js +129 -0
  100. package/dist/scripts/_lib/spawn_env.js.map +1 -0
  101. package/dist/scripts/ai_council/modes.js +199 -0
  102. package/dist/scripts/ai_council/modes.js.map +1 -0
  103. package/dist/scripts/ai_council/transport_resolver.js +418 -0
  104. package/dist/scripts/ai_council/transport_resolver.js.map +1 -0
  105. package/dist/scripts/condense.js +52 -89
  106. package/dist/scripts/condense.js.map +1 -1
  107. package/dist/server/routes/wizard.js +3 -2
  108. package/dist/server/routes/wizard.js.map +1 -1
  109. package/dist/ui/assets/index-Cxgy63kz.js +26 -0
  110. package/dist/ui/assets/index-Cxgy63kz.js.map +1 -0
  111. package/dist/ui/index.html +1 -1
  112. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
  113. package/docs/guidelines/agent-infra/false-green.md +47 -1
  114. package/docs/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
  115. package/docs/guidelines/agent-infra/untrusted-input-spotlighting.md +17 -0
  116. package/package.json +7 -3
  117. package/src/agent-src/scripts/archive_completed_roadmaps.ts +7 -4
  118. package/src/agent-src/scripts/dashboard_mode.ts +212 -0
  119. package/src/agent-src/scripts/update_roadmap_progress.ts +47 -48
  120. package/src/config/ci-local-parity.yml +21 -0
  121. package/src/config/estate-count-budget.json +13 -471
  122. package/src/config/evaluator-budgets.json +4 -4
  123. package/src/config/gate-coverage.yml +458 -12
  124. package/src/config/gate-violation-baselines.json +18 -8
  125. package/src/config/gitignore-block.txt +15 -2
  126. package/src/config/hook-latency-budget.json +5 -0
  127. package/src/config/publish-surface.json +60 -0
  128. package/src/config/requirements-trace-budget.json +32 -0
  129. package/src/config/rule-stub-ceilings.json +25 -4
  130. package/src/install/globalRuleLayers.ts +197 -0
  131. package/src/install/partitionEligibility.ts +177 -0
  132. package/src/install/ruleLayerPartition.ts +212 -0
  133. package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
  134. package/src/scripts/_dispatch.bash +18 -0
  135. package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
  136. package/src/scripts/_lib/adr_frontmatter.ts +459 -0
  137. package/src/scripts/_lib/base_tree.ts +175 -0
  138. package/src/scripts/_lib/billing_grant.ts +165 -0
  139. package/src/scripts/_lib/billing_grant_cli.ts +123 -0
  140. package/src/scripts/_lib/council_fallback_posture.ts +53 -6
  141. package/src/scripts/_lib/council_fallback_wiring.ts +61 -1
  142. package/src/scripts/_lib/envelope_grounding.ts +11 -1
  143. package/src/scripts/_lib/host_capability.ts +59 -5
  144. package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
  145. package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
  146. package/src/scripts/_lib/quota_parked.ts +133 -0
  147. package/src/scripts/_lib/retrieval_sanitize.ts +62 -0
  148. package/src/scripts/_lib/review_telemetry.ts +196 -0
  149. package/src/scripts/_lib/subagent_response.ts +92 -0
  150. package/src/scripts/adr/evidence_census.ts +899 -0
  151. package/src/scripts/adr/regenerate_index.ts +25 -38
  152. package/src/scripts/adr_cite_check.ts +540 -39
  153. package/src/scripts/ai_council/clients.ts +12 -1
  154. package/src/scripts/ai_council/config.ts +72 -115
  155. package/src/scripts/ai_council/fallback_config.ts +19 -7
  156. package/src/scripts/ai_council/mid_flight_fallback.ts +88 -7
  157. package/src/scripts/ai_council/orchestrator.ts +2 -2
  158. package/src/scripts/ai_council/py_format.ts +124 -0
  159. package/src/scripts/ai_council/transport_resolver.ts +65 -2
  160. package/src/scripts/audit_adr_coverage.ts +134 -21
  161. package/src/scripts/bench_hook_latency.ts +204 -0
  162. package/src/scripts/build_archive_index.ts +34 -0
  163. package/src/scripts/check_adr_frontmatter.ts +574 -39
  164. package/src/scripts/check_council_pin_staleness.ts +300 -0
  165. package/src/scripts/check_estate_count.ts +420 -293
  166. package/src/scripts/check_gate_coverage.ts +91 -0
  167. package/src/scripts/check_hook_bundle_content.ts +219 -0
  168. package/src/scripts/check_new_adr_evidence.ts +529 -0
  169. package/src/scripts/check_no_stub_inventory_table.ts +292 -0
  170. package/src/scripts/check_pack_size.ts +234 -1
  171. package/src/scripts/check_publish_surface.ts +297 -0
  172. package/src/scripts/check_references.ts +18 -0
  173. package/src/scripts/check_requirements_trace.ts +378 -0
  174. package/src/scripts/check_rule_layer_partition.ts +531 -0
  175. package/src/scripts/check_secret_leak.ts +166 -12
  176. package/src/scripts/check_single_delivery.ts +137 -4
  177. package/src/scripts/check_standing_rule_delivery.ts +8 -2
  178. package/src/scripts/code_graph/cli.ts +44 -5
  179. package/src/scripts/code_graph/extract.ts +87 -0
  180. package/src/scripts/condense.ts +61 -91
  181. package/src/scripts/council_cli.ts +12 -16
  182. package/src/scripts/detect_ai_tells.ts +87 -0
  183. package/src/scripts/dispatch_r2_reviewer.ts +42 -0
  184. package/src/scripts/external_sources_denylist.json +4 -1
  185. package/src/scripts/generate_capabilities_index.ts +41 -0
  186. package/src/scripts/git_authorization_hook.ts +54 -4
  187. package/src/scripts/hooks/block_unauthorized_git.ts +41 -3
  188. package/src/scripts/hooks/dispatch_hook.ts +154 -187
  189. package/src/scripts/hooks/dispatch_issues.ts +38 -19
  190. package/src/scripts/hooks/fallback_yaml.ts +66 -0
  191. package/src/scripts/hooks/host_semantics.ts +21 -0
  192. package/src/scripts/hooks/injection_budget.ts +13 -3
  193. package/src/scripts/hooks/py_json_dumps.ts +103 -0
  194. package/src/scripts/hooks/run_continuation_hook.ts +3 -1
  195. package/src/scripts/hooks/state_io.ts +88 -1
  196. package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
  197. package/src/scripts/hooks/subagent_ledger_hook.ts +76 -11
  198. package/src/scripts/injection_scan_hook.ts +257 -15
  199. package/src/scripts/lint_adr_sweep_routing.ts +365 -0
  200. package/src/scripts/lint_hook_manifest.ts +49 -0
  201. package/src/scripts/lint_provenance_vocabulary.ts +472 -4
  202. package/src/scripts/lint_workflow_security.ts +53 -10
  203. package/src/scripts/lint_workflow_security_allowlist.json +2 -18
  204. package/src/scripts/report_envelope_rate.ts +166 -0
  205. package/src/scripts/review_axis_report.ts +218 -0
  206. package/src/scripts/routing_doctor.ts +5 -1
  207. package/src/scripts/run_supervise.ts +46 -1
  208. package/src/scripts/schemas/evals.schema.json +5 -0
  209. package/src/scripts/sync_pr_branch.ts +170 -20
  210. package/dist/cli/commands/commands.candidates.test.js +0 -257
  211. package/dist/cli/commands/commands.candidates.test.js.map +0 -1
  212. package/dist/cli/commands/profiles.test.js +0 -88
  213. package/dist/cli/commands/profiles.test.js.map +0 -1
  214. package/dist/cli/commands/recordTriggerEval.test.js +0 -113
  215. package/dist/cli/commands/recordTriggerEval.test.js.map +0 -1
  216. package/dist/cli/configRoot.test.js +0 -97
  217. package/dist/cli/configRoot.test.js.map +0 -1
  218. package/dist/cli/mcp/content.test.js +0 -54
  219. package/dist/cli/mcp/content.test.js.map +0 -1
  220. package/dist/cli/mcp/dispatch.test.js +0 -108
  221. package/dist/cli/mcp/dispatch.test.js.map +0 -1
  222. package/dist/server/writeRoot.test.js +0 -91
  223. package/dist/server/writeRoot.test.js.map +0 -1
  224. package/dist/shared/capabilities.test.js +0 -39
  225. package/dist/shared/capabilities.test.js.map +0 -1
  226. package/dist/ui/assets/index-C1pBRm1f.js +0 -26
  227. package/dist/ui/assets/index-C1pBRm1f.js.map +0 -1
  228. package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
  229. package/dist/cli-delegate/{chunk-6EOCNQAM.js → chunk-E4XIZDIB.js} +0 -0
  230. package/dist/cli-delegate/{chunk-GJ5BVHXM.js → chunk-PMEKGDED.js} +3 -3
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![Smoke](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml) [![Public install smoke (3 OS × 2 Node)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml) [![npm](https://img.shields.io/npm/v/@event4u/agent-config?style=flat-square&label=npm&color=orange)](https://www.npmjs.com/package/@event4u/agent-config) [![agent-config MCP server](https://glama.ai/mcp/servers/event4u-app/agent-config/badges/score.svg)](https://glama.ai/mcp/servers/event4u-app/agent-config) [![MCP Toplist](https://mcptoplist.com/badge/glama%2Fevent4u-app%2Fagent-config.svg)](https://mcptoplist.com/server/glama%2Fevent4u-app%2Fagent-config)
6
6
 
7
- [![Skills](https://img.shields.io/badge/Skills-290-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-119-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-200-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-107-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/)
7
+ [![Skills](https://img.shields.io/badge/Skills-291-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-119-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-201-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-108-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/)
8
8
 
9
9
  **Try it in 30 seconds** — drop one read-only subagent into any repo and watch it gate "done": `@production-validator check this branch is actually done`. No wizard, no lock-in, nothing else installed — the [30-second wedge ↓](#quickstart) is the whole first step. Start at the proof, not the catalog: **[event4u-app.github.io/agent-config/proof/](https://event4u-app.github.io/agent-config/proof/)**.
10
10
 
@@ -289,8 +289,20 @@ quorum: majority
289
289
  # markers.
290
290
  members:
291
291
  anthropic:
292
+ # `sonnet` is a vendor ALIAS, not a version. `claude --help` documents
293
+ # 'fable', 'opus' and 'sonnet' as "an alias for the latest model" in their
294
+ # band, so this line cannot go stale the way a dated id can — the same
295
+ # property `codex-default` gives the openai member below.
296
+ #
297
+ # Until 2026-08-22 this read a dated, several-generation-old id: an enabled
298
+ # member of a quality council pinned in a template nobody re-reads, with
299
+ # nothing in the file able to notice. Read from the provider's own CLI
300
+ # surface, never from recall.
301
+ #
302
+ # A member on an alias or a sentinel needs no `verified_at:` — see the
303
+ # disabled members below for the stamped form.
292
304
  enabled: true
293
- model: claude-sonnet-4-5
305
+ model: sonnet
294
306
  api_key_ref: file:anthropic.key
295
307
  # binary: /usr/local/bin/claude # only valid when mode == cli
296
308
  # Phase 7 — size-fit downgrade ladder (smallest → largest). The
@@ -298,9 +310,9 @@ members:
298
310
  # classifier flags a request as oversized, it suggests the next
299
311
  # rung *down*; the top rung is the default for complex prompts.
300
312
  model_ladder:
301
- - claude-haiku-4-5
302
- - claude-sonnet-4-5
303
- - claude-opus-4-5
313
+ - haiku
314
+ - sonnet
315
+ - opus
304
316
  # Prompt caching (GA — no beta header) is ON by default: the stable
305
317
  # system + artefact prefix is sent as a cache-controlled block, so
306
318
  # members 2..N in a round (and round-2+ within the 5-min TTL) read
@@ -381,20 +393,38 @@ members:
381
393
 
382
394
  gemini:
383
395
  enabled: false
396
+ # not-listed: gemini — the `gemini` CLI is installed here and its `--help` exposes only `-m, --model <string>` — no listing subcommand and no documented "latest" alias, so no sentinel could be substituted. An honest null for this provider, not a guess.
397
+ # The pin is therefore stamped as-of the drain date with NO refresh claimed;
398
+ # `verified_at` records when a human last looked, which is the only thing it
399
+ # has ever meant. This member ships disabled, so the pin costs nothing today
400
+ # and `check_council_pin_staleness` will say so when the stamp ages out.
384
401
  model: gemini-2.5-pro
402
+ verified_at: "2026-08-22"
385
403
  api_key_ref: env:GEMINI_API_KEY
386
404
  # binary: /usr/local/bin/gemini # only valid when mode == cli
387
405
 
388
406
  xai:
389
407
  enabled: false
408
+ # not-listed: grok — no `grok` binary on this machine, so the provider's own surface was unreachable.
409
+ # The pin is therefore stamped as-of the drain date with NO refresh claimed;
410
+ # `verified_at` records when a human last looked, which is the only thing it
411
+ # has ever meant. This member ships disabled, so the pin costs nothing today
412
+ # and `check_council_pin_staleness` will say so when the stamp ages out.
390
413
  model: grok-4
414
+ verified_at: "2026-08-22"
391
415
  api_key_ref: env:XAI_API_KEY
392
416
  # binary: /usr/local/bin/grok # The CLI consumes XAI_API_KEY and remains billable=True;
393
417
  # # cost_budget.max_total_usd STILL applies. Opt-in only.
394
418
 
395
419
  perplexity:
396
420
  enabled: false
421
+ # not-listed: sonar — no `sonar` binary on this machine, so the provider's own surface was unreachable.
422
+ # The pin is therefore stamped as-of the drain date with NO refresh claimed;
423
+ # `verified_at` records when a human last looked, which is the only thing it
424
+ # has ever meant. This member ships disabled, so the pin costs nothing today
425
+ # and `check_council_pin_staleness` will say so when the stamp ages out.
397
426
  model: sonar-pro
427
+ verified_at: "2026-08-22"
398
428
  api_key_ref: env:PERPLEXITY_API_KEY
399
429
  # binary: /usr/local/bin/perplexity # The CLI consumes PERPLEXITY_API_KEY and remains billable=True;
400
430
  # # cost_budget.max_total_usd STILL applies. Opt-in only.
@@ -0,0 +1,13 @@
1
+ {
2
+ "command": "git-pr-merge",
3
+ "intent": "Prepare an open PR to mergeable — sync, resolve conflicts semantically, drive CI green — and merge it when the invocation says so",
4
+ "cases": [
5
+ { "prompt": "merge PR 1478", "expected": "git-pr-merge" },
6
+ { "prompt": "get this pull request mergeable and merge it", "expected": "git-pr-merge" },
7
+ { "prompt": "drain all the open PRs — sync each one with main, fix CI, merge", "expected": "git-pr-merge" },
8
+ { "prompt": "bring PR 1502 up to date with main and get its checks green, but don't merge it", "expected": "git-pr-merge" },
9
+ { "prompt": "the open PRs all conflict with each other now — work through the queue", "expected": "git-pr-merge" },
10
+ { "prompt": "open a pull request for this branch", "expected": "git-pr-create" },
11
+ { "prompt": "write me a PR description I can paste", "expected": "git-pr-create-description-only" }
12
+ ]
13
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "command": "roadmap",
3
- "intent": "Roadmap dispatcher — create, process-step, process-phase, process-full, ai-council",
3
+ "intent": "Roadmap dispatcher — create, materialize, process-step, process-phase, process-full (incl. --all estate drain), next, ai-council",
4
4
  "cases": [
5
5
  {
6
6
  "prompt": "create a roadmap for this initiative",
@@ -37,6 +37,22 @@
37
37
  {
38
38
  "prompt": "either roadmap it or turn it into a feature plan, your pick",
39
39
  "expected": "roadmap"
40
+ },
41
+ {
42
+ "prompt": "drain every open roadmap, one PR each",
43
+ "expected": "roadmap"
44
+ },
45
+ {
46
+ "prompt": "arbeite alle Roadmaps der Reihe nach ab",
47
+ "expected": "roadmap"
48
+ },
49
+ {
50
+ "prompt": "work through the whole roadmap estate in a worktree",
51
+ "expected": "roadmap"
52
+ },
53
+ {
54
+ "prompt": "merge all the open pull requests",
55
+ "expected": "git-pr-merge"
40
56
  }
41
57
  ]
42
58
  }
@@ -153,8 +153,20 @@ merge into instead of against the repo default.
153
153
  `./scripts-run src/scripts/sync_pr_branch` resolves the base from the open PR
154
154
  (so a stacked or release-line PR is measured against what it actually merges
155
155
  into), fetches, and merges it in when the branch is behind. On a conflict it
156
- STOPS and splits the conflicted paths into generated and authored — the first has
157
- one correct resolution (regenerate), the second has none a script may choose.
156
+ STOPS and splits the conflicted paths into generated, remeasured and authored —
157
+ the first has one correct resolution (regenerate), the second's is to re-run the
158
+ measurement on the merged tree (a ratchet baseline, where picking a side is how
159
+ the ratchet silently loosens), and the third has none a script may choose.
160
+
161
+ **On `CONFLICTING`, run this before touching the GitHub web editor.** The web
162
+ editor cannot tell generated from authored, so it presents a mechanical
163
+ regenerate and a real human decision as the same three-way merge — which is the
164
+ failure path road-to-merge-hotspot-drawdown was opened over — a branch resolved
165
+ in the web editor while behind its base. The observation itself lives in the
166
+ maintainer handover that roadmap cites as its Source, not in the roadmap's own
167
+ § 0, so do not expect to find it there. Adoption of this line is not measurable
168
+ without telemetry this repository has ruled out; it is a checklist item, not a
169
+ gate.
158
170
  Deliberately not in the pre-push hook: it mutates the tree, and a hook that
159
171
  rewrites the tree mid-push turns one rejected push into an unreviewed commit.
160
172
  Detection belongs in the hook and is already there; resolution is a step you run
@@ -0,0 +1,383 @@
1
+ ---
2
+ model_tier: medium
3
+ name: git-pr-merge
4
+ disable-model-invocation: true
5
+ argument-hint: "[all|<pr-number>] [--no-merge]"
6
+ pack: git
7
+ intent: "Prepare an open PR to mergeable — sync the base in, resolve conflicts semantically, drive required checks green — merging itself is gated and inert"
8
+ routes_to: [git-workflow, github-ci]
9
+ replaces: []
10
+ visibility: advanced
11
+ cluster: git-pr-merge
12
+ skills: [git-workflow, github-ci]
13
+ description: Prepare one open PR to mergeable, or the whole open-PR queue with `all` — merging is specified but gated, so today every invocation stops at mergeable-and-open
14
+ suggestion:
15
+ eligible: false
16
+ rationale: "Merging is irreversible and gated on the user's own word in the invocation — a suggested merge would manufacture the authorization the Hard Floor requires the user to give."
17
+ workspaces:
18
+ - agent-config-maintainer
19
+ packs:
20
+ - git
21
+ ---
22
+
23
+ # /git-pr-merge
24
+
25
+ Prepare an open pull request until it is genuinely mergeable — its base merged
26
+ in, its conflicts resolved by class rather than by taste, its required checks
27
+ green on the head that will actually be merged — and then merge it, if and only
28
+ if the invocation authorised that.
29
+
30
+ ```
31
+ THE MERGE STEP (§ 9) IS SPECIFIED AND NOT YET ACTIVE. `--no-merge` IS THE
32
+ OPERATIVE PATH TODAY, AND A BARE INVOCATION BEHAVES AS IF IT CARRIED IT.
33
+ ACTIVATION NEEDS THE OWNER DECISION IN THE `merge-authority` BLOCKER OF
34
+ `road-to-drain-commands` — NEVER A COMMAND EDIT, AND NEVER A GUARD EDIT.
35
+ ```
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.
43
+
44
+ Why it ships inert rather than not at all: everything before § 9 — the target
45
+ manifest, the four conflict classes, the superseded check, the bounded CI
46
+ repair, the cutoff — is the expensive, error-prone half, it is what the live
47
+ runs actually proved, and none of it merges anything. `--no-merge` delivers all
48
+ of it today.
49
+
50
+ ## Sub-commands
51
+
52
+ | Sub-command | Routes to | Purpose |
53
+ |---|---|---|
54
+
55
+ *(none, deliberately.)* `all` changes **cardinality**, not lifecycle, so it is
56
+ an argument rather than a second command — the locked registry's rule that
57
+ "sibling variants become a flag, never a second command"
58
+ ([`command-clusters`](../../../../../docs/contracts/command-clusters.md)) applied
59
+ to this cluster. A future sub belongs here only if it has a materially
60
+ different lifecycle, not a different count.
61
+
62
+ ## Dispatch
63
+
64
+ Every row below **prepares** — the merge step is gated (see the banner above),
65
+ so today every row ends at mergeable-and-open. The column says what each row
66
+ selects, not that it merges.
67
+
68
+ | Invocation | Selects | Prepares | Merges |
69
+ |---|---|---|---|
70
+ | `/pr:merge <N>` | exactly PR N | yes | only once the gate opens |
71
+ | `/pr:merge` | ONE PR: green first, then infrastructure/tooling before content, then smallest diff (`changedFiles`, then additions+deletions), tiebreak ascending number | yes | only once the gate opens |
72
+ | `/pr:merge all` | the whole open-PR list, under § 6's cutoff | yes | only once the gate opens |
73
+ | `… --no-merge` | as above | yes | **never**, explicitly. This is the form [`/roadmap:process-full`](../../../product-basic/roadmap/process-full/command.md) calls for its delivery loop. |
74
+
75
+ **Bare invocation** (`/pr:merge` with no argument) is a **documented default
76
+ flow**, not a menu: it runs the auto-selection in row 2 and says which PR it
77
+ picked and why, before touching it. A menu would be the wrong shape here —
78
+ selection is deterministic from the queue-order rule in § 1, so asking the user
79
+ to pick would hand back a decision the command can compute. When the open-PR
80
+ list is empty there is nothing to select and the command reports that and
81
+ stops.
82
+
83
+ ## 1. Snapshot the target — an immutable manifest
84
+
85
+ Compute the queue ONCE at invocation and record it as a manifest of
86
+ `(PR number, head SHA)` pairs:
87
+
88
+ ```bash
89
+ gh pr list --state open --limit 100 \
90
+ --json number,title,headRefName,headRefOid,baseRefName,additions,deletions,changedFiles,mergeable,updatedAt
91
+ gh api repos/:owner/:repo/git/ref/heads/<baseRefName> --jq .object.sha # per distinct base
92
+ ```
93
+
94
+ `baseRefName` and the base SHA are part of the record, not incidental: § 2 and
95
+ § 4 both consume `<base>`, and § 8's kill switch "the base advanced by an actor
96
+ other than this run" is undetectable without a base SHA to compare against.
97
+
98
+ `--limit 100` caps the manifest. A queue above 100 open PRs is drained
99
+ **partially**, and the run must say so rather than reporting completion — the
100
+ § 6 bound reads "initial manifest + one batch", and the manifest is what the
101
+ cap truncated.
102
+
103
+ The manifest is the authorization's target set and is **never silently
104
+ refreshed by a third party's push**. It is, by design, advanced by *this run's
105
+ own* commits — § 2 merges the base in and § 5 pushes, so a prepared PR's head
106
+ is never the snapshot head, and a naive "refuse when the SHA moved" check would
107
+ fire on every PR the run touches.
108
+
109
+ So the record carries **two** SHAs per PR and they mean different things:
110
+
111
+ | Field | Set at | Meaning |
112
+ |---|---|---|
113
+ | `pr_number` | snapshot | Immutable. A change is branch substitution — refuse. |
114
+ | `observed_head` | snapshot, then **updated by this run after each of its own pushes** | The head this run last produced. |
115
+ | `base_ref` + `base_sha` | snapshot | The base the PR was prepared against; § 8's "base advanced by another actor" compares against it. |
116
+
117
+ Before every merge, re-read the PR and refuse when the live head is **neither**
118
+ the snapshot head **nor** the head this run last pushed. That is the
119
+ force-push-after-authorization case, and it is the only one the check exists
120
+ for. A PR that appeared after the snapshot is not in scope for this run — § 6
121
+ says what happens to it.
122
+
123
+ ## 2. Sync with the base
124
+
125
+ ```bash
126
+ git fetch origin
127
+ gh pr checkout <N>
128
+ git merge origin/<base> --no-edit
129
+ ```
130
+
131
+ Merge the base **into** the branch. Never rebase a branch that is already
132
+ pushed ([`git-history-discipline`](../../../../rules/git-history-discipline.md)).
133
+
134
+ ## 3. Resolve conflicts by class, never by taste
135
+
136
+ Conflicts between queued PRs are expected, not exceptional: in this repository
137
+ roadmap PRs touch the same handful of shared paths, so each merge can
138
+ re-conflict every remaining PR. Resolve semantically, by these enumerated
139
+ classes.
140
+
141
+ `src/config/estate-count-budget.json` used to be the second-worst offender here
142
+ and no longer belongs in any class below: ADR-243 removed its stored baseline, so
143
+ it changes on a policy decision rather than once per roadmap touch. A conflict in
144
+ it now means two humans edited the same policy sentence — read both sides.
145
+
146
+ | Class | Files | Resolution |
147
+ |---|---|---|
148
+ | Roadmap files | `agents/roadmaps/**` | Union of completions. Never un-check a box either side checked; never resurrect a roadmap either side archived or parked. |
149
+ | Generated artefacts | `agents/roadmaps-progress.md` · `docs/catalog.md` · `docs/command-flows.md` · `agents/index.md` · any file whose first three lines say generated / do-not-edit | Never hand-merge. Take either side, then **regenerate** with the repo's own task and commit the regenerated output. |
150
+ | Archive move vs. edit | `agents/roadmaps/{archive,later,skipped}/**` — one side renamed or deleted, the other edited | The archived end-state wins. Re-apply the edit at the new path if it still matters; otherwise drop it and record the drop in the summary. |
151
+ | Evidence files | `agents/evidence/**` | Append-only. Keep both sides. |
152
+
153
+ ```
154
+ A CONFLICT OUTSIDE THESE FOUR CLASSES HALTS THE RUN.
155
+ IT IS NOT RESOLVED BY JUDGEMENT AND NOT ESCALATED TO A WARNING.
156
+ ```
157
+
158
+ The classes exist so a merge resolution is reproducible by a second reader. An
159
+ unenumerated conflict is a case nobody has decided yet, and deciding it silently
160
+ inside a drain loop is how work disappears.
161
+
162
+ ## 4. Superseded check — before any CI is spent
163
+
164
+ If the effective diff against the base is empty after syncing, the PR's content
165
+ already landed elsewhere. Distinguish genuinely empty from generated-artefact
166
+ churn that regeneration on the base would produce anyway — the latter is not
167
+ emptiness.
168
+
169
+ The probe is **not** a bare diff: taken literally, a bare diff closes every
170
+ roadmap PR in this repository, because after a base sync and a regenerate the
171
+ only remaining hunks are exactly the generated-artefact churn § 3 tells you to
172
+ regenerate. Exclude those paths before deciding:
173
+
174
+ ```bash
175
+ git diff origin/<base>...HEAD --stat -- . \
176
+ ':(exclude)agents/roadmaps-progress.md' \
177
+ ':(exclude)docs/catalog.md' ':(exclude)agents/index.md'
178
+ ```
179
+
180
+ Empty **after that exclusion** ⇒ superseded. **Never merge an empty PR to make
181
+ the queue count fall — and never close one on a bare diff.**
182
+
183
+ ```
184
+ CLOSING SOMEONE ELSE'S PR IS AN IRREVERSIBLE EXTERNAL ACTION AND IS NOT
185
+ GUARDED: `pr-close` IS NOT A `GitOp` AT ALL — NOT IN `BLOCK_OPS`, NOT EVEN
186
+ IN `WARN_OPS`. NOTHING WILL STOP IT, WHICH IS WHY THIS COMMAND MUST.
187
+
188
+ THE RUN NEVER CLOSES A PR ON ITS OWN HEURISTIC. IT STOPS AND ASKS, NAMING
189
+ THE EXACT OBJECT: THE PR NUMBER, ITS TITLE, ITS AUTHOR, AND THE PRs THE
190
+ CONTENT LANDED VIA. ONE CONFIRMATION PER PR, THIS TURN, PER
191
+ non-destructive-by-default. NEVER A BATCH APPROVAL FOR "THE SUPERSEDED ONES".
192
+ IT CANNOT NAME WHERE THE CONTENT LANDED → DO NOT EVEN ASK; LEAVE THE PR OPEN
193
+ AND RECORD IT AS `blocked-external`.
194
+ ```
195
+
196
+ The asymmetry is deliberate and worth stating, because it looks inconsistent:
197
+ merging is gated on an owner *decision* recorded once in a blocker, while
198
+ closing is gated on a *per-object* confirmation every time. Merging this run's
199
+ own PR is an action the run's whole design is about; closing a PR someone else
200
+ opened is not, it destroys their work in progress, and no guard in this tree
201
+ sees it happen. The cheaper gate goes on the action nothing else watches.
202
+
203
+ ## 5. Drive CI green — bounded
204
+
205
+ Push, then wait for the verdict on the pushed head. Green means **the required
206
+ checks succeeded for the exact head SHA that will be merged** — never a local
207
+ run, never an earlier commit ([`/git-pr-create` § 4d](../create/command.md)).
208
+
209
+ - **Root-cause fixes only**, inside the PR's own scope.
210
+ - **One rerun for a known flake class** (`gh run rerun <id> --failed`) before
211
+ red counts as real.
212
+ - **N=3 per validation target, six touches per PR per pass — two different
213
+ units, and the smaller one binds first.** The always-loaded
214
+ [`autonomous-execution`](../../../../rules/autonomous-execution.md) cap is
215
+ three consecutive failed attempts on ONE target (a named failing test, a lint
216
+ rule id, one CI job) and it is not lifted here. The six is a per-PR ceiling
217
+ across *distinct* targets: a PR whose CI peels one failure to reveal a
218
+ different one may be worked six times, never one target four times. Hitting
219
+ N=3 on a single target ends the PR's pass immediately, whatever the six says.
220
+ Exhaustion of either posts a diagnosis comment and moves the PR to the end of
221
+ the queue once; a second exhaustion is terminal.
222
+
223
+ ```
224
+ THESE ARE HALTS, NOT OPTIONS OF LAST RESORT:
225
+ DEPENDENCY CHANGES · WORKFLOW CHANGES · DELETING OR SKIPPING A TEST ·
226
+ LOOSENING A THRESHOLD · WEAKENING A GATE · AN EXPECTED-FAIL MARKER ·
227
+ A BRANCH-PROTECTION CHANGE.
228
+ "DRIVE CI GREEN" AUTHORIZES DIAGNOSIS AND REPAIR, NEVER REMOVING THE CHECK
229
+ THAT WOULD HAVE CAUGHT THE PROBLEM.
230
+ ```
231
+
232
+ ## 6. `all` — the queue, and the cutoff that ends it
233
+
234
+ Process the manifest in the order § 1 recorded it — the queue-order rule in the
235
+ Dispatch table's second row is the traversal for `all` too, not only for
236
+ single-PR selection, so two runs over the same queue agree.
237
+
238
+ After each merge the base has moved, so the next PR is re-synced against the
239
+ NEW base — that is the loop, and it is why pre-greening several PRs ahead of
240
+ their merges is wasted work.
241
+
242
+ **While the merge step is gated, that loop does not turn**, and the section
243
+ below is written for when it does. Nothing merges, so the base does not
244
+ advance, no PR leaves the open list, and an `all` run is a **preparation
245
+ sweep**: it syncs, classifies, greens and reports each PR once, then stops. It
246
+ does not re-prepare a PR its own predecessor invalidated, because it has no
247
+ predecessor that landed. The cutoff below still bounds it; the window below
248
+ still cannot close it, for the reason § 7 gives.
249
+
250
+ **Cutoff.** When the manifest is exhausted, recompute the open-PR list
251
+ **exactly once**. PRs that appeared during the run are drained as ONE final
252
+ straggler batch. After that batch the run ends unconditionally; anything
253
+ arriving during or after it is recorded as `arrived-after-cutoff` and is not
254
+ processed.
255
+
256
+ ```
257
+ THE CUTOFF IS THE TERMINATION PROOF.
258
+ WITHOUT IT, "THE QUEUE MUST SHRINK" DOES NOT TERMINATE AGAINST A SECOND
259
+ SESSION THAT KEEPS OPENING PRs — THE RECOMPUTE JUST REFILLS IT.
260
+ BOUND: INITIAL MANIFEST + ONE BATCH, WHATEVER ELSE IS HAPPENING IN THE REPO.
261
+ ```
262
+
263
+ **Window-aware scheduling.** A green, waiting PR is spent authorization window,
264
+ because the next merge re-conflicts it. When the projected remaining work
265
+ exceeds the remaining window, stop entering CI-fix loops and merge everything
266
+ already green first. Pre-greening several PRs ahead of their merge is forbidden
267
+ under window pressure.
268
+
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:
272
+
273
+ ```bash
274
+ cat "agents/state/git-authorization/$(<session-slug>).json" # detected_at
275
+ ```
276
+
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.
286
+
287
+ ## 7. Expiry is a reported state, never a stall
288
+
289
+ ```
290
+ WHEN THE AUTHORIZATION WINDOW CLOSES WITH WORK LEFT, THE RUN STOPS CLEANLY
291
+ AND REPORTS. IT NEVER RETRIES THE GUARD, AND IT NEVER EDITS THE GUARD,
292
+ ITS SOURCE, OR ITS BUNDLES — READ-ONLY VERIFICATION ONLY.
293
+ ```
294
+
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. Widening `LEDGER_MAX_AGE_MS` is
302
+ forbidden practice: on 2026-08-21 it was patched to six hours for a drain run
303
+ and the widening reached the trunk.
304
+
305
+ ## 8. Kill switches, and what happens after a merge
306
+
307
+ **Armed during preparation, not only before a merge** — otherwise every switch
308
+ below is unreachable while the merge step is gated, and a preparation sweep has
309
+ no way to stop at all. Each one aborts the current PR and ends the run on any
310
+ of:
311
+
312
+ - target number or head SHA differs from the manifest;
313
+ - the base advanced by an actor other than this run;
314
+ - a review was dismissed, or the required-check set changed;
315
+ - a conflict outside the four enumerated classes;
316
+ - guard or hook-bundle verification failed;
317
+ - the first unexplained CI-repair failure.
318
+
319
+ ```
320
+ A COMPLETED MERGE IS THE COMMIT POINT.
321
+ NEVER AUTO-REVERT AN EARLIER MERGE AS "ROLLBACK" — AFTER FIVE MERGES THERE IS
322
+ NO ROLLBACK, ONLY COMPENSATION, AND COMPENSATION IS A SEPARATELY AUTHORIZED
323
+ HUMAN DECISION. STOP, EMIT THE MERGE SHAs AND THE REASON, HAND OVER.
324
+ ```
325
+
326
+ ## 9. Merge, and the summary
327
+
328
+ ```bash
329
+ gh pr merge <N> --<detected-method> --delete-branch
330
+ ```
331
+
332
+ Detect the method once, at invocation, and reuse it for the whole queue:
333
+
334
+ ```bash
335
+ gh repo view --json mergeCommitAllowed,squashMergeAllowed,rebaseMergeAllowed
336
+ ```
337
+
338
+ The mapping is explicit, because `<detected-method>` has to be derivable from
339
+ the text: `mergeCommitAllowed` → `--merge`, `squashMergeAllowed` → `--squash`,
340
+ `rebaseMergeAllowed` → `--rebase`.
341
+
342
+ Exactly one allowed → that is the method. More than one → read the last twenty
343
+ merges on the base (`git log --first-parent origin/<base> -20 --format=%s`) and
344
+ take the shape they overwhelmingly share. **A mixed history with no clear
345
+ majority is not a tie to break — it is a stop:** report it and let the operator
346
+ name the method. Inventing one is what the next sentence forbids, and a wrong
347
+ merge shape is not revertible by this command (§ 8). Never force-merge past a
348
+ failing required check, never admin-bypass.
349
+
350
+ On queue empty or terminal-only, `all` writes
351
+ `agents/evidence/pr-drain-run-summary.md` <!-- ref-ignore --> (created by the
352
+ run, so it does not exist until one has happened): one row per PR with queue
353
+ position, the `base_ref@base_sha` it was prepared against — without it a
354
+ "prepared" row records nothing checkable, since mergeability is a fact about a
355
+ base and not about a queue —
356
+ conflict classes hit, CI iterations used, disposition, and any edits dropped in
357
+ conflict resolution. The disposition set is closed:
358
+
359
+ `merged <sha>` · `superseded-closed` · `blocked-external` · `twice-exhausted` ·
360
+ `window-expired` · `arrived-after-cutoff`
361
+
362
+ ## Rules
363
+
364
+ - **Never merge while the gate is closed.** Until the `merge-authority`
365
+ blocker resolves, every invocation stops at mergeable-and-open, `--no-merge`
366
+ or not. Once it opens, `--no-merge` is still the explicit way to say stop.
367
+ - **Never widen, patch, or rebuild-around the git guard.** Verification of the
368
+ authorization window is read-only.
369
+ - **Never rebase a pushed branch**; the base is merged in.
370
+ - **Never hand-merge a generated artefact**; regenerate it.
371
+ - **Never resolve a conflict outside the four classes**; halt instead.
372
+ - **Never call CI green off a local run**; re-verify on the pushed head.
373
+ - **Never auto-revert a completed merge.**
374
+ - **Mergeability is per-PR against a recorded base SHA**, never a property of
375
+ the queue: making PR *n* mergeable against base `M` says nothing about its
376
+ state once PR *n−1* advances the base.
377
+
378
+ ## See also
379
+
380
+ - [`/git-pr-create`](../create/command.md) — opens the PR this command finishes.
381
+ - [`/roadmap:process-full`](../../../product-basic/roadmap/process-full/command.md) — delegates here for its delivery loop.
382
+ - [`git-history-discipline`](../../../../rules/git-history-discipline.md) — never rewrite pushed history.
383
+ - [`non-destructive-by-default`](../../../../rules/non-destructive-by-default.md) — the Hard Floor a merge sits under.