mandrel 1.93.0 → 2.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 (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -0,0 +1,224 @@
1
+ # Git Conventions — Reference (on-demand)
2
+
3
+ **This rule applies when** you are reasoning about a git-history mechanic that
4
+ the always-on core [`git-conventions.md`](git-conventions.md) deliberately
5
+ summarizes: authoring a **contract change** (config/schema/lifecycle/label/API
6
+ shape), triaging a **push-hook false-negative**, resolving **shared-checkout
7
+ merge contention**, satisfying the **documentation-freshness gate**, or routing
8
+ a retrospective signal via a **`meta::*` label**. The core carries the
9
+ per-commit MUSTs; this file carries the detail behind them. Nothing here
10
+ relaxes a core MUST — read it when the matching work is in play.
11
+
12
+ ## Contract Cutovers — No Shim Layer
13
+
14
+ Mandrel ships as the `mandrel` npm package, whose consumers pin an
15
+ exact lockfile version; they opt into breaks at upgrade time. Operator policy
16
+ for any contract change (config shape, baseline shape, schema, lifecycle
17
+ payload, ticket label, dispatch artifact, public API of a script) is
18
+ therefore:
19
+
20
+ 1. **Hard cutovers only.** Contract changes ship as a single in-tree
21
+ migration of every producer and consumer. There is no parallel
22
+ old-shape support code, no read-side tolerance branch, and no
23
+ feature flag that toggles between the two shapes.
24
+ 2. **The PR diff IS the migration.** A consumer upgrading to a release
25
+ with the change adopts the new shape by upgrading the
26
+ `mandrel` package (`mandrel update`). The PR that lands on
27
+ `main` already moved every internal call site; consumers move on the
28
+ same beat by upgrading.
29
+ 3. **No deprecation ledger, no version-windowed sunsets.** The framework
30
+ does not track "to be removed in vX.Y" entries or run two shapes side
31
+ by side for a release window. If a shape changes, the old shape is
32
+ deleted in the same PR.
33
+
34
+ The codifying decision is **Epic #2646** (the "Hard-Cutover Cleanup Epic"),
35
+ which deleted the existing compatibility shim layer across
36
+ `config-resolver.js`, `lib/config/*.js`, `lib/baselines/`,
37
+ `wave-session.js`, `IExecutionAdapter` / `ManualDispatchAdapter`, lifecycle
38
+ emit shims, and duplicate progress/comment writers in one pass. The
39
+ per-finding closing references (audit Findings #10, #11, #13, #17) live in
40
+ the merged PRs and the Epic #2646 history; the standing forward-looking
41
+ audit lives at [`docs/roadmap.md`](../../docs/roadmap.md) (Part 1 — Model-Evolution Audit).
42
+
43
+ Practical guidance when authoring a contract change:
44
+
45
+ - If you are tempted to add a "legacy shape" branch in a parser or
46
+ resolver, **don't** — update every call site instead, and delete the
47
+ old shape in the same PR.
48
+ - If you cannot land every call site in a single PR (e.g. a
49
+ cross-repository change), the contract change is too large for one
50
+ hard cutover. Split the contract itself, not the rollout.
51
+ - Schema versions remain useful as **identifiers** (so a future consumer
52
+ can detect "I cannot read this artifact"); they are **not** an
53
+ invitation to keep multiple readers alive in the same release.
54
+
55
+ ## Push Validation — the known false-negative signature
56
+
57
+ The core rule is: **never bypass hooks** (`--no-verify`, `--no-gpg-sign`, or
58
+ other hook-skipping flags) unless the operator explicitly authorizes it, and
59
+ if a hook fails, investigate the underlying cause. One recognized exception
60
+ signature is worth naming:
61
+
62
+ - **Known false-negative signature**: a `pre-push`/`pre-commit` failure
63
+ whose message is a _zero-match_ error (e.g. Biome's
64
+ `No files were processed in the specified paths`) rather than a
65
+ reported violation, combined with an agent CWD under a harness-managed
66
+ worktree path a consumer's lint config ignores (e.g.
67
+ `.claude/worktrees/<name>/` against a `files.includes` glob like
68
+ `"!**/.claude"`), is a **consumer-tooling gap**, not a real lint
69
+ failure. It does not authorize `--no-verify`. See
70
+ [`worktree-lifecycle.md` § Harness-worktree ⇄ consumer-lint-ignore interaction](../workflows/helpers/worktree-lifecycle.md#harness-worktree-consumer-lint-ignore-interaction-story-152)
71
+ for the recognition signature and the sanctioned consumer-side fix
72
+ (`--no-errors-on-unmatched` or equivalent) before escalating via
73
+ `agent::blocked`.
74
+
75
+ ## Local checkout hygiene — full mechanics
76
+
77
+ **Invariant (stated in the core): the delivering flow owns tidying the local
78
+ checkout — reaping its own merged refs and fast-forwarding the base branch.
79
+ `/git-cleanup` is a recovery tool, not a routine chore.** The mechanics behind
80
+ that invariant:
81
+
82
+ Every flow that lands work — `/deliver` and `/git-deliver` — is responsible
83
+ for leaving the local checkout tidy without
84
+ operator intervention:
85
+
86
+ - **Fast-forwarding the base branch is owned by the flow.** `/deliver`
87
+ fast-forwards `main` itself in its cleanup phase (via
88
+ `git-cleanup.js --fast-forward-main --execute --yes`). No workflow ends by
89
+ telling the operator to "run `/git-cleanup` afterwards to catch up".
90
+ - **Reaping merged local refs is owned by the flow's next boot.** `/plan` and
91
+ `/git-deliver` open with a **protected boot sweep**
92
+ (`boot-sweep.js`) that fast-forwards `main`, prunes stale remote-tracking
93
+ refs, and reaps every local branch whose PR is already merged — skipping any
94
+ candidate with unpushed work, a dirty worktree, or a still-open parent
95
+ ticket. A branch a flow leaves behind (e.g. a `/git-deliver` feature branch
96
+ whose PR merges out of band) is therefore reaped automatically at the next
97
+ workflow boot, not left for the operator to sweep by hand. `boot-sweep.js`
98
+ defaults its `--include` glob to `story-*` — a bare invocation only sweeps
99
+ Story branches; `/plan` and `/git-deliver` widen the scope to their own
100
+ branch namespaces (`epic/*`, `feat/*`, `fix/*`, `chore/*`, `docs/*`,
101
+ `refactor/*`) by passing `--include` explicitly at their boot call site.
102
+ A branch the planner detects only via the weaker content-equivalence
103
+ signal (`detectedBy: 'content-merged'`, Story #4395's
104
+ `git merge-tree --write-tree` probe — content already landed in the base
105
+ branch by another route, such as a squash-merged Epic PR, with no merged
106
+ PR or git ancestry of its own) is **never** reaped by the boot sweep: it
107
+ is report-only, surfaced under `contentMerged` in the result envelope and
108
+ a routing hint in the summary line (Story #4396), so the operator can
109
+ send it to `/git-cleanup` for a confirmed, eyeballed reap.
110
+ - **`/git-cleanup` is recovery, not routine.** Run it by hand only to recover
111
+ an unusual state the automated hygiene does not cover — triaging stashes,
112
+ reaping across non-standard branch namespaces, or `--remote` pruning after a
113
+ force-push diverged a tip. It is **not** the expected way to keep `main`
114
+ current or to clear merged branches after a normal delivery; the delivering
115
+ flows already own that. If you find yourself reaching for `/git-cleanup`
116
+ after every routine `/deliver` or `/git-deliver` run, that is a signal the
117
+ owning flow's hygiene step regressed — fix the flow, do not codify the manual
118
+ sweep.
119
+
120
+ ### Shared-checkout contention (Story #4460)
121
+
122
+ `story-close.js`'s merge phase runs `git checkout <epic-branch>` directly in
123
+ the **shared main repo checkout** (`close-inputs.js` resolves `mainCwd` to
124
+ `PROJECT_ROOT`), not an isolated worktree. `lib/epic-merge-lock.js` guards
125
+ that checkout with a **per-Epic** filesystem lock
126
+ (`epic-<epicId>.merge.lock`) so two `story-close.js` runs for the **same**
127
+ Epic serialize against each other — but nothing stops a **different**
128
+ Epic's concurrently-running `story-close.js` from treating the same shared
129
+ checkout as scratch space at the same time.
130
+
131
+ - **Recognition signature**: a `git checkout`/`git switch` failure during
132
+ the merge phase whose message is `error: Your local changes ... would be
133
+ overwritten by checkout`, where the shared checkout is parked on a
134
+ **different** epic's branch (e.g. `epic/4405`) than the one the current
135
+ `story-close.js` run is trying to merge (e.g. `epic/4425`), with
136
+ uncommitted edits that belong to that other Epic's delivery. This was
137
+ observed live during Epic #4425 delivery (Stories #4427/#4428) colliding
138
+ with a concurrently-running Epic #4405 session, and had to be worked
139
+ around by hand via `git stash push -u`.
140
+ - **The fix — `assertSharedCheckoutAvailable`**
141
+ (`lib/orchestration/story-close/shared-checkout-guard.js`), called from
142
+ `runFinalizeMerge` in `lib/orchestration/story-close/merge-runner.js`
143
+ immediately before the merge-phase `git checkout <epicBranch>`. It
144
+ **composes with, not replaces,** the per-Epic lock:
145
+ - It first checks the shared common `.git/` dir for a **foreign**
146
+ (different-epic) `epic-*.merge.lock` file whose recorded PID is still
147
+ alive (`findForeignActiveEpicLock` in `lib/epic-merge-lock.js`). If
148
+ found, the merge phase fails fast with a diagnostic naming the holding
149
+ epic id, its lock-file path, and its PID/acquired-at timestamp —
150
+ instead of surfacing the raw git checkout error.
151
+ - It then checks whether the shared checkout is simply dirty (via `git
152
+ status --porcelain`), regardless of whose branch is checked out, and
153
+ reports the dirty file list plus the currently-checked-out branch in
154
+ the failure diagnostic.
155
+ - It never inspects the **caller's own** epic-id lock namespace, so
156
+ same-epic concurrent `story-close.js` runs continue to serialize
157
+ solely through `withEpicMergeLock` (the existing per-Epic lock) before
158
+ this guard ever executes — this guard only ever refuses on a truly
159
+ _foreign_ epic's live lock or unrelated dirt.
160
+ - **Not fixed by this guard**: the guard reports the contention early and
161
+ actionably; it does not redesign the merge phase to use an isolated
162
+ worktree, and it does not change `restoreStartingBranch`'s existing
163
+ dirty-tree refusal behavior (`phases/branch-restore.js`) — both remain
164
+ out of scope. Resolution of an actual collision is still manual: wait for
165
+ the other Epic's story-close run to finish, or — only once you have
166
+ independently confirmed that process is no longer running — remove the
167
+ stale lock file and resolve the dirty tree by hand (stash/commit/reset;
168
+ never `git reset --hard` or `git checkout --force`).
169
+
170
+ ## Documentation Freshness Gate
171
+
172
+ The `validate-docs-freshness.js` gate (run during `/deliver`) asks a
173
+ falsifiable question of every doc in `delivery.docsFreshness.paths` +
174
+ `project.docsContextFiles`: **was this doc actually updated for the Epic?**
175
+ A doc passes on either of two conditions, but they are not
176
+ interchangeable:
177
+
178
+ - **Living docs are satisfied by being rewritten, not annotated.** For
179
+ any non-changelog doc (architecture, decisions, README, guides, …) the
180
+ gate passes **only** when an Epic-referencing commit touched the file —
181
+ a commit whose message references `#<epicId>` and changes the doc.
182
+ Rewrite the doc as part of the Epic's work; do not sprinkle `#<epicId>`
183
+ into its prose to satisfy the check. An appended `#<epicId>` annotation
184
+ alone **fails** the gate for these files, and the failure message names
185
+ the file and the rewrite-not-append contract.
186
+ - **`#<epicId>` body annotations pass only for changelog files.** A
187
+ changelog-class file (basename matches `/changelog/i`, e.g.
188
+ `docs/CHANGELOG.md`) may pass on a body annotation, because an appended
189
+ release note keyed to the Epic is the legitimate, expected update there.
190
+ This is the single sanctioned annotation path; every other doc must use
191
+ the rewrite path above.
192
+
193
+ This restriction exists to remove the perverse incentive by which the
194
+ gate would otherwise reward manufacturing fake provenance — appending
195
+ Epic-ID history into living docs purely to clear the check.
196
+
197
+ ## Meta Labels (Retrospective Signal Routing)
198
+
199
+ Two `meta::*` labels route retrospective signals into durable substrates so
200
+ the `/plan` Phase 0 fetcher (see
201
+ [`prior-feedback-fetcher.js`](../scripts/lib/feedback-loop/prior-feedback-fetcher.js))
202
+ can surface open feedback issues to the planner. Both labels live in
203
+ [`label-constants.js`](../scripts/lib/label-constants.js) under the
204
+ `META_LABELS` export — reference them by symbol from scripts rather than
205
+ hard-coding the string.
206
+
207
+ ### `meta::framework-gap`
208
+
209
+ Apply this label to a GitHub issue that surfaces a defect, missing
210
+ capability, or weak ergonomic in the **framework itself** (anything under
211
+ `.agents/` or the dispatcher engine). Typical sources: a retrospective that
212
+ identifies a workflow that does not yet exist, a hook that should fire but
213
+ does not, or a script-level usability problem that should be solved
214
+ upstream rather than worked around in a consumer project.
215
+
216
+ ### `meta::consumer-improvement`
217
+
218
+ Apply this label to a GitHub issue that surfaces an improvement that lives
219
+ in a **consumer project** (workflow tweaks, ergonomic asks, doc polish, or
220
+ project-local automation). The work is scoped to the consumer's
221
+ `.agents/`-driven layer or the consumer's own codebase, not to upstream
222
+ framework changes. Issues that span both axes should carry both labels —
223
+ `fetchPriorFeedback` dedupes by issue number so a dual-labeled issue
224
+ appears exactly once in the planner context.
@@ -1,30 +1,33 @@
1
1
  # Git & Version Control Conventions
2
2
 
3
3
  This rule applies globally to all repository changes to maintain a clean git
4
- history.
5
-
6
- ## Canonical Branching (v5 Orchestration)
7
-
8
- ### Epic Base Branch
9
-
10
- Each Epic operates on a dedicated **Epic base branch** named `epic/[EPIC_ID]`
11
- (e.g., `epic/98`). This branch is created from the project's base branch
12
- (`main` by default) and serves as the integration target for all Stories
13
- within that Epic.
14
-
15
- ### Story-Level Branching
16
-
17
- All tasks within a Story MUST be committed to a shared **Story branch**:
18
- `story-<storyId>` (e.g., `story-104`). The runtime owns Story branch
19
- creation via `story-init.js`; agents commit on the active Story branch only.
20
-
21
- > **Commit subjects.** Under the 2-tier hierarchy
22
- > (Epic Story), Stories have no child tickets. Commits
23
- > land on `story-<storyId>` directly from the agent and the
24
- > Conventional Commit subject references the parent Story via
25
- > `(refs #<storyId>)`. See
26
- > [`.agents/instructions.md` § 5.D](../instructions.md) for the
27
- > full hierarchy contract.
4
+ history. It is the **always-on core**: branch shapes, the Conventional-Commit
5
+ subject contract, issue references, and the non-negotiable push/hygiene MUSTs.
6
+
7
+ Deeper mechanics — the hard-cutover contract policy, the push-hook
8
+ false-negative signature, shared-checkout merge contention, the
9
+ documentation-freshness gate, and the `meta::*` retrospective-routing labels —
10
+ live in the on-demand
11
+ [`git-conventions-reference.md`](git-conventions-reference.md). Read that file
12
+ **before** doing the matching work; the core below is sufficient for every
13
+ routine commit, branch, and PR.
14
+
15
+ ## Canonical Branching (v2)
16
+
17
+ ### Story branch PR main
18
+
19
+ Every Story lands on a dedicated **Story branch** named `story-<storyId>`
20
+ (e.g., `story-104`), seeded from `project.baseBranch` (`main` by default).
21
+ The runtime owns branch creation via `single-story-init.js`; agents commit
22
+ on that branch only. Close opens a PR against `main` (squash + required
23
+ checks). There is **no** `epic/<id>` integration branch and no `--no-ff`
24
+ wave merge.
25
+
26
+ > **Commit subjects.** Stories have no child tickets. Commits land on
27
+ > `story-<storyId>` directly from the agent and the Conventional Commit
28
+ > subject references the Story via `(refs #<storyId>)`. See
29
+ > [`.agents/instructions.md` § 5.D](../instructions.md) for the hierarchy
30
+ > contract.
28
31
 
29
32
  ## Conventional Commits
30
33
 
@@ -44,49 +47,6 @@ creation via `story-init.js`; agents commit on the active Story branch only.
44
47
  titles edited in the GitHub UI; author the PR title in conventional form
45
48
  so the squash commit on `main` parses cleanly for release-please.
46
49
 
47
- ## Contract Cutovers — No Shim Layer
48
-
49
- Mandrel ships as the `mandrel` npm package, whose consumers pin an
50
- exact lockfile version; they opt into breaks at upgrade time. Operator policy
51
- for any contract change (config shape, baseline shape, schema, lifecycle
52
- payload, ticket label, dispatch artifact, public API of a script) is
53
- therefore:
54
-
55
- 1. **Hard cutovers only.** Contract changes ship as a single in-tree
56
- migration of every producer and consumer. There is no parallel
57
- old-shape support code, no read-side tolerance branch, and no
58
- feature flag that toggles between the two shapes.
59
- 2. **The PR diff IS the migration.** A consumer upgrading to a release
60
- with the change adopts the new shape by upgrading the
61
- `mandrel` package (`mandrel update`). The PR that lands on
62
- `main` already moved every internal call site; consumers move on the
63
- same beat by upgrading.
64
- 3. **No deprecation ledger, no version-windowed sunsets.** The framework
65
- does not track "to be removed in vX.Y" entries or run two shapes side
66
- by side for a release window. If a shape changes, the old shape is
67
- deleted in the same PR.
68
-
69
- The codifying decision is **Epic #2646** (the "Hard-Cutover Cleanup Epic"),
70
- which deleted the existing compatibility shim layer across
71
- `config-resolver.js`, `lib/config/*.js`, `lib/baselines/`,
72
- `wave-session.js`, `IExecutionAdapter` / `ManualDispatchAdapter`, lifecycle
73
- emit shims, and duplicate progress/comment writers in one pass. The
74
- per-finding closing references (audit Findings #10, #11, #13, #17) live in
75
- the merged PRs and the Epic #2646 history; the standing forward-looking
76
- audit lives at [`docs/roadmap.md`](../../docs/roadmap.md) (Part 1 — Model-Evolution Audit).
77
-
78
- Practical guidance when authoring a contract change:
79
-
80
- - If you are tempted to add a "legacy shape" branch in a parser or
81
- resolver, **don't** — update every call site instead, and delete the
82
- old shape in the same PR.
83
- - If you cannot land every call site in a single PR (e.g. a
84
- cross-repository change), the contract change is too large for one
85
- hard cutover. Split the contract itself, not the rollout.
86
- - Schema versions remain useful as **identifiers** (so a future consumer
87
- can detect "I cannot read this artifact"); they are **not** an
88
- invitation to keep multiple readers alive in the same release.
89
-
90
50
  ## Push Validation & Reliability
91
51
 
92
52
  To prevent "silent" push failures (e.g., hidden by multi-command chains or
@@ -106,19 +66,12 @@ rejected by `pre-push` hooks):
106
66
  contained more than the linting fix.
107
67
  4. **Never bypass hooks**: Do not use `--no-verify`, `--no-gpg-sign`, or
108
68
  other hook-skipping flags unless the operator explicitly authorizes it.
109
- If a hook fails, investigate the underlying cause.
110
- - **Known false-negative signature**: a `pre-push`/`pre-commit` failure
111
- whose message is a _zero-match_ error (e.g. Biome's
112
- `No files were processed in the specified paths`) rather than a
113
- reported violation, combined with an agent CWD under a harness-managed
114
- worktree path a consumer's lint config ignores (e.g.
115
- `.claude/worktrees/<name>/` against a `files.includes` glob like
116
- `"!**/.claude"`), is a **consumer-tooling gap**, not a real lint
117
- failure. It does not authorize `--no-verify`. See
118
- [`worktree-lifecycle.md` § Harness-worktree ⇄ consumer-lint-ignore interaction](../workflows/helpers/worktree-lifecycle.md#harness-worktree-consumer-lint-ignore-interaction-story-152)
119
- for the recognition signature and the sanctioned consumer-side fix
120
- (`--no-errors-on-unmatched` or equivalent) before escalating via
121
- `agent::blocked`.
69
+ If a hook fails, investigate the underlying cause. One recognized
70
+ exception a Biome _zero-match_ failure under a harness-managed
71
+ worktree path the consumer's lint config ignores — is a consumer-tooling
72
+ gap, **not** authorization to skip the hook; its recognition signature
73
+ and sanctioned fix live in
74
+ [`git-conventions-reference.md` § Push Validation](git-conventions-reference.md).
122
75
 
123
76
  ## Local checkout hygiene
124
77
 
@@ -127,149 +80,15 @@ own merged refs and fast-forwarding the base branch. `/git-cleanup` is a
127
80
  recovery tool, not a routine chore.**
128
81
 
129
82
  Every flow that lands work — `/deliver` (Epic and standalone-Story paths),
130
- `/git-deliver` — is responsible for leaving the local checkout tidy without
131
- operator intervention:
132
-
133
- - **Fast-forwarding the base branch is owned by the flow.** The standalone
134
- multi-Story path fast-forwards `main` itself in its summary phase (via
135
- `git-cleanup.js --fast-forward-main --execute --yes`); the Epic path
136
- fast-forwards `epic/<id>` / `main` on its merge-and-reap beat. No workflow
137
- ends by telling the operator to "run `/git-cleanup` afterwards to catch up".
138
- - **Reaping merged local refs is owned by the flow's next boot.** `/plan` and
139
- `/git-deliver` open with a **protected boot sweep**
140
- (`boot-sweep.js`) that fast-forwards `main`, prunes stale remote-tracking
141
- refs, and reaps every local branch whose PR is already merged — skipping any
142
- candidate with unpushed work, a dirty worktree, or a still-open parent
143
- ticket. A branch a flow leaves behind (e.g. a `/git-deliver` feature branch
144
- whose PR merges out of band) is therefore reaped automatically at the next
145
- workflow boot, not left for the operator to sweep by hand. `boot-sweep.js`
146
- defaults its `--include` glob to `story-*` — a bare invocation only sweeps
147
- Story branches; `/plan` and `/git-deliver` widen the scope to their own
148
- branch namespaces (`epic/*`, `feat/*`, `fix/*`, `chore/*`, `docs/*`,
149
- `refactor/*`) by passing `--include` explicitly at their boot call site.
150
- A branch the planner detects only via the weaker content-equivalence
151
- signal (`detectedBy: 'content-merged'`, Story #4395's
152
- `git merge-tree --write-tree` probe — content already landed in the base
153
- branch by another route, such as a squash-merged Epic PR, with no merged
154
- PR or git ancestry of its own) is **never** reaped by the boot sweep: it
155
- is report-only, surfaced under `contentMerged` in the result envelope and
156
- a routing hint in the summary line (Story #4396), so the operator can
157
- send it to `/git-cleanup` for a confirmed, eyeballed reap.
158
- - **`/git-cleanup` is recovery, not routine.** Run it by hand only to recover
159
- an unusual state the automated hygiene does not cover — triaging stashes,
160
- reaping across non-standard branch namespaces, or `--remote` pruning after a
161
- force-push diverged a tip. It is **not** the expected way to keep `main`
162
- current or to clear merged branches after a normal delivery; the delivering
163
- flows already own that. If you find yourself reaching for `/git-cleanup`
164
- after every routine `/deliver` or `/git-deliver` run, that is a signal the
165
- owning flow's hygiene step regressed — fix the flow, do not codify the manual
166
- sweep.
167
-
168
- ### Shared-checkout contention (Story #4460)
169
-
170
- `story-close.js`'s merge phase runs `git checkout <epic-branch>` directly in
171
- the **shared main repo checkout** (`close-inputs.js` resolves `mainCwd` to
172
- `PROJECT_ROOT`), not an isolated worktree. `lib/epic-merge-lock.js` guards
173
- that checkout with a **per-Epic** filesystem lock
174
- (`epic-<epicId>.merge.lock`) so two `story-close.js` runs for the **same**
175
- Epic serialize against each other — but nothing stops a **different**
176
- Epic's concurrently-running `story-close.js` from treating the same shared
177
- checkout as scratch space at the same time.
178
-
179
- - **Recognition signature**: a `git checkout`/`git switch` failure during
180
- the merge phase whose message is `error: Your local changes ... would be
181
- overwritten by checkout`, where the shared checkout is parked on a
182
- **different** epic's branch (e.g. `epic/4405`) than the one the current
183
- `story-close.js` run is trying to merge (e.g. `epic/4425`), with
184
- uncommitted edits that belong to that other Epic's delivery. This was
185
- observed live during Epic #4425 delivery (Stories #4427/#4428) colliding
186
- with a concurrently-running Epic #4405 session, and had to be worked
187
- around by hand via `git stash push -u`.
188
- - **The fix — `assertSharedCheckoutAvailable`**
189
- (`lib/orchestration/story-close/shared-checkout-guard.js`), called from
190
- `runFinalizeMerge` in `lib/orchestration/story-close/merge-runner.js`
191
- immediately before the merge-phase `git checkout <epicBranch>`. It
192
- **composes with, not replaces,** the per-Epic lock:
193
- - It first checks the shared common `.git/` dir for a **foreign**
194
- (different-epic) `epic-*.merge.lock` file whose recorded PID is still
195
- alive (`findForeignActiveEpicLock` in `lib/epic-merge-lock.js`). If
196
- found, the merge phase fails fast with a diagnostic naming the holding
197
- epic id, its lock-file path, and its PID/acquired-at timestamp —
198
- instead of surfacing the raw git checkout error.
199
- - It then checks whether the shared checkout is simply dirty (via `git
200
- status --porcelain`), regardless of whose branch is checked out, and
201
- reports the dirty file list plus the currently-checked-out branch in
202
- the failure diagnostic.
203
- - It never inspects the **caller's own** epic-id lock namespace, so
204
- same-epic concurrent `story-close.js` runs continue to serialize
205
- solely through `withEpicMergeLock` (the existing per-Epic lock) before
206
- this guard ever executes — this guard only ever refuses on a truly
207
- _foreign_ epic's live lock or unrelated dirt.
208
- - **Not fixed by this guard**: the guard reports the contention early and
209
- actionably; it does not redesign the merge phase to use an isolated
210
- worktree, and it does not change `restoreStartingBranch`'s existing
211
- dirty-tree refusal behavior (`phases/branch-restore.js`) — both remain
212
- out of scope. Resolution of an actual collision is still manual: wait for
213
- the other Epic's story-close run to finish, or — only once you have
214
- independently confirmed that process is no longer running — remove the
215
- stale lock file and resolve the dirty tree by hand (stash/commit/reset;
216
- never `git reset --hard` or `git checkout --force`).
217
-
218
- ## Documentation Freshness Gate
219
-
220
- The `validate-docs-freshness.js` gate (run during `/deliver`) asks a
221
- falsifiable question of every doc in `delivery.docsFreshness.paths` +
222
- `project.docsContextFiles`: **was this doc actually updated for the Epic?**
223
- A doc passes on either of two conditions, but they are not
224
- interchangeable:
225
-
226
- - **Living docs are satisfied by being rewritten, not annotated.** For
227
- any non-changelog doc (architecture, decisions, README, guides, …) the
228
- gate passes **only** when an Epic-referencing commit touched the file —
229
- a commit whose message references `#<epicId>` and changes the doc.
230
- Rewrite the doc as part of the Epic's work; do not sprinkle `#<epicId>`
231
- into its prose to satisfy the check. An appended `#<epicId>` annotation
232
- alone **fails** the gate for these files, and the failure message names
233
- the file and the rewrite-not-append contract.
234
- - **`#<epicId>` body annotations pass only for changelog files.** A
235
- changelog-class file (basename matches `/changelog/i`, e.g.
236
- `docs/CHANGELOG.md`) may pass on a body annotation, because an appended
237
- release note keyed to the Epic is the legitimate, expected update there.
238
- This is the single sanctioned annotation path; every other doc must use
239
- the rewrite path above.
240
-
241
- This restriction exists to remove the perverse incentive by which the
242
- gate would otherwise reward manufacturing fake provenance — appending
243
- Epic-ID history into living docs purely to clear the check.
244
-
245
- ## Meta Labels (Retrospective Signal Routing)
246
-
247
- Two `meta::*` labels route retrospective signals into durable substrates so
248
- the `/plan` Phase 0 fetcher (see
249
- [`prior-feedback-fetcher.js`](../scripts/lib/feedback-loop/prior-feedback-fetcher.js))
250
- can surface open feedback issues to the planner. Both labels live in
251
- [`label-constants.js`](../scripts/lib/label-constants.js) under the
252
- `META_LABELS` export — reference them by symbol from scripts rather than
253
- hard-coding the string.
254
-
255
- ### `meta::framework-gap`
256
-
257
- Apply this label to a GitHub issue that surfaces a defect, missing
258
- capability, or weak ergonomic in the **framework itself** (anything under
259
- `.agents/` or the dispatcher engine). Typical sources: a retrospective that
260
- identifies a workflow that does not yet exist, a hook that should fire but
261
- does not, or a script-level usability problem that should be solved
262
- upstream rather than worked around in a consumer project.
263
-
264
- ### `meta::consumer-improvement`
265
-
266
- Apply this label to a GitHub issue that surfaces an improvement that lives
267
- in a **consumer project** (workflow tweaks, ergonomic asks, doc polish, or
268
- project-local automation). The work is scoped to the consumer's
269
- `.agents/`-driven layer or the consumer's own codebase, not to upstream
270
- framework changes. Issues that span both axes should carry both labels —
271
- `fetchPriorFeedback` dedupes by issue number so a dual-labeled issue
272
- appears exactly once in the planner context.
83
+ `/git-deliver` — leaves the local checkout tidy without operator
84
+ intervention: it fast-forwards the base branch itself, and reaps its own
85
+ merged local refs on the next workflow boot (the `boot-sweep.js` protected
86
+ sweep). Do **not** end a workflow by telling the operator to run
87
+ `/git-cleanup` to catch up; `/git-cleanup` is for recovering an unusual state
88
+ the automated hygiene does not cover. The boot-sweep scope rules, the
89
+ content-merged report-only case, and the shared-checkout merge-contention
90
+ guard are detailed in
91
+ [`git-conventions-reference.md` § Local checkout hygiene](git-conventions-reference.md).
273
92
 
274
93
  ## Pull Requests
275
94
 
@@ -35,6 +35,8 @@ local override may relax them. The skill is updated to match.
35
35
  "Logged in" is not "allowed".
36
36
  - Users MUST only be able to access or modify resources they own; ownership
37
37
  checks MUST run server-side before any state change.
38
+ - Inbound webhooks and server-to-server callbacks MUST verify the sender's
39
+ signature before parsing the payload; never act on an unverified webhook.
38
40
  - Admin or elevated actions MUST verify the role server-side; never trust a
39
41
  client-asserted role claim.
40
42
 
@@ -57,6 +59,9 @@ local override may relax them. The skill is updated to match.
57
59
  - NEVER log Personal Identifiable Information (PII) such as emails, passwords,
58
60
  full credit card numbers, session tokens, or phone numbers.
59
61
  - Avoid logging complete objects directly; destructure out safe properties.
62
+ Prefer logging entities by opaque ID (e.g. `userId`), and sanitize user input
63
+ before it reaches an error log so a payload cannot smuggle PII through the
64
+ error path.
60
65
 
61
66
  ## Transport & Headers
62
67