mandrel 1.94.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -1,436 +0,0 @@
1
- ---
2
- description: >-
3
- Helper — not a slash command. Execute one Epic-attached Story end-to-end on
4
- behalf of `/deliver`. Calls `story-init.js`, `cd`s into the worktree,
5
- runs the Story-implementation phase against the inline acceptance[] /
6
- verify[] arrays, writes a `story-run-progress` snapshot per transition, and
7
- finally calls `story-close.js` to merge into the Epic branch and reap the
8
- worktree.
9
- caller: epic-deliver.md
10
- ---
11
-
12
- # helpers/epic-deliver-story — Epic-attached Story worker
13
-
14
- > **Not a slash command.** This file lives in `helpers/` and is not projected
15
- > into the mandrel plugin command tree. It is invoked exclusively by the
16
- > [`/deliver`](deliver-epic.md) per-wave fan-out via an `Agent` tool call —
17
- > `subagent_type: story-worker` when `delivery.routing.roleScopedAgents` is on
18
- > (the default), else `subagent_type: general-purpose` (Epic #4478, M7-B). Run
19
- > `/deliver <epicId>` from the operator surface, not this helper directly.
20
-
21
- ## Overview
22
-
23
- `epic-deliver-story` is the **single-Story worker** for Epic-attached Stories.
24
- It sits below [`/deliver`](deliver-epic.md) (which fans out one Story
25
- sub-agent per slot, per wave) and runs one Story from init to close in one
26
- invocation.
27
-
28
- ```text
29
- /deliver <epicId>
30
- → for each wave N:
31
- Agent tool × concurrencyCap parallel calls (one assistant turn):
32
- helpers/epic-deliver-story <storyId>
33
- → story-init.js
34
- → single Story-implementation phase using inline
35
- acceptance[] / verify[] from the Story body
36
- → story-close.js
37
- ```
38
-
39
- The argument is always a **Story ID** (`type::story`). Epic IDs go through
40
- [`/deliver`](deliver-epic.md).
41
-
42
- **Standalone Stories** (no `Epic: #N` in body) use
43
- [`/deliver`](deliver-stories.md) instead — that workflow's helper
44
- branches from `main`, opens its PR directly to `main`, and skips the
45
- Epic-scoped machinery (cascade, dispatch manifest, dashboard regen). This
46
- helper requires a parent Epic and will refuse to initialize a Story that lacks
47
- the `Epic: #N` reference.
48
-
49
- > **Worktree isolation.** When `delivery.worktreeIsolation.enabled` is
50
- > `true`, Step 0 creates a worktree at `.worktrees/story-<id>/` and prints
51
- > its absolute path as `workCwd`. You **must** `cd` into that path before
52
- > Step 1. The main checkout's HEAD is never moved. See
53
- > [`worktree-lifecycle.md`](worktree-lifecycle.md) for node_modules
54
- > strategies, Windows notes, and escape hatches.
55
-
56
- ---
57
-
58
- ## Non-interactive execution contract
59
-
60
- `epic-deliver-story` runs as a sub-agent of `/deliver`'s per-wave fan-out
61
- (common case) or interactively for a single Story. Sub-agent runs share
62
- the parent's permissions but have **no input channel** mid-run.
63
-
64
- - **Never** ask clarifying questions as a sub-agent. Pick the narrowest
65
- reasonable interpretation that satisfies the Story's AC. If you cannot
66
- proceed, transition to `agent::blocked`, post a `friction` comment with
67
- the decision needed and the default assumption, and exit non-zero.
68
- - **Never** assume tool-permission prompts will be auto-approved. Treat a
69
- blocking prompt as a harness condition and transition to `agent::blocked`.
70
- - **Always** write `story-run-progress` snapshots at every phase
71
- transition so the parent aggregator never falls back to label
72
- re-derivation.
73
-
74
- ---
75
-
76
- ## Step 0 — Initialize (`story-init.js`)
77
-
78
- Run from the **main checkout** (the worktree does not exist yet):
79
-
80
- ```bash
81
- node .agents/scripts/story-init.js --story <storyId>
82
- ```
83
-
84
- **No spec-ticket threading (Story #4324).** The Tech Spec lives as managed
85
- sections of the Epic body — there is no separate Tech-Spec issue, no
86
- `--tech-spec` flag, and no per-Story hierarchy trace to a spec ticket.
87
- Your hydrated prompt already embeds the Epic body (with the
88
- `## Acceptance Table` section stripped), which carries the folded Tech
89
- Spec sections; do not fetch a Tech Spec issue.
90
-
91
- > **Execution mode (sub-agents must read).** This command typically takes
92
- > 3–6 minutes when the worktree's per-tree install runs. Invoke it
93
- > **synchronously** with the Bash tool's maximum timeout
94
- > (`Bash(timeout: 600000)`). Do **not** use `run_in_background` + `Monitor`
95
- > here: `Monitor`'s return is not equivalent to script exit, and a sub-agent
96
- > that exits during a `Monitor` wait kills `story-init.js` mid-batch — the
97
- > worktree is left half-initialized (no `story-init` comment, no Story-level
98
- > `agent::*` label flip) and the parent
99
- > wave aggregator records the Story as failed. The script is idempotent on
100
- > partial state, so the recovery is to re-run it synchronously, but
101
- > prevention is cheaper: just give Bash the 10-minute timeout and block.
102
-
103
- The script validates `type::story`, checks blockers, resolves the parent
104
- Epic id, seeds `story-<id>` from the
105
- Epic branch, and (when worktree isolation is on) runs `git worktree add`
106
- at `.worktrees/story-<id>/`. The Story flips to `agent::executing`. A
107
- `story-init` structured comment is upserted with the Story's inline
108
- `acceptance[]` and `verify[]` arrays from the body.
109
-
110
- Capture `workCwd`, `dependenciesInstalled` (tri-state), and
111
- `context.parentId`. Add `--dry-run` to check
112
- status without git or ticket changes.
113
-
114
- ### Step 0.5 — `cd` into the workCwd
115
-
116
- ```bash
117
- cd "<workCwd from Step 0 result>"
118
- ```
119
-
120
- All subsequent commands run from this directory. The `dependenciesInstalled`
121
- tri-state carries one of three values:
122
-
123
- | Value | Meaning | Action |
124
- | --------- | ---------------------------------------------------------------------------------- | --------------------------------------------------- |
125
- | `true` | Per-worktree install ran and succeeded. | Proceed. |
126
- | `false` | Install was attempted and failed. | The next CLI runs the install before proceeding. |
127
- | `skipped` | No per-worktree install (single-tree, reused worktree, `symlink`, `pnpm-store`). | Trust the strategy. |
128
-
129
- ### Step 0.6 — Initial `story-run-progress` snapshot
130
-
131
- Story #4017 inlined the former standalone prepare CLI into
132
- `story-init.js`: Step 0's init run already applied the install tri-state
133
- in-process (retrying the install command when
134
- `dependenciesInstalled === 'false'`, default `npm ci`) and rendered the
135
- initial snapshot (`phase: "init"`). There is no separate command to run.
136
-
137
- Step 0's init run already upserted the initial `story-run-progress`
138
- snapshot (`phase: "init"`) as a structured comment on the Story — that
139
- comment, refreshed by `story-phase.js` at each transition, is the
140
- authoritative Story-level rollup the parent `/deliver` aggregator reads.
141
- You do **not** relay `prepare.renderedBody` verbatim to chat. Instead,
142
- relay **one line per phase transition** (e.g. `Story #<id>: init →
143
- implementing`), and do the same after every transition in Step 1 / Step 3.
144
- The snapshot CLI carries the full body; the chat line is a terse progress
145
- delta, not a body dump.
146
-
147
- ---
148
-
149
- ## Step 1 — Story implementation
150
-
151
- Run a single Story-implementation phase against the inline `acceptance[]`
152
- / `verify[]` arrays on the Story body.
153
-
154
- 1. Flip the snapshot to the `implementing` phase. Pass `--epic <epicId>`
155
- and `--branch story-<storyId>` from the Step 0 envelope so the render
156
- skips the `readEpicIdFromStory` / `resolveStoryBranch` GitHub reads
157
- (pass these same flags to **every** `story-phase.js` call below):
158
-
159
- ```bash
160
- node .agents/scripts/story-phase.js \
161
- --story <storyId> --epic <epicId> --branch story-<storyId> \
162
- --phase implementing
163
- ```
164
-
165
- > **Liveness between transitions is free (Epic #4476).** These
166
- > `story-phase.js` calls fire only at genuine phase transitions (a few per
167
- > Story) and each renders the snapshot + stamps an operator-bearing
168
- > `story.heartbeat`. You do **not** add extra `story-phase.js` calls
169
- > mid-`implementing` just to prove you are alive: the PostToolUse hook emits
170
- > a throttled `story.heartbeat` off the token stream on every tool call, so
171
- > the §2e Idle Watchdog sees continuous forward progress for free.
172
-
173
- 2. Read the Story body's inline `acceptance[]` and `verify[]` arrays
174
- from the `story-init` structured comment (`context.acceptance`,
175
- `context.verify`). Treat the acceptance items as the contract and
176
- the verify items as the canonical at-keyboard checks.
177
-
178
- **Docs context — read the digest, not the full set.** Do **not**
179
- re-read every file in `project.docsContextFiles`. The parent prompt
180
- passes a `docsDigestPath` (the per-Epic docs digest at
181
- `temp/epic-<epicId>/docs-digest.md`, written by
182
- `epic-deliver-prepare.js`). Read that digest — a compact per-file
183
- outline (path, size, heading outline with line numbers, first
184
- paragraph under each `##`) — to decide which docs bear on this Story,
185
- then **pull the full file on demand** (jump to the section at the line
186
- number the digest names) only when relevant. When `docsDigestPath` is
187
- null (the project configured no `docsContextFiles`), there is no
188
- digest and no per-Story docs mandate — read a full doc only if the
189
- Story's own context points you at one. See
190
- [`.agents/instructions.md` § 3](../../instructions.md).
191
-
192
- **Write-time audit checklists — read the threaded `checklistPath`.**
193
- When the parent prompt passes a `checklistPath` (Story #4410 — the
194
- repo-relative path to this Story's footprint-matched **local**-lens
195
- authoring checklists at
196
- `temp/epic-<epicId>/checklists/story-<storyId>.md`), read it before you
197
- write and self-check your change against each listed concern as you
198
- author it. These are the local audit lenses whose `filePatterns` matched
199
- the Story's predicted footprint, distilled to a short checklist and
200
- capped at a hard token budget by `epic-deliver-prepare.js` (matched via
201
- `resolveLensTier(lens) === 'local'` + `matchesAnyFilePattern`, never
202
- `selectAudits` — no provider or git diff runs on that path). When
203
- `checklistPath` is null or absent, the Story's footprint matched no local
204
- lens and there is nothing extra to read.
205
-
206
- 3. Implement the work as one or more commits on `story-<storyId>`.
207
- Author commits directly with the project's editor / `git commit`,
208
- following
209
- [`.agents/rules/git-conventions.md`](../../rules/git-conventions.md):
210
- - Conventional Commit subject (`feat:`, `fix:`, …).
211
- - Reference the parent Story via `(refs #<storyId>)` in the subject
212
- or body.
213
- - The `commit-msg` Husky hook enforces commitlint locally.
214
-
215
- 4. After the final commit lands, run the **bounded acceptance self-eval
216
- loop** (Step 1a below) **before** flipping to `closing`. The
217
- `verify[]` commands are consumed inside that loop as **required
218
- evidence** — they are no longer optional advisory pre-flight.
219
-
220
- 5. Once the eval loop returns `proceed`, flip the snapshot to `closing`
221
- and proceed to Step 3 (Step 3 invokes close directly — it no longer
222
- re-renders the `closing` snapshot, so this is the single `closing`
223
- render):
224
-
225
- ```bash
226
- node .agents/scripts/story-phase.js \
227
- --story <storyId> --epic <epicId> --branch story-<storyId> \
228
- --phase closing
229
- ```
230
-
231
- 6. If blocked (including by the eval loop reaching its round cap with
232
- criteria still unmet — Step 1a), flip the snapshot to `blocked`,
233
- transition the Story to `agent::blocked`, post a `friction` comment,
234
- and exit non-zero:
235
-
236
- ```bash
237
- node .agents/scripts/story-phase.js \
238
- --story <storyId> --epic <epicId> --branch story-<storyId> \
239
- --phase blocked
240
- ```
241
-
242
- ### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
243
-
244
- After the implementation commits land and **before** the snapshot flips to
245
- `closing`, run the bounded acceptance self-eval loop. The per-round critic
246
- mechanic (fresh-context critic, `verify[]`-as-evidence, the verdict schema, and
247
- the proceed / redraft / block decision) is the single-homed include
248
- [`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
249
- The critic reads the Story's inline `acceptance[]` / `verify[]` arrays from the
250
- `story-init` comment (`context.acceptance` / `context.verify`).
251
-
252
- Epic-attached specifics for this path:
253
-
254
- - **Critic evidence-share** (Story #4250). When the critic runs a `verify[]`
255
- command that is byte-identical to a close gate (`lint` / `typecheck`), it
256
- records the pass into the Epic-keyed evidence keyspace via `--epic-id
257
- <epicId>` so `story-close.js` short-circuits the gate at unchanged HEAD.
258
- Run it in the **Story worktree** (`.worktrees/story-<storyId>`):
259
-
260
- ```bash
261
- node .agents/scripts/evidence-gate.js \
262
- --epic-id <epicId> --scope-id <storyId> --gate lint \
263
- --worktree .worktrees/story-<storyId> -- npm run lint
264
- ```
265
-
266
- - **Gate invocation** (pass `--epic <epicId>` so the per-criterion signal lands
267
- on the Epic-scoped stream):
268
-
269
- ```bash
270
- node .agents/scripts/acceptance-eval.js \
271
- --story <storyId> --epic <epicId> --verdict <verdict-path>
272
- ```
273
-
274
- - **On `decision: "proceed"`** → flip the snapshot to `closing` (item 5 above).
275
- - **On `decision: "block"`** → take the blocked path (item 6 above): post a
276
- `friction` comment naming the unmet criteria and their evidence, flip the
277
- snapshot to `blocked`, and exit non-zero. Never silently proceed to close.
278
-
279
- The resume guard is expressed at the Story level: re-entering a
280
- partially-implemented Story picks up from whatever commits are already
281
- on `story-<storyId>`; the agent inspects `git log` to decide what work
282
- remains.
283
-
284
- After each `story-phase.js` call, relay **one line naming the phase
285
- transition** (e.g. `Story #<id>: implementing → closing`) as the Story's
286
- progress update — not the envelope's `renderedBody` verbatim. The
287
- `story-phase.js` CLI has already upserted the full body into the
288
- `story-run-progress` snapshot; that comment is the authoritative rollup
289
- the parent `/deliver` aggregator reads. Skip chat relay entirely when
290
- running in a non-interactive sub-agent context where the parent will
291
- aggregate.
292
-
293
- > Rebase pauses on conflicts → follow
294
- > [`_merge-conflict-template.md`](_merge-conflict-template.md).
295
-
296
- ---
297
-
298
- ## Step 2 — Validate (deferred to close)
299
-
300
- `story-close.js` runs the canonical close-validation chain (typecheck,
301
- lint, test, format, maintainability, coverage, crap) before it merges —
302
- **do not** pre-run those gates here unless interactively iterating on a
303
- fix. (Interactively, `npm run typecheck && npm run lint && npm test` is
304
- fine as advisory pre-flight.)
305
-
306
- ---
307
-
308
- ## Step 3 — Close (`story-close.js`)
309
-
310
- Step 1 item 5 already flipped the snapshot to the `closing` phase, so this
311
- step does **not** re-render it (the duplicate render was removed). Invoke
312
- close directly. Pass the parent Epic id via `--epic <epicId>` from the
313
- Step 0 envelope so close skips re-parsing the Epic hierarchy off the
314
- Story body (which also closes the malformed-`Epic:`-line failure mode).
315
- Pass the main-checkout path via `--cwd` so the merge and branch deletion
316
- run against the main repo (branches checked out in a worktree cannot be
317
- deleted from themselves):
318
-
319
- ```bash
320
- node <main-repo>/.agents/scripts/story-close.js \
321
- --story <storyId> --epic <epicId> --cwd <main-repo>
322
- ```
323
-
324
- In single-tree mode, `--cwd` defaults to `PROJECT_ROOT`. The script merges
325
- into `epic/<epicId>` (`--no-ff`), pushes the Epic branch, deletes the
326
- Story branch, reaps the worktree via `WorktreeManager.reap`, closes the
327
- Story to `agent::done`, runs `cascadeCompletion()`, and regenerates the
328
- Epic dispatch manifest (`--skip-dashboard` to suppress). Output is JSON
329
- with `ticketsClosed[]`, `cascadedTo[]`, and reap status.
330
-
331
- > **Why not GitHub auto-close?** `Closes #N` only fires on default-branch
332
- > merges; close fires the state writer explicitly.
333
-
334
- After close, upsert a terminal snapshot:
335
-
336
- ```bash
337
- node .agents/scripts/story-phase.js \
338
- --story <storyId> --epic <epicId> --branch story-<storyId> \
339
- --phase done
340
- ```
341
-
342
- ---
343
-
344
- ## Step 4 — Return contract (sub-agent path)
345
-
346
- When run as a sub-agent, return one JSON object:
347
-
348
- ```json
349
- {
350
- "storyId": <number>,
351
- "status": "done" | "blocked" | "failed",
352
- "phase": "init|implementing|closing|blocked|done",
353
- "branchDeleted": <boolean>,
354
- "blockerCommentId": <string|null>,
355
- "detail": <string|undefined>,
356
- "renderedBody": <string|undefined>
357
- }
358
- ```
359
-
360
- `status === 'done'` requires the Story closed and
361
- `branchDeleted: true`.
362
-
363
- > **Handoff discipline — report state, not process.** Populate the return
364
- > object with essential terminal state only: the Story branch, the closing
365
- > commit SHA, what changed, and what was verified (this maps onto the
366
- > existing `storyId` / `branchDeleted` / `phase` / `detail` /
367
- > `renderedBody` fields — do **not** add new envelope fields). Do not
368
- > narrate the steps you took to get there, and do not prescribe how
369
- > `/deliver`'s aggregator should do its job downstream. The parent
370
- > reads structured state from this envelope and the `story-run-progress`
371
- > snapshot; prose process commentary only bloats the hydrated prompt
372
- > (`delivery.maxTokenBudget` elision).
373
-
374
- `branchDeleted` is sourced from the `branchDeleted` field of the
375
- `story-close.js` result envelope. It is **independent** of
376
- `worktreeReap.status` — every reap outcome the close reports (including
377
- the Windows-only `stale-registry-entry`, which queues a pending-cleanup
378
- entry for the next drain) is operationally complete. `status: 'done'` is
379
- appropriate when the Story is closed and `branchDeleted: true`,
380
- regardless of the reap status.
381
-
382
- `renderedBody` is the **most recent** `renderedBody` returned by
383
- `story-phase.js` (typically the `phase: 'done'` snapshot at close,
384
- or the `phase: 'blocked'` snapshot on a blocker). The parent
385
- `/deliver` may inline a digest of this in its wave-level Notable
386
- section. When run interactively (no parent), omit it — the authoritative
387
- body lives in the `story-run-progress` snapshot the phase CLI upserted,
388
- and the chat already carries the per-transition progress lines from
389
- Step 1 / Step 3.
390
-
391
- ---
392
-
393
- ## Idempotence
394
-
395
- `story-init.js` re-prints the same `workCwd` without recreating the
396
- worktree. `story-run-progress` is upserted in place. `story-close.js`
397
- short-circuits when the Story branch is already merged and deleted. Re-
398
- running this helper against an already-closed Story is safe.
399
-
400
- ---
401
-
402
- ## Constraints
403
-
404
- - **MUST merge into `epic/<epicId>`, never `main`.** The Story branch's
405
- only integration target is the parent Epic's integration branch. If
406
- `story-close.js` short-circuits, no-ops, or otherwise fails to merge,
407
- **do NOT** fall back to `gh pr create --base main`, **do NOT** invoke
408
- `/deliver` on the same Story, and **do NOT** open a PR by
409
- hand against `main`. Such a PR orphans the change on `main` and forces
410
- a manual `git merge origin/main` back into `epic/<id>` to recover (the
411
- Epic #2880 wave-5 / Story #2960 friction note). The framework refuses
412
- these PRs via the `pr-base-guard` helper wired into every
413
- `createPullRequest` surface; a raw shell `gh pr create` is the only
414
- way to bypass it, and you must not. Diagnose the no-op (was the
415
- branch already merged? is the ticket already closed? is the worktree
416
- on the wrong HEAD?) and re-run close, or transition the Story to
417
- `agent::blocked` with a `friction` comment so the operator can
418
- resolve it.
419
- - **Never** push the Story branch directly to `main`. `story-close.js` is
420
- the only writer that integrates upstream, and only into `epic/<epicId>`.
421
- - **Never** merge across Story branches; cross-Story dependencies are
422
- resolved by wave ordering via `blocked by`.
423
- - **Always** `cd` into the `workCwd` returned by Step 0 before editing, and
424
- prefix every path-based Edit/Write/Read with that absolute `workCwd` root —
425
- the Edit tools ignore the shell cwd. The worktree pins the branch to
426
- `story-<storyId>`, so there is no need to re-check `git branch` before each
427
- commit.
428
- - **Always** upsert a `story-run-progress` snapshot at every phase
429
- transition. The wave aggregator depends on this comment, not labels.
430
- - **Always** pass `--cwd <main-repo>` to `story-close.js` when invoking
431
- from inside a worktree.
432
- - **Label transitions**: drive every `agent::*` state change through
433
- `node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
434
- This CLI is the authoritative mechanism — there is no separate
435
- state-mutation MCP server to degrade from (see
436
- [`.agents/instructions.md` § 1.D](../../instructions.md)).
@@ -1,125 +0,0 @@
1
- ---
2
- description: QA Epic-testing workflow — ingest the agent-driven QA harness sweep as Epic evidence
3
- ---
4
-
5
- # Epic Testing (helper)
6
-
7
- > **Helper module.** Not a slash command. Invoked from the QA gate during
8
- > `/deliver` or directly by an operator when the Epic-testing ticket
9
- > needs refreshed evidence. For ad-hoc acceptance runs use `/qa-run` —
10
- > this helper owns the Epic-evidence ticket lifecycle on top of it.
11
-
12
- Gather and attach the acceptance-suite evidence that gates Epic closure. The
13
- evidence artifact is the **agent-driven QA harness sweep report** produced by
14
- `/qa-run` (scenario pass/fail/blocked totals plus structured
15
- findings), **not** a hand-ticked markdown checklist.
16
-
17
- > **When to run**: During the QA phase of an Epic, after all Story merges
18
- > have landed on the Epic branch and before `/deliver`. Also run ad-hoc
19
- > when a regression is suspected mid-Epic.
20
- >
21
- > **Persona**: `qa-engineer` · **Skills**:
22
- > `stack/qa/gherkin-authoring`, `stack/qa/playwright-bdd`
23
-
24
- ## Step 0 — Resolve Context
25
-
26
- 1. Identify the Epic-testing ticket for the current Epic (the QA evidence
27
- ticket produced by Epic planning).
28
- 2. Confirm the Epic branch is green: all child Story branches merged, CI
29
- passing.
30
- 3. Decide the tag slice to run:
31
- - Epic-wide regression gate → `@smoke and @risk-high` (or the project's
32
- equivalent release gate expression).
33
- - Targeted domain pass → `@domain-<area>`.
34
- - Full acceptance sweep → omit the tag expression.
35
-
36
- The canonical taxonomy lives in `.agents/rules/gherkin-standards.md`. Do
37
- not invent new tags here.
38
-
39
- ## Step 1 — Execute the QA Harness Sweep
40
-
41
- Invoke `/qa-run` with the chosen selector:
42
-
43
- ```text
44
- /qa-run "tag:@smoke and @risk-high"
45
- ```
46
-
47
- The `/qa-run` workflow (`.agents/workflows/qa-run.md`) owns the
48
- execution mechanics — `qa` contract resolution, scenario selection, browser
49
- navigation, and finding capture. This workflow consumes its output.
50
-
51
- If the consuming project runs the suite through its own CI invocation rather
52
- than the slash command, treat the CI run as equivalent provided it produces
53
- the same scenario totals and structured findings.
54
-
55
- ## Step 2 — Collect the Evidence Artifact
56
-
57
- The evidence package for the Epic-testing ticket is:
58
-
59
- - **Sweep summary** — selector applied, scenario totals (passed / failed /
60
- blocked), and the commit SHA the sweep ran against. Required.
61
- - **Structured findings** — the `F#` findings bundle the harness emits
62
- (console / network / visual problems by surface). Required.
63
- - **Accessibility snapshots / traces** — for every failed or blocked scenario.
64
- Required on failure.
65
- - **Drafted follow-up bundle** — the proposed follow-up tickets awaiting
66
- operator sign-off, when the sweep surfaced findings.
67
-
68
- Store the artifacts where your project's evidence convention dictates (CI
69
- artifact store, object storage, or attached to the ticket directly). Link —
70
- do not paste — large artifacts.
71
-
72
- ## Step 3 — Attach and Transition
73
-
74
- 1. Comment on the Epic-testing ticket with:
75
- - The sweep summary from Step 2.
76
- - Links (or attachments) to the structured findings, accessibility
77
- snapshots, and any traces.
78
- - The commit SHA the sweep executed against.
79
- 2. If every scenario passed (no `failed`, no `blocked`), transition the
80
- Epic-testing ticket to `agent::done`.
81
- 3. If any scenario failed or is blocked, leave the ticket in its current
82
- state and open a follow-up ticket per failure with:
83
- - Scenario name and `.feature` file path.
84
- - One-line symptom.
85
- - Link to the failing scenario's snapshot or trace.
86
-
87
- Do not close the Epic-testing ticket on a failed run. `/deliver`
88
- depends on green evidence.
89
-
90
- ## Deprecated — Markdown Checklist Flow
91
-
92
- Earlier revisions of this workflow asked the QA reviewer to tick items in a
93
- hand-maintained markdown checklist (`epic-<id>/test-plan.md`) and attach
94
- that file as evidence. **That flow is deprecated.** Reasons:
95
-
96
- - Hand-ticked checklists drift from the code and cannot be re-executed.
97
- - They do not capture scenario-level pass/fail state, traces, or the SHA the
98
- run targeted.
99
- - They are not machine-readable, so downstream aggregation and trend
100
- reporting are impossible.
101
-
102
- The QA harness sweep replaces the checklist as the single evidence artifact.
103
- Projects still maintaining a checklist should migrate by authoring the
104
- equivalent scenarios in Gherkin (see the `stack/qa/gherkin-authoring` skill)
105
- and deleting the checklist in the same change.
106
-
107
- ## Constraints
108
-
109
- - **Never** substitute a hand-authored checklist or prose summary for the
110
- harness sweep. The evidence must be the output of an actual run.
111
- - **Never** close the Epic-testing ticket while any scenario is `failed` or
112
- `blocked`.
113
- - **Always** record the commit SHA the sweep ran against, so the evidence is
114
- pinned to a verifiable tree state.
115
- - **Always** link a snapshot or trace for failed scenarios; a failure without
116
- evidence is not actionable.
117
-
118
- ## Cross-References
119
-
120
- - Execution mechanics: `.agents/workflows/qa-run.md`.
121
- - Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
122
- - Runner / fixture / trace conventions:
123
- `.agents/skills/stack/qa/playwright-bdd/SKILL.md`.
124
- - Tier responsibilities (unit / contract / acceptance):
125
- `.agents/rules/testing-standards.md`.