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
@@ -1,91 +0,0 @@
1
- # epic-plan-spec-author — examples & extended rationale
2
-
3
- Read this file on demand while authoring the Tech Spec. The SKILL.md carries
4
- the operating contract (Policy Capsule, Inputs / Outputs, Procedure, the two
5
- authoritative system prompts, and Constraints); this file carries the worked
6
- Delivery Slicing example and the extended rationale behind the slicing rules.
7
-
8
- ## Delivery Slicing — extended rationale
9
-
10
- The Tech Spec MUST carry a `## Delivery Slicing` section in which the Architect
11
- — who holds the full design — proposes how the Epic's enumerated capabilities
12
- **cluster into N shippable Stories**. This section is the intentional grouping
13
- the Phase 8 consolidation pass
14
- ([`epic-plan-consolidate`](../epic-plan-consolidate/SKILL.md)) reconciles the
15
- decomposer's draft against before any GitHub write. Without it, the decompose
16
- phase maps Epic capabilities to Stories ~1:1 and cannot produce a coarser,
17
- holistic plan; with it, the consolidation critic has a well-defined reference
18
- instead of a guess.
19
-
20
- **The proposed count is a ceiling, not a target.** Consolidation reconciles
21
- the draft *toward* your grouping, but it treats the count as an upper bound: it
22
- may **merge below** your proposed count when slices form dependent
23
- single-consumer chains, and it **never splits above** it. Over-slicing here
24
- therefore locks in fragmentation only when the extra slices are genuinely
25
- independent — so keep a slice separate only when it earns its own delivery
26
- session.
27
-
28
- **Write the Delivery Slicing section before any other section — it is the
29
- primary input to Phase 8 consolidation.** Author it first so the rest of the
30
- spec (Core Components, API Changes, Data Models) hangs off a deliberate
31
- slicing decision rather than being reverse-engineered into one at the end.
32
- Drafting it last is exactly how the model omits it under the weight of the
33
- other sections.
34
-
35
- Author the section as a table — one row per proposed slice — naming the
36
- capability cluster each slice would deliver, what ships in it, and whether it
37
- can ship independently. Use **noun phrases** for slice names ("Foundation",
38
- "Transport seam", "Send helper") so they map cleanly onto Feature titles in the
39
- resulting decomposition — never verb phrases ("Add transport") or file names
40
- ("`sender.ts`"). Do **not** coarsen the Epic's capability enumeration to produce
41
- the slicing: the granularity lever is *this* grouping recommendation, not a
42
- dumbed-down Epic enumeration.
43
-
44
- **What "Independent?" means:** can this slice ship to production and provide
45
- value *without the next slice landing*? A `Yes` slice is releasable on its own;
46
- a `No` slice only becomes valuable once a later slice lands on top of it.
47
-
48
- **"Independent? No" is a smell that must be justified.** A dependent,
49
- single-consumer slice (one that only feeds the next slice) folds into its
50
- consumer by default — it is not worth its own delivery session's hydration,
51
- branch, PR, and CI ceremony. Mark a slice `No` only when you can name a
52
- one-line reason to keep it separate anyway: **parallelism** (two `No` slices
53
- that can be delivered concurrently by different sessions), **risk isolation**
54
- (a blast-radius or reviewability reason to land it as its own reviewable PR),
55
- or **delivery-envelope pressure** (folding it in would push the consumer past a
56
- single-session sizing envelope). Absent such a justification, do not author the
57
- slice as its own row — fold it into its consumer and let the merged slice carry
58
- the combined capability.
59
-
60
- ### Worked example
61
-
62
- ```text
63
- ## Delivery Slicing
64
-
65
- Proposed shippable slices (consolidation ceiling for Phase 8):
66
-
67
- | Slice | What ships | Independent? |
68
- | -------------- | ------------------------------------------------------ | ------------ |
69
- | Foundation | Config schema, types, and the no-op default path | Yes |
70
- | Transport seam | The pluggable transport interface + in-memory adapter | Yes |
71
- | Send helper | The send() helper + retries, built on the transport | No (justified: risk isolation) |
72
-
73
- - **Foundation** folds Epic capabilities "config surface" + "type model" — they
74
- share a reason to exist and ship as one reviewable PR.
75
- - **Transport seam** is the pluggable boundary; it provides value on its own
76
- (in-memory adapter is usable for tests) so it is independently shippable.
77
- - **Send helper** depends on the transport seam landing first, so it is *not*
78
- independent. It stays its own slice only because the retry/backoff logic is a
79
- large, high-blast-radius surface worth isolating in its own reviewable PR
80
- (risk isolation). Absent that justification it would fold into Transport
81
- seam — a bare "depends on the previous slice" is not a reason to keep it
82
- separate.
83
- ```
84
-
85
- The consolidation pass degrades gracefully when this section is absent (it
86
- falls back to cohesion + single-Story-Feature rules only), so authoring it is
87
- how the Architect steers the decomposition toward fewer, right-sized Stories.
88
- Because the count is a **ceiling**, an over-sliced table is coarsened back
89
- during consolidation — but only where the extra slices are dependent
90
- single-consumer chains, so an unjustified `No` slice is the one you should fold
91
- in yourself rather than leaning on the consolidator to catch.
@@ -1,357 +0,0 @@
1
- ---
2
- name: frontend-ui-engineering
3
- description:
4
- Builds production-quality UIs. Use when building or modifying user-facing
5
- interfaces. Use when creating components, implementing layouts, managing
6
- state, or when the output needs to look and feel production-quality rather
7
- than AI-generated.
8
- ---
9
-
10
- # Frontend UI Engineering
11
-
12
- ## Policy Capsule
13
-
14
- - Build UI that meets WCAG 2.1 AA: every interactive element keyboard-accessible, ARIA labels on icon-only controls, focus moved when content changes, color never the sole indicator of state.
15
- - Adhere to the project's design system — use semantic tokens (`text-primary`, `bg-surface`) and the spacing scale (no arbitrary pixel values, no inline styles).
16
- - Avoid the "AI aesthetic": no default purple/indigo palettes, gratuitous gradients, blanket `rounded-2xl`, oversized padding, or shadow-heavy layering.
17
- - Prefer composition over configuration; keep components focused (split anything past ~200 lines) and separate data-fetching containers from presentation components.
18
- - Choose the simplest state mechanism that works: local `useState` → lifted state → context (read-heavy) → URL state → server-state library → global store; do not prop-drill past three levels.
19
- - Render meaningful loading, empty, and error states for every async surface — skeletons for content (not spinners), and explicit empty-state copy + CTA.
20
- - Design mobile-first and verify at 320 / 768 / 1024 / 1440 px breakpoints before claiming responsive.
21
- - Respect the heading hierarchy (one `h1` per page, no skipped levels) and never re-purpose heading styles for non-heading content.
22
- - Verify accessibility tooling (axe-core / dev-tools warnings) is clean and a screen reader can convey the page structure before marking the work done.
23
-
24
- ## Overview
25
-
26
- Build production-quality user interfaces that are accessible, performant, and
27
- visually polished. The goal is UI that looks like it was built by a design-aware
28
- engineer at a top company — not like it was generated by an AI. This means real
29
- design system adherence, proper accessibility, thoughtful interaction patterns,
30
- and no generic "AI aesthetic."
31
-
32
- ## When to Use
33
-
34
- - Building new UI components or pages
35
- - Modifying existing user-facing interfaces
36
- - Implementing responsive layouts
37
- - Adding interactivity or state management
38
- - Fixing visual or UX issues
39
-
40
- ## Component Architecture
41
-
42
- ### File Structure
43
-
44
- Colocate everything related to a component:
45
-
46
- ```text
47
- src/components/
48
- TaskList/
49
- TaskList.tsx # Component implementation
50
- TaskList.test.tsx # Tests
51
- TaskList.stories.tsx # Storybook stories (if using)
52
- use-task-list.ts # Custom hook (if complex state)
53
- types.ts # Component-specific types (if needed)
54
- ```
55
-
56
- ### Component Patterns
57
-
58
- **Prefer composition over configuration:**
59
-
60
- ```tsx
61
- // Good: Composable
62
- <Card>
63
- <CardHeader>
64
- <CardTitle>Tasks</CardTitle>
65
- </CardHeader>
66
- <CardBody>
67
- <TaskList tasks={tasks} />
68
- </CardBody>
69
- </Card>
70
-
71
- // Avoid: Over-configured
72
- <Card
73
- title="Tasks"
74
- headerVariant="large"
75
- bodyPadding="md"
76
- content={<TaskList tasks={tasks} />}
77
- />
78
- ```
79
-
80
- **Keep components focused:**
81
-
82
- ```tsx
83
- // Good: Does one thing
84
- export function TaskItem({ task, onToggle, onDelete }: TaskItemProps) {
85
- return (
86
- <li className="flex items-center gap-3 p-3">
87
- <Checkbox checked={task.done} onChange={() => onToggle(task.id)} />
88
- <span className={task.done ? 'line-through text-muted' : ''}>
89
- {task.title}
90
- </span>
91
- <Button variant="ghost" size="sm" onClick={() => onDelete(task.id)}>
92
- <TrashIcon />
93
- </Button>
94
- </li>
95
- );
96
- }
97
- ```
98
-
99
- **Separate data fetching from presentation:**
100
-
101
- ```tsx
102
- // Container: handles data
103
- export function TaskListContainer() {
104
- const { tasks, isLoading, error } = useTasks();
105
-
106
- if (isLoading) return <TaskListSkeleton />;
107
- if (error)
108
- return <ErrorState message="Failed to load tasks" retry={refetch} />;
109
- if (tasks.length === 0) return <EmptyState message="No tasks yet" />;
110
-
111
- return <TaskList tasks={tasks} />;
112
- }
113
-
114
- // Presentation: handles rendering
115
- export function TaskList({ tasks }: { tasks: Task[] }) {
116
- return (
117
- <ul role="list" className="divide-y">
118
- {tasks.map((task) => (
119
- <TaskItem key={task.id} task={task} />
120
- ))}
121
- </ul>
122
- );
123
- }
124
- ```
125
-
126
- ## State Management
127
-
128
- **Choose the simplest approach that works:**
129
-
130
- ```text
131
- Local state (useState) → Component-specific UI state
132
- Lifted state → Shared between 2-3 sibling components
133
- Context → Theme, auth, locale (read-heavy, write-rare)
134
- URL state (searchParams) → Filters, pagination, shareable UI state
135
- Server state (React Query, SWR) → Remote data with caching
136
- Global store (Zustand, Redux) → Complex client state shared app-wide
137
- ```
138
-
139
- **Avoid prop drilling deeper than 3 levels.** If you're passing props through
140
- components that don't use them, introduce context or restructure the component
141
- tree.
142
-
143
- ## Design System Adherence
144
-
145
- ### Avoid the AI Aesthetic
146
-
147
- AI-generated UI has recognizable patterns. Avoid all of them:
148
-
149
- | AI Default | Why It Is a Problem | Production Quality |
150
- | -------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
151
- | Purple/indigo everything | Models default to visually "safe" palettes, making every app look identical | Use the project's actual color palette |
152
- | Excessive gradients | Gradients add visual noise and clash with most design systems | Flat or subtle gradients matching the design system |
153
- | Rounded everything (rounded-2xl) | Maximum rounding signals "friendly" but ignores the hierarchy of corner radii in real designs | Consistent border-radius from the design system |
154
- | Generic hero sections | Template-driven layout with no connection to the actual content or user need | Content-first layouts |
155
- | Lorem ipsum-style copy | Placeholder text hides layout problems that real content reveals (length, wrapping, overflow) | Realistic placeholder content |
156
- | Oversized padding everywhere | Equal generous padding destroys visual hierarchy and wastes screen space | Consistent spacing scale |
157
- | Stock card grids | Uniform grids are a layout shortcut that ignores information priority and scanning patterns | Purpose-driven layouts |
158
- | Shadow-heavy design | Layered shadows add depth that competes with content and slows rendering on low-end devices | Subtle or no shadows unless the design system specifies |
159
-
160
- ### Spacing and Layout
161
-
162
- Use a consistent spacing scale. Don't invent values:
163
-
164
- ```css
165
- /* Use the scale: 0.25rem increments (or whatever the project uses) */
166
- /* Good */
167
- padding: 1rem; /* 16px */
168
- /* Good */
169
- gap: 0.75rem; /* 12px */
170
- /* Bad */
171
- padding: 13px; /* Not on any scale */
172
- /* Bad */
173
- margin-top: 2.3rem; /* Not on any scale */
174
- ```
175
-
176
- ### Typography
177
-
178
- Respect the type hierarchy:
179
-
180
- ```text
181
- h1 → Page title (one per page)
182
- h2 → Section title
183
- h3 → Subsection title
184
- body → Default text
185
- small → Secondary/helper text
186
- ```
187
-
188
- Don't skip heading levels. Don't use heading styles for non-heading content.
189
-
190
- ### Color
191
-
192
- - Use semantic color tokens: `text-primary`, `bg-surface`, `border-default` —
193
- not raw hex values
194
- - Ensure sufficient contrast (4.5:1 for normal text, 3:1 for large text)
195
- - Don't rely solely on color to convey information (use icons, text, or patterns
196
- too)
197
-
198
- ## Accessibility (WCAG 2.1 AA)
199
-
200
- Every component must meet these standards:
201
-
202
- ### Keyboard Navigation
203
-
204
- ```tsx
205
- // Every interactive element must be keyboard accessible
206
- <button onClick={handleClick}>Click me</button> // ✓ Focusable by default
207
- <div onClick={handleClick}>Click me</div> // ✗ Not focusable
208
- <div role="button" tabIndex={0} onClick={handleClick} // ✓ But prefer <button>
209
- onKeyDown={e => e.key === 'Enter' && handleClick()}>
210
- Click me
211
- </div>
212
- ```
213
-
214
- ### ARIA Labels
215
-
216
- ```tsx
217
- // Label interactive elements that lack visible text
218
- <button aria-label="Close dialog"><XIcon /></button>
219
-
220
- // Label form inputs
221
- <label htmlFor="email">Email</label>
222
- <input id="email" type="email" />
223
-
224
- // Or use aria-label when no visible label exists
225
- <input aria-label="Search tasks" type="search" />
226
- ```
227
-
228
- ### Focus Management
229
-
230
- ```tsx
231
- // Move focus when content changes
232
- function Dialog({ isOpen, onClose }: DialogProps) {
233
- const closeRef = useRef<HTMLButtonElement>(null);
234
-
235
- useEffect(() => {
236
- if (isOpen) closeRef.current?.focus();
237
- }, [isOpen]);
238
-
239
- // Trap focus inside dialog when open
240
- return (
241
- <dialog open={isOpen}>
242
- <button ref={closeRef} onClick={onClose}>
243
- Close
244
- </button>
245
- {/* dialog content */}
246
- </dialog>
247
- );
248
- }
249
- ```
250
-
251
- ### Meaningful Empty and Error States
252
-
253
- ```tsx
254
- // Don't show blank screens
255
- function TaskList({ tasks }: { tasks: Task[] }) {
256
- if (tasks.length === 0) {
257
- return (
258
- <div role="status" className="text-center py-12">
259
- <TasksEmptyIcon className="mx-auto h-12 w-12 text-muted" />
260
- <h3 className="mt-2 text-sm font-medium">No tasks</h3>
261
- <p className="mt-1 text-sm text-muted">
262
- Get started by creating a new task.
263
- </p>
264
- <Button className="mt-4" onClick={onCreateTask}>
265
- Create Task
266
- </Button>
267
- </div>
268
- );
269
- }
270
-
271
- return <ul role="list">...</ul>;
272
- }
273
- ```
274
-
275
- ## Responsive Design
276
-
277
- Design for mobile first, then expand:
278
-
279
- ```tsx
280
- // Tailwind: mobile-first responsive
281
- <div className="
282
- grid grid-cols-1 /* Mobile: single column */
283
- sm:grid-cols-2 /* Small: 2 columns */
284
- lg:grid-cols-3 /* Large: 3 columns */
285
- gap-4
286
- ">
287
- ```
288
-
289
- Test at these breakpoints: 320px, 768px, 1024px, 1440px.
290
-
291
- ## Loading and Transitions
292
-
293
- ```tsx
294
- // Skeleton loading (not spinners for content)
295
- function TaskListSkeleton() {
296
- return (
297
- <div className="space-y-3" aria-busy="true" aria-label="Loading tasks">
298
- {Array.from({ length: 3 }).map((_, i) => (
299
- <div key={i} className="h-12 bg-muted animate-pulse rounded" />
300
- ))}
301
- </div>
302
- );
303
- }
304
-
305
- // Optimistic updates for perceived speed
306
- function useToggleTask() {
307
- const queryClient = useQueryClient();
308
-
309
- return useMutation({
310
- mutationFn: toggleTask,
311
- onMutate: async (taskId) => {
312
- await queryClient.cancelQueries({ queryKey: ['tasks'] });
313
- const previous = queryClient.getQueryData(['tasks']);
314
-
315
- queryClient.setQueryData(['tasks'], (old: Task[]) =>
316
- old.map((t) => (t.id === taskId ? { ...t, done: !t.done } : t)),
317
- );
318
-
319
- return { previous };
320
- },
321
- onError: (_err, _taskId, context) => {
322
- queryClient.setQueryData(['tasks'], context?.previous);
323
- },
324
- });
325
- }
326
- ```
327
-
328
- ## Common Rationalizations
329
-
330
- | Rationalization | Reality |
331
- | ---------------------------------------------- | -------------------------------------------------------------------------------------------- |
332
- | "Accessibility is a nice-to-have" | It's a legal requirement in many jurisdictions and an engineering quality standard. |
333
- | "We'll make it responsive later" | Retrofitting responsive design is 3x harder than building it from the start. |
334
- | "The design isn't final, so I'll skip styling" | Use the design system defaults. Unstyled UI creates a broken first impression for reviewers. |
335
- | "This is just a prototype" | Prototypes become production code. Build the foundation right. |
336
- | "The AI aesthetic is fine for now" | It signals low quality. Use the project's actual design system from the start. |
337
-
338
- ## Red Flags
339
-
340
- - Components with more than 200 lines (split them)
341
- - Inline styles or arbitrary pixel values
342
- - Missing error states, loading states, or empty states
343
- - No keyboard navigation testing
344
- - Color as the sole indicator of state (red/green without text or icons)
345
- - Generic "AI look" (purple gradients, oversized cards, stock layouts)
346
-
347
- ## Verification
348
-
349
- After building UI:
350
-
351
- - [ ] Component renders without console errors
352
- - [ ] All interactive elements are keyboard accessible (Tab through the page)
353
- - [ ] Screen reader can convey the page's content and structure
354
- - [ ] Responsive: works at 320px, 768px, 1024px, 1440px
355
- - [ ] Loading, error, and empty states all handled
356
- - [ ] Follows the project's design system (spacing, colors, typography)
357
- - [ ] No accessibility warnings in dev tools or axe-core
@@ -1,123 +0,0 @@
1
- ---
2
- name: hydrate-context
3
- description: >-
4
- Hydrate a Story ticket into a structured ContextEnvelope (or the
5
- legacy `{ prompt }` stdout wrapper). Reads the ticket body, resolves the
6
- parent Epic, embeds the sectioned Epic body (acceptance-table section
7
- stripped), and assembles
8
- named sections with provenance and section-aware elision. Successor to
9
- the retired mandrel MCP `context.hydrate` tool.
10
- allowed_tools:
11
- - Read
12
- - Bash
13
- ---
14
-
15
- # hydrate-context
16
-
17
- ## Policy Capsule
18
-
19
- - Invoke via `node .agents/scripts/hydrate-context.js --ticket <id> [--epic <id>]`; the wrapping CLI is the only supported entry point and delegates to `lib/orchestration/context-hydration-engine.js`.
20
- - Treat the operation as strictly **read-only on GitHub** — never modify ticket bodies, never post comments, never apply labels.
21
- - When `--epic` is omitted, parse the Epic ID from the ticket body's `Epic: #N` line; do not infer it from elsewhere.
22
- - Surface `persona::*` and `skill::*` labels from the ticket into the composed prompt so the downstream executor can pin its sub-agent dispatch.
23
- - Emit exactly one JSON object on stdout (`{ "prompt": "..." }` by default, or `{ "envelope": {...} }` with `--emit envelope`) and nothing else — no temp files, no diagnostic prints that would corrupt the envelope.
24
- - Honour the engine's context-budget cap via section-aware elision (`elideEnvelope`): lower-priority sections drop or summarize before higher-priority ones. Never silently truncate mid-string.
25
- - Do not persist the composed prompt to disk; forwarding is the caller's responsibility.
26
-
27
- ## Role
28
-
29
- Context aggregator. Resolves a ticket's hierarchy (Story → Epic)
30
- and stitches the Epic body — the single planning document, carrying the
31
- folded Tech Spec sections — plus the Story body into a
32
- single prompt the executor consumes. The Epic body is embedded with its
33
- `## Acceptance Table` managed section stripped (close-time reconciliation
34
- detail the executor does not need); there is no separate Tech Spec fetch
35
- (Story #4324).
36
-
37
- ## When to use
38
-
39
- Whenever an Epic-scoped sub-agent needs the same context bundle the
40
- human operator would assemble manually before opening the file editor.
41
- The wrapping script `hydrate-context.js` is the CLI today; this Skill
42
- documents the dispatch contract for callers that want to invoke via
43
- the Skill tool.
44
-
45
- ## Inputs
46
-
47
- - `--ticket <id>` — GitHub issue number to hydrate (required).
48
- - `--epic <id>` (optional) — when omitted, parsed from the ticket
49
- body's `Epic: #N` line.
50
-
51
- Persona and skill labels are read off the ticket
52
- (`persona::*`, `skill::*`) and surfaced in the composed prompt so the
53
- executor can pin its sub-agent dispatch.
54
-
55
- ## Outputs
56
-
57
- The engine assembles a typed **ContextEnvelope** (`lib/orchestration/context-envelope.js`) and serializes it for consumers:
58
-
59
- | Field | Role |
60
- | --- | --- |
61
- | `schemaVersion` | Always `"1"` for the current contract. |
62
- | `task` | `{ id, title, persona?, skills?, protocolVersion? }` from the ticket and labels. |
63
- | `sections[]` | Named blocks (`protocolPolicy`, `persona`, `skillCapsules`, `hierarchy`, `acceptanceCriteria`, `verificationCommands`, `taskInstructions`) each with `priority`, `elideWhenOverBudget` (`drop` \| `summarize`), `content`, `estimatedTokens`, optional `source`. |
64
- | `provenance[]` | Ticket snapshots: `{ id, version, hash, retrievedAt }` so auditors can cite what was fetched. |
65
- | `budget` | `{ maxTokens, used, elided[] }` after `elideEnvelope` runs. |
66
- | `warnings[]` | Non-fatal hydration notices (missing files, skipped skills, etc.). |
67
-
68
- Default CLI stdout (backward-compatible wrapper):
69
-
70
- ```json
71
- { "prompt": "..." }
72
- ```
73
-
74
- `prompt` is `envelopeToPrompt(envelope)` — sections joined in `SECTION_RENDER_ORDER`, not elision priority. For inspection or downstream tools that consume the typed shape:
75
-
76
- ```bash
77
- node .agents/scripts/hydrate-context.js --ticket <id> --emit envelope
78
- ```
79
-
80
- ```json
81
- { "envelope": { "schemaVersion": "1", "task": { ... }, "sections": [ ... ], "provenance": [ ... ], "budget": { ... }, "warnings": [ ... ] } }
82
- ```
83
-
84
- The Skill writes nothing else — no GitHub comments, no temp files.
85
- Idempotence is trivial because the operation is read-only.
86
-
87
- ## Procedure
88
-
89
- ```bash
90
- node .agents/scripts/hydrate-context.js --ticket <id> [--epic <id>]
91
- ```
92
-
93
- Delegates to `hydrateContext` from
94
- `lib/orchestration/context-hydration-engine.js`. The engine handles
95
- provider I/O, body parsing, provenance stamping, and
96
- `elideEnvelope` when `budget.used` exceeds `limits.maxTokenBudget`.
97
-
98
- **Section-aware elision.** Each section carries a numeric `priority`
99
- (lower drops first) and an `elideWhenOverBudget` policy (`drop` removes
100
- the section; `summarize` keeps a head excerpt). Defaults live in
101
- `DEFAULT_SECTION_PRIORITIES` and `DEFAULT_ELIDE_POLICIES` in
102
- `context-envelope.js`. Elided section names are recorded in
103
- `budget.elided`.
104
-
105
- **Capsule-only skill loading.** Activated skills resolve through
106
- `skills.index.json` and `loadSkillCapsule`, emitting only the Policy
107
- Capsule (the skill's non-negotiables) plus a pointer instruction into the
108
- `skillCapsules` section. Full `SKILL.md` bodies are never inlined into a
109
- task prompt — the sub-agent reads the full playbook on demand via the
110
- rendered `Read <path>` pointer. The full-body injection path, the
111
- `fullSkillBodies` config flag, and the `skill::full` label were removed in
112
- a hard cutover (Story #3863); the only residual full-body emission is the
113
- defensive fallback when a `SKILL.md` is missing its capsule marker (a
114
- malformed manifest), which also logs a warning.
115
-
116
- ## Constraints
117
-
118
- - Do **not** modify ticket bodies or post comments. The Skill is
119
- strictly read-only on GitHub.
120
- - Do **not** persist the composed prompt to disk. The caller is
121
- responsible for forwarding the stdout envelope to its consumer.
122
- - Do **not** bypass the context-budget cap — honour `elideEnvelope`
123
- and the per-section policies; never silently truncate.