@event4u/agent-config 14.23.0 → 16.0.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 (541) 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 +144 -152
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/agent-handoff.md +8 -7
  7. package/dist/agent-src/commands/agents/init.md +1 -1
  8. package/dist/agent-src/commands/agents/user/accept.md +4 -4
  9. package/dist/agent-src/commands/agents/user/delete.md +2 -2
  10. package/dist/agent-src/commands/agents/user/init.md +3 -3
  11. package/dist/agent-src/commands/agents/user/review.md +3 -3
  12. package/dist/agent-src/commands/agents/user/show.md +3 -3
  13. package/dist/agent-src/commands/agents/user/update.md +2 -2
  14. package/dist/agent-src/commands/agents/user.md +6 -6
  15. package/dist/agent-src/commands/analytics/prune.md +1 -1
  16. package/dist/agent-src/commands/analytics/show.md +2 -2
  17. package/dist/agent-src/commands/analyze/decision.md +2 -2
  18. package/dist/agent-src/commands/analyze/inbox.md +5 -5
  19. package/dist/agent-src/commands/analyze/incident.md +3 -3
  20. package/dist/agent-src/commands/analyze/near-miss.md +3 -3
  21. package/dist/agent-src/commands/analyze/postmortem.md +4 -4
  22. package/dist/agent-src/commands/analyze/premortem.md +2 -2
  23. package/dist/agent-src/commands/analyze.md +2 -2
  24. package/dist/agent-src/commands/bug/fix.md +1 -1
  25. package/dist/agent-src/commands/bug/investigate.md +2 -2
  26. package/dist/agent-src/commands/cost/profile.md +3 -3
  27. package/dist/agent-src/commands/design.md +1 -1
  28. package/dist/agent-src/commands/feature/explore.md +1 -1
  29. package/dist/agent-src/commands/feature/plan.md +2 -2
  30. package/dist/agent-src/commands/feature/roadmap.md +2 -2
  31. package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
  32. package/dist/agent-src/commands/ghostwriter/list.md +1 -1
  33. package/dist/agent-src/commands/ghostwriter/show.md +1 -1
  34. package/dist/agent-src/commands/ghostwriter/write.md +9 -9
  35. package/dist/agent-src/commands/humanize.md +6 -6
  36. package/dist/agent-src/commands/jira-ticket.md +1 -1
  37. package/dist/agent-src/commands/judge/solo.md +1 -1
  38. package/dist/agent-src/commands/judge.md +1 -1
  39. package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
  40. package/dist/agent-src/commands/knowledge/forget.md +1 -1
  41. package/dist/agent-src/commands/knowledge/ingest.md +2 -2
  42. package/dist/agent-src/commands/knowledge/list.md +1 -1
  43. package/dist/agent-src/commands/memory/add.md +3 -3
  44. package/dist/agent-src/commands/memory/load.md +4 -4
  45. package/dist/agent-src/commands/memory/mine-session.md +1 -1
  46. package/dist/agent-src/commands/memory/promote.md +4 -4
  47. package/dist/agent-src/commands/memory/propose.md +2 -2
  48. package/dist/agent-src/commands/mode.md +5 -5
  49. package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
  50. package/dist/agent-src/commands/post-as/me.md +7 -7
  51. package/dist/agent-src/commands/pr/create.md +1 -1
  52. package/dist/agent-src/commands/pr/merge.md +1 -1
  53. package/dist/agent-src/commands/profile/activate.md +1 -1
  54. package/dist/agent-src/commands/profile/show.md +1 -1
  55. package/dist/agent-src/commands/research/deep.md +2 -2
  56. package/dist/agent-src/commands/research/report.md +2 -2
  57. package/dist/agent-src/commands/review/changes.md +1 -1
  58. package/dist/agent-src/commands/review/routing.md +1 -1
  59. package/dist/agent-src/commands/roadmap/create.md +4 -3
  60. package/dist/agent-src/commands/roadmap/materialize.md +2 -2
  61. package/dist/agent-src/commands/roadmap/next.md +1 -1
  62. package/dist/agent-src/commands/roadmap/process-full.md +2 -2
  63. package/dist/agent-src/commands/security-audit-config.md +3 -3
  64. package/dist/agent-src/commands/skill/preview.md +1 -1
  65. package/dist/agent-src/commands/skills/discover.md +1 -1
  66. package/dist/agent-src/commands/sync/agent-settings.md +2 -2
  67. package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
  68. package/dist/agent-src/commands/tests/create.md +1 -1
  69. package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
  70. package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
  71. package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
  72. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
  73. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
  74. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
  75. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +51 -1
  76. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
  77. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  78. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
  79. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +1 -1
  80. package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
  81. package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
  82. package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
  83. package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
  84. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
  85. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
  86. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
  87. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
  88. package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
  89. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
  90. package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
  91. package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
  92. package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
  93. package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
  94. package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
  95. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
  96. package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
  97. package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
  98. package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
  99. package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
  100. package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
  101. package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
  102. package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
  103. package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
  104. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
  105. package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
  106. package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
  107. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
  108. package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
  109. package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
  110. package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
  111. package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
  112. package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
  113. package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  114. package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
  115. package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
  116. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  117. package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  118. package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
  119. package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
  120. package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
  121. package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
  122. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
  123. package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
  124. package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
  125. package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
  126. package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
  127. package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
  128. package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
  129. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
  130. package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
  131. package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
  132. package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
  133. package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
  134. package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
  135. package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
  136. package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
  137. package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
  138. package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
  139. package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
  140. package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  141. package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  142. package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
  143. package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  144. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
  145. package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
  146. package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
  147. package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
  148. package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
  149. package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
  150. package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
  151. package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
  152. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
  153. package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
  154. package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
  155. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
  156. package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
  157. package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  158. package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
  159. package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
  160. package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
  161. package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
  162. package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
  163. package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
  164. package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
  165. package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
  166. package/dist/agent-src/guidelines/code-clarity.md +350 -0
  167. package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
  168. package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
  169. package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
  170. package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
  171. package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
  172. package/dist/agent-src/guidelines/design-canon.md +63 -0
  173. package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
  174. package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
  175. package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
  176. package/dist/agent-src/guidelines/design-modes.md +143 -0
  177. package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
  178. package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
  179. package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
  180. package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
  181. package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
  182. package/dist/agent-src/guidelines/php/api-design.md +115 -0
  183. package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
  184. package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
  185. package/dist/agent-src/guidelines/php/controllers.md +90 -0
  186. package/dist/agent-src/guidelines/php/database.md +194 -0
  187. package/dist/agent-src/guidelines/php/eloquent.md +208 -0
  188. package/dist/agent-src/guidelines/php/flux.md +80 -0
  189. package/dist/agent-src/guidelines/php/general.md +207 -0
  190. package/dist/agent-src/guidelines/php/git.md +164 -0
  191. package/dist/agent-src/guidelines/php/jobs.md +111 -0
  192. package/dist/agent-src/guidelines/php/livewire.md +71 -0
  193. package/dist/agent-src/guidelines/php/logging.md +79 -0
  194. package/dist/agent-src/guidelines/php/naming.md +89 -0
  195. package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
  196. package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
  197. package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
  198. package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
  199. package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
  200. package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
  201. package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
  202. package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
  203. package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
  204. package/dist/agent-src/guidelines/php/patterns.md +28 -0
  205. package/dist/agent-src/guidelines/php/performance.md +92 -0
  206. package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
  207. package/dist/agent-src/guidelines/php/resources.md +100 -0
  208. package/dist/agent-src/guidelines/php/security.md +110 -0
  209. package/dist/agent-src/guidelines/php/sql.md +97 -0
  210. package/dist/agent-src/guidelines/php/validations.md +119 -0
  211. package/dist/agent-src/guidelines/php/websocket.md +100 -0
  212. package/dist/agent-src/guidelines/prompt-templates.md +189 -0
  213. package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
  214. package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
  215. package/dist/agent-src/personas/README.md +1 -1
  216. package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
  217. package/dist/agent-src/personas/product-owner.md +1 -1
  218. package/dist/agent-src/rules/active-remediation.md +1 -1
  219. package/dist/agent-src/rules/architecture.md +2 -2
  220. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  221. package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
  222. package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
  223. package/dist/agent-src/rules/code-comment-discipline.md +2 -2
  224. package/dist/agent-src/rules/code-provenance.md +1 -1
  225. package/dist/agent-src/rules/content-quoting-floor.md +1 -1
  226. package/dist/agent-src/rules/context-hygiene.md +5 -5
  227. package/dist/agent-src/rules/cross-source-consistency.md +1 -1
  228. package/dist/agent-src/rules/design-fidelity.md +36 -46
  229. package/dist/agent-src/rules/direct-answers.md +2 -2
  230. package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
  231. package/dist/agent-src/rules/evaluator-independence.md +1 -1
  232. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  233. package/dist/agent-src/rules/icon-consistency.md +5 -1
  234. package/dist/agent-src/rules/improve-before-implement.md +1 -1
  235. package/dist/agent-src/rules/language-and-tone.md +3 -3
  236. package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
  237. package/dist/agent-src/rules/notes-first-reasoning.md +2 -2
  238. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  239. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  240. package/dist/agent-src/rules/role-mode-adherence.md +2 -2
  241. package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
  242. package/dist/agent-src/rules/size-enforcement.md +1 -1
  243. package/dist/agent-src/rules/source-confidentiality.md +2 -2
  244. package/dist/agent-src/rules/think-before-action.md +1 -1
  245. package/dist/agent-src/rules/token-efficiency.md +7 -5
  246. package/dist/agent-src/rules/ui-audit-gate.md +3 -2
  247. package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
  248. package/dist/agent-src/rules/user-interaction.md +31 -30
  249. package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
  250. package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
  251. package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
  252. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
  253. package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
  254. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
  255. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
  256. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  257. package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
  258. package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
  259. package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
  260. package/dist/agent-src/skills/code-review/SKILL.md +3 -3
  261. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  262. package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
  263. package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
  264. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  265. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
  266. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  267. package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
  268. package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
  269. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
  270. package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
  271. package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
  272. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  273. package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
  274. package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
  275. package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
  276. package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
  277. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
  278. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  279. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
  280. package/dist/agent-src/skills/design-review/SKILL.md +4 -4
  281. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
  282. package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
  283. package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
  284. package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
  285. package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
  286. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
  287. package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
  288. package/dist/agent-src/skills/error-handling-patterns/SKILL.md +9 -0
  289. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
  290. package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
  291. package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
  292. package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
  293. package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
  294. package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
  295. package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
  296. package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
  297. package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
  298. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  299. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  300. package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
  301. package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
  302. package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
  303. package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
  304. package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
  305. package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
  306. package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
  307. package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
  308. package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
  309. package/dist/agent-src/skills/iconography/SKILL.md +3 -3
  310. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  311. package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
  312. package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
  313. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
  314. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  315. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
  316. package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
  317. package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
  318. package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
  319. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  320. package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
  321. package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
  322. package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
  323. package/dist/agent-src/skills/org-design/SKILL.md +1 -1
  324. package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
  325. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  326. package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
  327. package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
  328. package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
  329. package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
  330. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
  331. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  332. package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
  333. package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
  334. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
  335. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  336. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
  337. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  338. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  339. package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
  340. package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
  341. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  342. package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
  343. package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
  344. package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
  345. package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
  346. package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
  347. package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
  348. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  349. package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
  350. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
  351. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
  352. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
  353. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  354. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
  355. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  356. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +11 -5
  357. package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
  358. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  359. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  360. package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
  361. package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
  362. package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
  363. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
  364. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  365. package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
  366. package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
  367. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
  368. package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
  369. package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
  370. package/dist/agent-src/templates/agent-settings.md +6 -6
  371. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  372. package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
  373. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  374. package/dist/agent-src/templates/roadmaps.md +1 -1
  375. package/dist/agent-src/templates/scripts/README.md +2 -2
  376. package/dist/agent-src/user-types/_template/user-type.md +1 -1
  377. package/dist/cli-delegate/check_update_banner.js +12 -1
  378. package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
  379. package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -6
  380. package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
  381. package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
  382. package/dist/cli-delegate/{chunk-KCNTUSPI.js → chunk-AK6HODNQ.js} +4 -4
  383. package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
  384. package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-H32DGUJH.js} +15 -84
  385. package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
  386. package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
  387. package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
  388. package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
  389. package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
  390. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  391. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  392. package/dist/cli-delegate/cmd_conformance.js +834 -275
  393. package/dist/cli-delegate/cmd_doctor.js +3 -3
  394. package/dist/cli-delegate/cmd_explain.js +5 -3
  395. package/dist/cli-delegate/cmd_export.js +4 -4
  396. package/dist/cli-delegate/cmd_handoff.js +6 -6
  397. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  398. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  399. package/dist/cli-delegate/cmd_migrate.js +2 -2
  400. package/dist/cli-delegate/cmd_packs_active.js +3 -2
  401. package/dist/cli-delegate/cmd_prune.js +4 -4
  402. package/dist/cli-delegate/cmd_route_audit.js +3 -3
  403. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  404. package/dist/cli-delegate/cmd_session_recycle.js +3 -3
  405. package/dist/cli-delegate/cmd_settings_get.js +15 -9
  406. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  407. package/dist/cli-delegate/cmd_settings_set.js +54 -11
  408. package/dist/cli-delegate/cmd_sync.js +4 -4
  409. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  410. package/dist/cli-delegate/cmd_update.js +1 -1
  411. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  412. package/dist/cli-delegate/cmd_validate.js +4 -4
  413. package/dist/cli-delegate/cmd_versions.js +1 -1
  414. package/dist/discovery/deprecation-report.md +1 -1
  415. package/dist/discovery/discovery-manifest.json +25 -78
  416. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  417. package/dist/discovery/discovery-manifest.summary.md +3 -3
  418. package/dist/discovery/dormancy-report.md +1 -1
  419. package/dist/discovery/orphan-report.md +1 -1
  420. package/dist/discovery/packs.json +5 -7
  421. package/dist/discovery/trust-report.md +2 -2
  422. package/dist/discovery/workspaces.json +4 -6
  423. package/dist/hooks/dispatch.js +9684 -9304
  424. package/dist/install/install.mjs +36 -8
  425. package/dist/mcp/registry-manifest.json +3 -3
  426. package/dist/mcp/server.json +2 -2
  427. package/dist/mcp/server.mjs +2147 -1470
  428. package/dist/router.json +1 -1
  429. package/dist/scripts/_lib/agent_settings.js +73 -0
  430. package/dist/scripts/_lib/agent_src.js +20 -0
  431. package/dist/scripts/_lib/guidelines_lane.js +158 -0
  432. package/dist/scripts/_lib/installed_lock.js +1 -1
  433. package/dist/scripts/condense.js +2 -5
  434. package/dist/server/io/yamlIO.js +175 -17
  435. package/dist/server/schemas/settings.js +18 -4
  436. package/dist/shared/settingsSurface.js +6 -1
  437. package/docs/contracts/settings-classes.md +18 -9
  438. package/docs/guidelines/abstraction-thresholds.md +35 -0
  439. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
  440. package/docs/guidelines/agent-infra/false-green.md +2 -2
  441. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  442. package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
  443. package/docs/guidelines/design-fidelity-mechanics.md +4 -0
  444. package/docs/guidelines/design-fidelity-routing.md +78 -0
  445. package/docs/guidelines/design-reconciliation.md +172 -0
  446. package/docs/guidelines/gtm-handoff.md +2 -2
  447. package/docs/guidelines/wing4-handoff.md +2 -2
  448. package/package.json +7 -3
  449. package/src/config/agent-settings.template.yml +55 -8
  450. package/src/config/ci-local-parity.yml +34 -0
  451. package/src/config/continuity-surface.json +11 -32
  452. package/src/config/gate-coverage.yml +31 -8
  453. package/src/config/gate-reachability-exemptions.json +1 -0
  454. package/src/config/gate-violation-baselines.json +3 -3
  455. package/src/config/hook-token-budget.json +1 -1
  456. package/src/config/host-injection-effect.json +2 -2
  457. package/src/config/pack-size-budget.json +55 -4
  458. package/src/config/platform-anchor.json +47 -0
  459. package/src/config/preamble-payload-budget.json +12 -8
  460. package/src/config/preamble-payload-exceptions.json +28 -0
  461. package/src/config/publish-surface.json +4 -2
  462. package/src/config/ratification-policy.json +7 -0
  463. package/src/config/rule-stub-ceilings.json +16 -9
  464. package/src/scripts/_cli/cmd_settings_get.ts +22 -7
  465. package/src/scripts/_dispatch.bash +3 -1
  466. package/src/scripts/_lib/agent_settings.ts +85 -0
  467. package/src/scripts/_lib/agent_src.ts +21 -0
  468. package/src/scripts/_lib/artifact_maturity.ts +242 -0
  469. package/src/scripts/_lib/base_ref_payload.ts +315 -0
  470. package/src/scripts/_lib/conformance_report.ts +403 -0
  471. package/src/scripts/_lib/continuity_writer.ts +72 -13
  472. package/src/scripts/_lib/design_system_import.ts +20 -0
  473. package/src/scripts/_lib/design_tolerance.ts +281 -0
  474. package/src/scripts/_lib/dropped_decision.ts +142 -0
  475. package/src/scripts/_lib/guidelines_lane.ts +164 -0
  476. package/src/scripts/_lib/installed_lock.ts +1 -1
  477. package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
  478. package/src/scripts/_lib/obligation_frequency.ts +2 -3
  479. package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
  480. package/src/scripts/_lib/platform_anchor.ts +1053 -0
  481. package/src/scripts/_lib/ratification_artifact.ts +278 -0
  482. package/src/scripts/_lib/release_findings_ingest.ts +324 -0
  483. package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
  484. package/src/scripts/_lib/review_baseline.ts +254 -0
  485. package/src/scripts/_lib/review_skipped_record.ts +61 -1
  486. package/src/scripts/_lib/security_lint.ts +23 -2
  487. package/src/scripts/_lib/self_repair.ts +21 -0
  488. package/src/scripts/_lib/session_index_trust.ts +42 -1
  489. package/src/scripts/_lib/standing_bound_ratchet.ts +267 -88
  490. package/src/scripts/_lib/tolerance_shadow.ts +177 -0
  491. package/src/scripts/_lib/turn_end_refusals.ts +51 -4
  492. package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
  493. package/src/scripts/autonomy_friction_traffic.ts +379 -0
  494. package/src/scripts/check_beta_review_markers.ts +35 -4
  495. package/src/scripts/check_finding_dispositions.ts +167 -16
  496. package/src/scripts/check_held_object_arrivals.ts +381 -0
  497. package/src/scripts/check_kernel_edit_ratified.ts +462 -0
  498. package/src/scripts/check_loss_class_declared.ts +793 -46
  499. package/src/scripts/check_platform_anchor.ts +390 -0
  500. package/src/scripts/check_preamble_payload_budget.ts +672 -107
  501. package/src/scripts/check_projected_rule_routes.ts +395 -0
  502. package/src/scripts/check_release_published.ts +1 -1
  503. package/src/scripts/check_reply_consistency.ts +86 -17
  504. package/src/scripts/code_graph/cli.ts +6 -0
  505. package/src/scripts/condense.ts +2 -6
  506. package/src/scripts/generate_host_cost_table.ts +354 -0
  507. package/src/scripts/hook_manifest.json +1 -1
  508. package/src/scripts/hook_manifest.yaml +74 -30
  509. package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
  510. package/src/scripts/hooks/category_a.ts +1 -1
  511. package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
  512. package/src/scripts/hooks/concern_registry.ts +2 -0
  513. package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
  514. package/src/scripts/hooks/review_baseline_hook.ts +130 -0
  515. package/src/scripts/hooks/session_eol_hook.ts +68 -154
  516. package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
  517. package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
  518. package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
  519. package/src/scripts/hooks_doctor.ts +4 -1
  520. package/src/scripts/hot_context_hook.ts +41 -401
  521. package/src/scripts/install.ts +1 -1
  522. package/src/scripts/interruption_report.ts +8 -2
  523. package/src/scripts/janitor.ts +8 -1
  524. package/src/scripts/lint_evidence_artifacts.ts +1 -0
  525. package/src/scripts/lint_knowledge_scale.ts +0 -26
  526. package/src/scripts/measure_turn_end_gate.ts +302 -5
  527. package/src/scripts/memory_lookup.ts +9 -9
  528. package/src/scripts/release.ts +52 -64
  529. package/src/scripts/release_drill.ts +193 -14
  530. package/src/scripts/release_env.ts +1 -1
  531. package/src/scripts/release_publication.ts +1 -1
  532. package/src/scripts/report_held_object_arrivals.ts +456 -0
  533. package/src/scripts/report_standing_payload_by_host.ts +7 -7
  534. package/src/scripts/session_memory_index.ts +5 -0
  535. package/src/scripts/sync_agent_settings.ts +394 -12
  536. package/src/server/io/yamlIO.ts +175 -17
  537. package/src/server/schemas/settings.ts +25 -5
  538. package/src/shared/settingsSurface.ts +13 -2
  539. package/src/templates/compact-instructions.md +8 -3
  540. package/dist/agent-src/commands/chat-history/import.md +0 -170
  541. package/dist/agent-src/commands/chat-history.md +0 -63
@@ -30,21 +30,21 @@
30
30
  * 3. Confirm — show preview, ask once (skippable with --yes;
31
31
  * `--ci` always needs --yes — CI has no terminal).
32
32
  * 4. Branch + bump — create `release/X.Y.Z`, update package.json,
33
- * .claude-plugin/marketplace.json, CHANGELOG.md,
34
- * then run `task release-prepare` so pack
35
- * manifests and tool projections pick up the
36
- * new version (otherwise the PR's own consistency
37
- * check fails — see PR #226 post-mortem).
33
+ * marketplace.json and CHANGELOG.md, then run
34
+ * `task release-prepare` so pack manifests and tool
35
+ * projections pick up the new version (skip it and
36
+ * the PR's own consistency check fails — PR #226).
38
37
  * 5. Commit + push — `release: X.Y.Z`, push branch, open PR.
39
38
  * 6. Wait for CI — `gh pr checks --watch` (skippable with --no-wait).
40
- * 7. Merge — `gh pr merge --merge --delete-branch`.
41
- * 8. Tag main — fast-forward main, tag the merge commit, push
42
- * the tag (triggers publish-npm.yml — except
43
- * under `--ci`, see step 9).
44
- * 9. GitHub Release — `gh release create X.Y.Z --notes <changelog>`;
45
- * under `--ci`, also dispatches
46
- * release-guard.yml + publish-npm.yml +
47
- * cloud-release.yml explicitly.
39
+ * 7. Findings ledger — VERIFY it is on the branch and dispositioned, and
40
+ * STOP otherwise; `self-review-gate.yml` builds it.
41
+ * 8. Merge — `gh pr merge --merge --delete-branch`.
42
+ * 9. Tag main — fast-forward main, tag the merge commit, push the
43
+ * tag (triggers publish-npm.yml, except under --ci).
44
+ * 10. GitHub Release — `gh release create X.Y.Z --notes <changelog>`; under
45
+ * `--ci`, also dispatches release-guard.yml,
46
+ * publish-npm.yml and cloud-release.yml explicitly.
47
+ * 11. Cleanup — delete the merged release branch, local + remote.
48
48
  *
49
49
  * Idempotency: pass `--resume` to recover from a partial failure. Each
50
50
  * step then probes existing state (branch, commit, PR, tag, GitHub
@@ -128,6 +128,8 @@ import {
128
128
  } from './_lib/release_highlights.js';
129
129
  import { canPrompt, promptLine } from './_lib/tty_prompt.js';
130
130
  import { preflightPosition } from './_lib/release_position.js';
131
+ import { settleFindingsLedger } from './_lib/release_findings_ingest.js';
132
+ import { TAG_TRIGGERED_WORKFLOWS, dispatchTagWorkflows } from './_lib/release_tag_dispatch.js';
131
133
  import {
132
134
  RELEASE_HEAD_DEFAULT,
133
135
  extract_changelog_section,
@@ -858,7 +860,7 @@ function preflight(target: string, opts: { resume?: boolean; ci?: boolean } = {}
858
860
  // The local-in-sync-with-origin check only applies to main; if we're
859
861
  // already on the release branch in resume mode, the relevant invariant
860
862
  // is "main hasn't moved beyond what release/X.Y.Z branched off", which
861
- // `git pull --ff-only` enforces in step 8 anyway.
863
+ // `git pull --ff-only` enforces in step 9 anyway.
862
864
  if (branch === MAIN_BRANCH) {
863
865
  const local = git(['rev-parse', 'HEAD'], { capture: true });
864
866
  const remote = git(['rev-parse', `${REMOTE}/${MAIN_BRANCH}`], { capture: true });
@@ -972,7 +974,7 @@ export function confirmGate(target: string, yes: boolean): ConfirmVerdict {
972
974
  return { proceed: true };
973
975
  }
974
976
 
975
- // ─── orchestration ────────────────────────────────────────────────────────────
977
+ // Orchestration.
976
978
 
977
979
  function _step(n: number, total: number, msg: string): void {
978
980
  process.stdout.write(`[${n}/${total}] ${msg}\n`);
@@ -988,7 +990,7 @@ function execute(
988
990
  const ci = opts.ci ?? false;
989
991
 
990
992
  const branch = `release/${plan.target}`;
991
- const total = 10;
993
+ const total = 11;
992
994
 
993
995
  if (dry_run) {
994
996
  process.stdout.write('(dry-run) no git/gh mutations will be performed.\n');
@@ -1000,12 +1002,12 @@ function execute(
1000
1002
  const pr_state = pr_info ? pr_info['state'] : undefined;
1001
1003
  const pr_merged = pr_state === 'MERGED';
1002
1004
 
1003
- // ─── 1. branch ──────────────────────────────────────────────────────────
1005
+ // Step 1 — branch
1004
1006
  checkout_release_branch(branch, pr_merged, (m) => {
1005
1007
  _step(1, total, m);
1006
1008
  });
1007
1009
 
1008
- // ─── 1b. era split (optional, separate commit) ─────────────────────────
1010
+ // Step 1b — era split (optional, separate commit)
1009
1011
  // Lands as `chore(changelog): split era ...` BEFORE the release commit
1010
1012
  // so the split is reviewable on its own and the release commit only
1011
1013
  // touches the bump + new entry. Idempotent: archive already on disk
@@ -1038,7 +1040,7 @@ function execute(
1038
1040
  }
1039
1041
  }
1040
1042
 
1041
- // ─── 2. file mutations ──────────────────────────────────────────────────
1043
+ // Step 2 — file mutations
1042
1044
  if (pr_merged) {
1043
1045
  _step(2, total, 'PR already merged — skip file bumps');
1044
1046
  } else {
@@ -1074,7 +1076,7 @@ function execute(
1074
1076
 
1075
1077
  guard_release_curation(plan.target, pr_merged);
1076
1078
 
1077
- // ─── 3. commit ──────────────────────────────────────────────────────────
1079
+ // Step 3 — commit
1078
1080
  if (pr_merged) {
1079
1081
  _step(3, total, 'PR already merged — skip commit');
1080
1082
  } else {
@@ -1110,7 +1112,7 @@ function execute(
1110
1112
  // `git push -u` is naturally idempotent — it prints "Everything
1111
1113
  // up-to-date" when remote already matches. push_release_branch
1112
1114
  // additionally absorbs a remote that moved under us.
1113
- // Not a `_step`: a second `[4/10]` makes the cited evidence anchors ambiguous.
1115
+ // Not a `_step`: a second `[4/11]` makes the cited evidence anchors ambiguous.
1114
1116
  process.stdout.write(' · verifying release gates locally (`task release:verify -- --cheap`)\n');
1115
1117
  run(local_release_gate_argv());
1116
1118
 
@@ -1147,7 +1149,7 @@ function execute(
1147
1149
  '--title', `release: ${plan.target}`, '--body', pr_body]);
1148
1150
  }
1149
1151
 
1150
- // ─── 6. wait for checks ─────────────────────────────────────────────────
1152
+ // Step 6 — wait for checks
1151
1153
  if (pr_merged) {
1152
1154
  _step(6, total, 'PR already merged — skip checks wait');
1153
1155
  } else if (wait_for_checks) {
@@ -1157,17 +1159,23 @@ function execute(
1157
1159
  _step(6, total, 'Skip waiting for checks (--no-wait)');
1158
1160
  }
1159
1161
 
1160
- // ─── 7. merge ───────────────────────────────────────────────────────────
1162
+ // Step 7 — the findings ledger: verify, never produce; the module says why.
1163
+ settleFindingsLedger({
1164
+ run, die, repoRoot: REPO_ROOT, remote: REMOTE, trunk: MAIN_BRANCH,
1165
+ step: (m) => { _step(7, total, m); }, write: (s) => process.stdout.write(s),
1166
+ resolvePr: () => Number((pr_info ?? _pr_for_branch(branch))?.['number'] ?? NaN) || null,
1167
+ }, plan.target, branch, pr_merged);
1168
+ // Step 8 — merge
1161
1169
  if (pr_merged) {
1162
- _step(7, total, `PR #${pr_info!['number']} already merged — skip`);
1170
+ _step(8, total, `PR #${pr_info!['number']} already merged — skip`);
1163
1171
  } else {
1164
- _step(7, total, 'Merge pull request (merge commit) and delete branch');
1172
+ _step(8, total, 'Merge pull request (merge commit) and delete branch');
1165
1173
  merge_release_pr(branch, wait_for_checks);
1166
1174
  }
1167
1175
 
1168
- // ─── 8. tag main + push tag ─────────────────────────────────────────────
1176
+ // Step 9 — tag main + push tag
1169
1177
  // Always idempotent — even outside resume mode this prevents a mid-flight
1170
- // crash on step 9 from leaving a half-tagged release that subsequent
1178
+ // crash on step 10 from leaving a half-tagged release that subsequent
1171
1179
  // `task release` invocations can't recover from without `--resume`.
1172
1180
  if (git(['rev-parse', '--abbrev-ref', 'HEAD'], { capture: true }) !== MAIN_BRANCH) {
1173
1181
  run(['git', 'checkout', MAIN_BRANCH]);
@@ -1176,29 +1184,29 @@ function execute(
1176
1184
 
1177
1185
  if (_tag_exists_local(plan.target)) {
1178
1186
  if (_tag_exists_remote(plan.target)) {
1179
- _step(8, total, `Tag ${plan.target} already on ${REMOTE} — skip`);
1187
+ _step(9, total, `Tag ${plan.target} already on ${REMOTE} — skip`);
1180
1188
  } else {
1181
- _step(8, total, `Tag ${plan.target} exists locally — push only`);
1189
+ _step(9, total, `Tag ${plan.target} exists locally — push only`);
1182
1190
  guard_publication(plan.target, 'tag push (resumed)');
1183
1191
  _push_tag(plan.target);
1184
1192
  }
1185
1193
  } else {
1186
1194
  // Sequencing is load-bearing (release-truth Phase 1, council
1187
- // 2026-08-03): merge FIRST (step 7), pull main (above), THEN derive
1195
+ // 2026-08-03): merge FIRST (step 8), pull main (above), THEN derive
1188
1196
  // the tag message from the MERGED changelog — tagging before the
1189
1197
  // merge would read a section that does not exist yet. The annotated
1190
1198
  // tag replaces the previous lightweight one so tag metadata is a
1191
1199
  // fourth surface carrying the same single-source content.
1192
- _step(8, total, `Tag merge commit (annotated, from merged CHANGELOG) and push ${plan.target}`);
1200
+ _step(9, total, `Tag merge commit (annotated, from merged CHANGELOG) and push ${plan.target}`);
1193
1201
  create_and_push_annotated_tag(plan.target);
1194
1202
  }
1195
1203
 
1196
- // ─── 9. GitHub Release ──────────────────────────────────────────────────
1204
+ // Step 10 — GitHub Release
1197
1205
  if (_release_exists(plan.target)) {
1198
- _step(9, total, `GitHub Release ${plan.target} already exists — skip`);
1206
+ _step(10, total, `GitHub Release ${plan.target} already exists — skip`);
1199
1207
  } else {
1200
1208
  _step(
1201
- 9,
1209
+ 10,
1202
1210
  total,
1203
1211
  ci
1204
1212
  ? 'Create GitHub Release (tag push under GITHUB_TOKEN triggers nothing — dispatching next)'
@@ -1223,7 +1231,7 @@ function execute(
1223
1231
  guard_publication(plan.target, 'GitHub Release notes');
1224
1232
  gh(['release', 'create', plan.target, '--title', plan.target, '--notes', notes]);
1225
1233
 
1226
- // ─── 9b. dispatch-chain the tag-triggered workflows (--ci only) ──────
1234
+ // Step 10b — dispatch-chain the tag-triggered workflows (--ci only)
1227
1235
  // release-guard.yml, publish-npm.yml, and cloud-release.yml all
1228
1236
  // trigger on `push: tags: [0-9]+.[0-9]+.[0-9]+`, but a tag pushed
1229
1237
  // with the default GITHUB_TOKEN does NOT fire other workflows
@@ -1234,41 +1242,21 @@ function execute(
1234
1242
  // branch above), so a --resume re-run never re-dispatches a
1235
1243
  // publish that already happened.
1236
1244
  if (ci) {
1237
- _step(9, total, 'Dispatch release-guard.yml + publish-npm.yml + cloud-release.yml for the tag');
1238
- // NON-FATAL by design. By this point the release is already complete
1239
- // — the tag is pushed and the GitHub Release is created above, and
1240
- // npm publish runs asynchronously. These explicit dispatches are a
1241
- // FALLBACK for a tag pushed with the default GITHUB_TOKEN, which does
1242
- // NOT fire tag-triggered workflows (GitHub's recursion guard). When
1243
- // the tag was pushed with a PAT (RELEASE_PR_TOKEN), those three
1244
- // workflows already fired on the push and this dispatch is redundant.
1245
- // Dispatching via the API additionally needs the token's
1246
- // `actions:write` scope; a 403 here (scope missing) must NOT mark an
1247
- // already-shipped release as failed — warn and continue.
1248
- for (const wf of ['release-guard.yml', 'publish-npm.yml', 'cloud-release.yml']) {
1249
- const r = run(['gh', 'workflow', 'run', wf, '--ref', MAIN_BRANCH, '-f', `tag=${plan.target}`], {
1250
- check: false,
1251
- });
1252
- if (r.returncode !== 0) {
1253
- process.stderr.write(
1254
- `⚠️ Could not dispatch ${wf} (exit ${r.returncode}) — the release ${plan.target} is ` +
1255
- `already complete (tag + GitHub Release created; npm publishes async). If the tag was ` +
1256
- `pushed with a PAT, ${wf} already fired on the tag push. If you rely on the explicit ` +
1257
- `dispatch, grant RELEASE_PR_TOKEN the "Actions: read and write" scope (fine-grained PAT) ` +
1258
- `or the "workflow" scope (classic PAT).\n`,
1259
- );
1260
- }
1261
- }
1245
+ _step(10, total, `Dispatch ${TAG_TRIGGERED_WORKFLOWS.join(' + ')} for the tag`);
1246
+ dispatchTagWorkflows(
1247
+ { run, warn: (s) => process.stderr.write(s), trunk: MAIN_BRANCH },
1248
+ plan.target,
1249
+ );
1262
1250
  }
1263
1251
  }
1264
1252
 
1265
- // ─── 10. delete the merged release branch (local + remote) ───────────────
1253
+ // Step 11 — delete the merged release branch (local + remote)
1266
1254
  // Branch hygiene: a merged-but-undeleted release/X.Y.Z is what made
1267
1255
  // `--resume` mis-detect an old version. Delete it now so it can never
1268
1256
  // accumulate. Idempotent — skips whatever is already gone. Never touches
1269
1257
  // `main` or any tag.
1270
1258
  if (dry_run) {
1271
- _step(10, total, `Would delete merged branch ${branch} (local + remote)`);
1259
+ _step(11, total, `Would delete merged branch ${branch} (local + remote)`);
1272
1260
  } else {
1273
1261
  const deleted: string[] = [];
1274
1262
  if (
@@ -1283,7 +1271,7 @@ function execute(
1283
1271
  deleted.push('remote');
1284
1272
  }
1285
1273
  const where = deleted.length > 0 ? deleted.join(' + ') : 'already gone';
1286
- _step(10, total, `Delete merged branch ${branch} (${where})`);
1274
+ _step(11, total, `Delete merged branch ${branch} (${where})`);
1287
1275
  }
1288
1276
 
1289
1277
  process.stdout.write('\n');
@@ -1292,7 +1280,7 @@ function execute(
1292
1280
  process.stdout.write(' npm publish runs asynchronously via publish-npm.yml on the tag.\n');
1293
1281
  }
1294
1282
 
1295
- // ─── entrypoint ───────────────────────────────────────────────────────────────
1283
+ // Entrypoint.
1296
1284
 
1297
1285
  /** Mirror of `argparse.Namespace` for this CLI. */
1298
1286
  interface Args {
@@ -143,6 +143,27 @@ interface WorldConfig {
143
143
  merge_fails_hard?: boolean;
144
144
  /** PR checks fail (watch exits non-zero) — the release must die. */
145
145
  checks_fail?: boolean;
146
+ /**
147
+ * Step 7's world — two knobs, because the step asks two questions.
148
+ *
149
+ * It VERIFIES: the ledger is produced by the self-review workflow, so the
150
+ * only things a scenario can vary are whether the file is on the remote
151
+ * branch and what the disposition gate answers. An earlier version of this
152
+ * step ingested, and carried four more knobs for run discovery and artifact
153
+ * download; those went with it when the owner moved the ingest into CI.
154
+ */
155
+ ledger_on_branch?: boolean;
156
+ /**
157
+ * Whether the ledger is on the TRUNK — the ref the merged path asks.
158
+ *
159
+ * Separate from `ledger_on_branch` because the two states worth testing are
160
+ * exactly the ones a single boolean cannot express: present on the branch
161
+ * and not on the trunk, and the reverse. Defaults to `ledger_on_branch`, so
162
+ * every scenario written before this knob keeps its answer.
163
+ */
164
+ ledger_on_trunk?: boolean;
165
+ /** Exit code + streams the disposition gate answers with. */
166
+ disposition_verdict?: { status: number; stdout: string; stderr: string };
146
167
  /**
147
168
  * Content `git show <target>:CHANGELOG.md` returns.
148
169
  *
@@ -169,7 +190,7 @@ interface WorldConfig {
169
190
  changelog?: string;
170
191
  /**
171
192
  * Content the WORKING-TREE read returns — `read_changelog_text()`, used by
172
- * step 5 (PR body) and step 8 (annotated-tag message).
193
+ * step 5 (PR body) and step 9 (annotated-tag message).
173
194
  *
174
195
  * Added 2026-09-01 with the publication guard (roadmap § 3.1). `changelog`
175
196
  * above only covers `git show <tag>:CHANGELOG.md`; the working tree was
@@ -189,19 +210,20 @@ interface WorldConfig {
189
210
  */
190
211
  tag_created_unpushed?: boolean;
191
212
  /**
192
- * The tag is already on the remote, so step 8 skips entirely and step 9 —
213
+ * The tag is already on the remote, so step 9 skips entirely and step 10 —
193
214
  * the GitHub Release body — is the FIRST irreversible transition the run
194
215
  * reaches. The only state in which the Release guard can be exercised on
195
- * its own, because a marker otherwise stops the run at step 8.
216
+ * its own, because a marker otherwise stops the run at step 9.
196
217
  */
197
218
  tag_already_remote?: boolean;
198
219
  /**
199
220
  * The release PR is ALREADY merged when the run starts — the real
200
- * resume-after-merge state, in which steps 1 through 7 skip and step 8 is
201
- * the first step that does work.
221
+ * resume-after-merge state, in which steps 1 through 6 skip, step 7 still
222
+ * verifies the ledger (on the trunk, since the branch is gone) and step 8
223
+ * is the first step that does work.
202
224
  *
203
225
  * Added 2026-09-02 with `guard_release_branch_push`. Before that guard, a
204
- * marker scenario could start from scratch and still reach step 8, because
226
+ * marker scenario could start from scratch and still reach step 9, because
205
227
  * nothing between the changelog write and the tag looked at the section.
206
228
  * The push guard now stops such a run at step 4 — correctly, and that is
207
229
  * the point of it — which makes this knob the only way left to exercise
@@ -300,6 +322,9 @@ class FakeWorld {
300
322
  private merge_races_once: boolean;
301
323
  private merge_fails_hard: boolean;
302
324
  private checks_fail: boolean;
325
+ private readonly ledger_on_branch: boolean;
326
+ private readonly ledger_on_trunk: boolean | undefined;
327
+ private readonly disposition_verdict: { status: number; stdout: string; stderr: string };
303
328
  private readonly changelog: string;
304
329
  /** Working-tree content; see `WorldConfig.changelog_file`. */
305
330
  readonly changelog_file: string;
@@ -321,6 +346,12 @@ class FakeWorld {
321
346
  this.checks_fail = cfg.checks_fail ?? false;
322
347
  this.pr_merged = cfg.pr_already_merged ?? false;
323
348
  this.release_verify_fails = cfg.release_verify_fails ?? false;
349
+ // Defaults keep every pre-2026-09-11 scenario green: the ledger is
350
+ // already on the branch and the gate is happy, so step 7 is a two-call
351
+ // no-op and the sequencing scenarios stay about sequencing.
352
+ this.ledger_on_branch = cfg.ledger_on_branch ?? true;
353
+ this.ledger_on_trunk = cfg.ledger_on_trunk;
354
+ this.disposition_verdict = cfg.disposition_verdict ?? { status: 0, stdout: '', stderr: '' };
324
355
  }
325
356
 
326
357
  exec(args: readonly string[]): ExecResult {
@@ -483,6 +514,21 @@ class FakeWorld {
483
514
  return OK;
484
515
  }
485
516
 
517
+ // Step 7 — the findings ledger.
518
+ if (cmd.startsWith('git cat-file -e ')) {
519
+ // REF-AWARE, because one boolean for every ref made the two states
520
+ // that distinguish right from wrong inexpressible: on the branch
521
+ // but not the trunk, and the reverse. A fourth review named the
522
+ // merged-path scenario as asserting a string in the argv rather
523
+ // than the ref that was read.
524
+ const onTrunk = this.ledger_on_trunk ?? this.ledger_on_branch;
525
+ const present = cmd.includes('/main:') ? onTrunk : this.ledger_on_branch;
526
+ return present ? OK : { ...OK, status: 1 };
527
+ }
528
+ if (cmd.includes('check_finding_dispositions --release')) {
529
+ return { ...this.disposition_verdict };
530
+ }
531
+
486
532
  throw new Error(`FakeWorld: unscripted command: ${cmd}`);
487
533
  }
488
534
  }
@@ -515,6 +561,139 @@ function _count(world: FakeWorld, needle: string): number {
515
561
  }
516
562
 
517
563
  const SCENARIOS: Record<string, Scenario> = {
564
+ 'findings-ledger-verified-on-the-remote-branch': {
565
+ summary:
566
+ 'step 7: the ledger is on the remote branch and the gate passes — the release continues without producing anything',
567
+ // Step 7 VERIFIES. The ingest lives in the self-review workflow, which
568
+ // commits the ledger to the release branch; two review rounds showed no
569
+ // placement inside this script can produce it, because the gate it
570
+ // anticipates already reds the check step 6 waits on.
571
+ // `resume: false` is load-bearing, not tidiness. `resume` defaults to
572
+ // TRUE here, and on a resumed run the PR number is already in hand — so
573
+ // a scenario that kept the default could not see the `--pr` flag being
574
+ // dropped, which is exactly the hole this scenario asserts against.
575
+ config: { ledger_on_branch: true, resume: false },
576
+ expect_success: true,
577
+ verify: (w) => {
578
+ const f: string[] = [];
579
+ const probe = w.calls.find((c) => c.startsWith('git cat-file -e '));
580
+ _expect(probe !== undefined, 'the ledger presence was never probed', f);
581
+ _expect(
582
+ (probe ?? '').includes('origin/'),
583
+ `the probe read a local ref, which a failed push makes true: ${probe ?? '(none)'}`,
584
+ f,
585
+ );
586
+ _expect(
587
+ !w.calls.some((c) => c.includes('--ingest')),
588
+ 'step 7 ingested — that belongs to the workflow now, not the release',
589
+ f,
590
+ );
591
+ _expect(
592
+ !w.calls.some((c) => c.startsWith('gh run download')),
593
+ 'step 7 downloaded an artifact — the release no longer produces the ledger',
594
+ f,
595
+ );
596
+ // `--pr` is what makes the gate compare the review's own report
597
+ // against the committed ledger. The PR number used to come only
598
+ // from the resume-time probe, so on a FIRST run — this scenario —
599
+ // the flag was silently dropped and the release passed a strictly
600
+ // weaker check than the one it was trying to pre-satisfy.
601
+ _expect(
602
+ w.calls.some(
603
+ (c) => c.includes('check_finding_dispositions --release') && c.includes('--pr '),
604
+ ),
605
+ 'the disposition gate ran without --pr, so an un-ingested finding would pass here',
606
+ f,
607
+ );
608
+ _expect(
609
+ w.calls.includes(`gh pr merge ${w.branch} --merge --delete-branch`),
610
+ 'the release never reached the merge',
611
+ f,
612
+ );
613
+ return f;
614
+ },
615
+ },
616
+ 'findings-ledger-absent-stops-the-release': {
617
+ summary:
618
+ 'step 7: no ledger on the remote branch — the release STOPS rather than merging and tagging without one',
619
+ config: { ledger_on_branch: false },
620
+ expect_success: false,
621
+ verify: (w, error) => {
622
+ const f: string[] = [];
623
+ _expect(
624
+ (error ?? '').includes('is not on origin/'),
625
+ `the stop did not name the ref it checked: ${error ?? '(no error)'}`,
626
+ f,
627
+ );
628
+ _expect(
629
+ !w.calls.includes(`gh pr merge ${w.branch} --merge --delete-branch`),
630
+ 'merged with no ledger — the failure this step exists to end',
631
+ f,
632
+ );
633
+ _expect(!w.tag_remote, 'tagged with no ledger', f);
634
+ return f;
635
+ },
636
+ },
637
+ 'findings-ledger-absent-after-a-hand-merge-still-stops': {
638
+ summary:
639
+ 'step 7: the PR is already merged and no ledger reached the trunk — the release STOPS instead of tagging a version whose ledger does not exist',
640
+ // The reachable path to a shipped version with no ledger, and the one
641
+ // the old code asserted away: the ingest produces nothing, step 7
642
+ // stops, a human merges the PR, and the resumed run used to print "the
643
+ // ledger rode in with it" without reading anything.
644
+ // The two knobs differ on purpose: the ledger IS on the release branch
645
+ // and is NOT on the trunk. A run that read the branch ref would pass
646
+ // here, which is the wrong answer — the branch is deleted and the merge
647
+ // is what decides whether the ledger shipped.
648
+ config: { pr_already_merged: true, ledger_on_branch: true, ledger_on_trunk: false },
649
+ expect_success: false,
650
+ verify: (w, error) => {
651
+ const f: string[] = [];
652
+ _expect(
653
+ (error ?? '').includes('already merged'),
654
+ `the stop did not name the merged state: ${error ?? '(no error)'}`,
655
+ f,
656
+ );
657
+ _expect(
658
+ w.calls.some((c) => c.startsWith('git cat-file -e ') && c.includes('/main:')),
659
+ 'the merged path never asked the trunk whether the ledger is there',
660
+ f,
661
+ );
662
+ _expect(!w.tag_remote, 'tagged a version whose findings ledger does not exist', f);
663
+ return f;
664
+ },
665
+ },
666
+ 'findings-ledger-undispositioned-stops-and-shows-why': {
667
+ summary:
668
+ 'step 7: the disposition gate refuses — the release stops and the operator is shown the gate report, not just its scan line',
669
+ config: {
670
+ ledger_on_branch: true,
671
+ disposition_verdict: {
672
+ status: 1,
673
+ stdout: 'scanned: 1',
674
+ stderr: '- `a1` (critical security: x): no disposition status',
675
+ },
676
+ },
677
+ expect_success: false,
678
+ verify: (w, error) => {
679
+ const f: string[] = [];
680
+ // The defect an independent review reproduced: the stop message
681
+ // preferred stdout, so the operator saw `scanned: 1` and the entire
682
+ // per-finding diagnosis — which the gate writes to stderr — was
683
+ // discarded on the one path where the message has to carry content.
684
+ _expect(
685
+ (error ?? '').includes('no disposition status'),
686
+ `the gate's own diagnosis was swallowed: ${error ?? '(no error)'}`,
687
+ f,
688
+ );
689
+ _expect(
690
+ !w.calls.includes(`gh pr merge ${w.branch} --merge --delete-branch`),
691
+ 'merged over an undispositioned ledger',
692
+ f,
693
+ );
694
+ return f;
695
+ },
696
+ },
518
697
  'plain-run-reuses-an-existing-branch': {
519
698
  summary:
520
699
  'step 1: a PLAIN run (no --resume) over an existing release branch checks it out instead of dying at `git checkout -b`',
@@ -664,7 +843,7 @@ const SCENARIOS: Record<string, Scenario> = {
664
843
  },
665
844
  'marker-refuses-before-tag': {
666
845
  summary:
667
- 'step 8: a draft marker in the merged section refuses BEFORE the annotated tag is created',
846
+ 'step 9: a draft marker in the merged section refuses BEFORE the annotated tag is created',
668
847
  config: {
669
848
  pr_already_merged: true,
670
849
  changelog_file: markedChangelogFixture(current_version()),
@@ -691,7 +870,7 @@ const SCENARIOS: Record<string, Scenario> = {
691
870
  },
692
871
  'marker-refuses-resumed-tag-push': {
693
872
  summary:
694
- 'step 8 (§ 3.2): a tag created but never pushed is NOT pushed when its section carries the marker',
873
+ 'step 9 (§ 3.2): a tag created but never pushed is NOT pushed when its section carries the marker',
695
874
  config: {
696
875
  pr_already_merged: true,
697
876
  tag_created_unpushed: true,
@@ -720,7 +899,7 @@ const SCENARIOS: Record<string, Scenario> = {
720
899
  },
721
900
  'marker-refuses-github-release': {
722
901
  summary:
723
- 'step 9: with the tag already pushed, a marker in the TAGGED section refuses before the Release is created',
902
+ 'step 10: with the tag already pushed, a marker in the TAGGED section refuses before the Release is created',
724
903
  config: {
725
904
  pr_already_merged: true,
726
905
  tag_already_remote: true,
@@ -793,7 +972,7 @@ const SCENARIOS: Record<string, Scenario> = {
793
972
  },
794
973
  },
795
974
  'behind-then-merge': {
796
- summary: 'step 7: head BEHIND main — update branch, re-run checks, merge (9.16.0)',
975
+ summary: 'step 8: head BEHIND main — update branch, re-run checks, merge (9.16.0)',
797
976
  config: { behind_probes: 1 },
798
977
  expect_success: true,
799
978
  verify: (w, _err) => {
@@ -813,7 +992,7 @@ const SCENARIOS: Record<string, Scenario> = {
813
992
  },
814
993
  },
815
994
  'merge-race-recovers': {
816
- summary: 'step 7: main moves between the CLEAN probe and the merge — retry, not crash',
995
+ summary: 'step 8: main moves between the CLEAN probe and the merge — retry, not crash',
817
996
  config: { merge_races_once: true },
818
997
  expect_success: true,
819
998
  verify: (w, _err) => {
@@ -828,7 +1007,7 @@ const SCENARIOS: Record<string, Scenario> = {
828
1007
  },
829
1008
  },
830
1009
  'behind-forever-dies': {
831
- summary: `step 7: BEHIND persists past ${_MERGE_UPDATE_ROUNDS} update rounds — die with the resume command`,
1010
+ summary: `step 8: BEHIND persists past ${_MERGE_UPDATE_ROUNDS} update rounds — die with the resume command`,
832
1011
  config: { behind_probes: 99 },
833
1012
  expect_success: false,
834
1013
  verify: (w, err) => {
@@ -845,7 +1024,7 @@ const SCENARIOS: Record<string, Scenario> = {
845
1024
  },
846
1025
  },
847
1026
  'merge-fails-hard-surfaces': {
848
- summary: 'step 7: a non-BEHIND merge failure surfaces unchanged instead of looping',
1027
+ summary: 'step 8: a non-BEHIND merge failure surfaces unchanged instead of looping',
849
1028
  config: { merge_fails_hard: true },
850
1029
  expect_success: false,
851
1030
  verify: (w, err) => {
@@ -905,7 +1084,7 @@ function run_scenario(name: string): ScenarioOutcome {
905
1084
  const tree_snapshot = _snapshot_step_2_files();
906
1085
  _set_exec_override((args) => world.exec(args));
907
1086
  // The working-tree read, faked for the same reason the command layer is.
908
- // Without this the drill's step 8 reads the repository's real CHANGELOG.md.
1087
+ // Without this the drill's step 9 reads the repository's real CHANGELOG.md.
909
1088
  _set_changelog_reader(() => world.changelog_file);
910
1089
  try {
911
1090
  execute(plan, { wait_for_checks: true, dry_run: false, resume: scenario.config.resume ?? true });
@@ -98,7 +98,7 @@ const CHANGELOG = path.join(REPO_ROOT, 'CHANGELOG.md');
98
98
  * Mirrors `_set_exec_override` in `release_publication.ts`, and exists for the
99
99
  * same reason: `execute()` reads `CHANGELOG.md` off disk at two points (the PR
100
100
  * body and the annotated-tag message), and the release drill fakes commands
101
- * but not the filesystem. Before this seam the drill's step 8 read the
101
+ * but not the filesystem. Before this seam the drill's step 9 read the
102
102
  * repository's REAL changelog — whose current section carries four
103
103
  * `_auto-derived, rewrite before merge:_` lines at `14.13.0` — so a
104
104
  * publication guard added at that call site refused every drill scenario for a
@@ -956,7 +956,7 @@ function _remote_tag_commit(tag: string): string | null {
956
956
 
957
957
  /**
958
958
  * Push a tag, tolerating exactly ONE failure: the concurrent-release race.
959
- * `_tag_exists_remote` in step 8 is a live check, but between it and this
959
+ * `_tag_exists_remote` in step 9 is a live check, but between it and this
960
960
  * push a parallel `task release` run can land the same tag (measured
961
961
  * 2026-08-09, 9.28.0). When the remote tag already points at the same commit
962
962
  * as the local one, the repository IS in the desired state — continue. Any