mandrel 2.0.0 → 2.2.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 (323) hide show
  1. package/.agents/README.md +59 -28
  2. package/.agents/agents/acceptance-critic.md +20 -9
  3. package/.agents/agents/story-worker.md +45 -48
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +60 -46
  6. package/.agents/docs/agentrc-reference.json +8 -13
  7. package/.agents/docs/configuration.md +33 -57
  8. package/.agents/docs/execution-reference.md +39 -10
  9. package/.agents/docs/quality-gates.md +17 -19
  10. package/.agents/docs/workflows.md +6 -6
  11. package/.agents/instructions.md +64 -79
  12. package/.agents/rules/ci-remediation.md +3 -3
  13. package/.agents/rules/gherkin-standards.md +10 -0
  14. package/.agents/rules/git-conventions-reference.md +42 -51
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +2 -2
  16. package/.agents/schemas/agentrc.schema.json +35 -46
  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/story.merged.schema.json +1 -1
  24. package/.agents/schemas/signal-event.schema.json +3 -3
  25. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  26. package/.agents/schemas/validation-evidence.schema.json +1 -1
  27. package/.agents/scripts/acceptance-eval.js +24 -68
  28. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  29. package/.agents/scripts/bootstrap.js +3 -3
  30. package/.agents/scripts/check-dead-exports.js +43 -104
  31. package/.agents/scripts/check-doc-links.js +2 -2
  32. package/.agents/scripts/check-lifecycle-lint.js +1 -1
  33. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  34. package/.agents/scripts/deliver-recover.js +122 -0
  35. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  36. package/.agents/scripts/evidence-gate.js +20 -50
  37. package/.agents/scripts/generate-skills-index.js +17 -1
  38. package/.agents/scripts/generate-workflows-doc.js +4 -4
  39. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  40. package/.agents/scripts/lib/audit-suite/selector.js +323 -23
  41. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -11
  42. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  43. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  44. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  45. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  46. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -1
  47. package/.agents/scripts/lib/checks/index.js +1 -1
  48. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  49. package/.agents/scripts/lib/checks/state.js +17 -248
  50. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +3 -3
  51. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  52. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  53. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  54. package/.agents/scripts/lib/cli-args.js +23 -2
  55. package/.agents/scripts/lib/close-validation/gates.js +13 -13
  56. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  57. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  58. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  59. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  60. package/.agents/scripts/lib/config/acceptance-eval.js +2 -2
  61. package/.agents/scripts/lib/config/delivery-routing.js +7 -6
  62. package/.agents/scripts/lib/config/explain.js +10 -16
  63. package/.agents/scripts/lib/config/github.js +7 -5
  64. package/.agents/scripts/lib/config/limits.js +15 -25
  65. package/.agents/scripts/lib/config/quality.js +11 -14
  66. package/.agents/scripts/lib/config/runners.js +8 -21
  67. package/.agents/scripts/lib/config/temp-paths.js +18 -56
  68. package/.agents/scripts/lib/config-settings-schema-delivery.js +34 -16
  69. package/.agents/scripts/lib/config-settings-schema-quality.js +9 -2
  70. package/.agents/scripts/lib/config-settings-schema.js +48 -22
  71. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  72. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  73. package/.agents/scripts/lib/duplicate-search.js +38 -7
  74. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  75. package/.agents/scripts/lib/format-generated-json.js +97 -0
  76. package/.agents/scripts/lib/framework-version.js +19 -189
  77. package/.agents/scripts/lib/gh-exec.js +8 -0
  78. package/.agents/scripts/lib/git-branch-lifecycle.js +0 -158
  79. package/.agents/scripts/lib/git-utils.js +0 -14
  80. package/.agents/scripts/lib/json-utils.js +1 -2
  81. package/.agents/scripts/lib/label-constants.js +0 -15
  82. package/.agents/scripts/lib/label-taxonomy.js +1 -12
  83. package/.agents/scripts/lib/observability/active-story-env.js +42 -163
  84. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  85. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  86. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  87. package/.agents/scripts/lib/observability/source-classifier.js +2 -2
  88. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  89. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  90. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  91. package/.agents/scripts/lib/orchestration/ceremony-routing.js +43 -45
  92. package/.agents/scripts/lib/orchestration/change-set.js +103 -0
  93. package/.agents/scripts/lib/orchestration/code-review.js +70 -191
  94. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +3 -3
  95. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  96. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  97. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  98. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  99. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  100. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +9 -11
  101. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  102. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  103. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +7 -3
  104. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  105. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  106. package/.agents/scripts/lib/orchestration/merge-block-class.js +76 -20
  107. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  108. package/.agents/scripts/lib/orchestration/plan-context.js +116 -33
  109. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +26 -36
  110. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +31 -22
  111. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  112. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +16 -6
  113. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +173 -25
  114. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  115. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +280 -100
  116. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +472 -55
  117. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +21 -16
  118. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  119. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +230 -0
  120. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +41 -40
  121. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -2
  122. package/.agents/scripts/lib/orchestration/planning/spec-authoring-grounding.js +1 -1
  123. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  124. package/.agents/scripts/lib/orchestration/retro-proposals.js +7 -7
  125. package/.agents/scripts/lib/orchestration/review-depth.js +105 -40
  126. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  127. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  128. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  129. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  130. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  131. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  132. package/.agents/scripts/lib/orchestration/run-epilogue.js +374 -16
  133. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +24 -0
  134. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  135. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  136. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +4 -13
  137. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  138. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +72 -30
  139. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  140. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  141. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +12 -8
  142. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  143. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  144. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +264 -43
  145. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  146. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  147. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +104 -279
  148. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +191 -0
  149. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +120 -0
  150. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  151. package/.agents/scripts/lib/orchestration/story-follow-ups.js +75 -14
  152. package/.agents/scripts/lib/orchestration/story-init-remote.js +12 -8
  153. package/.agents/scripts/lib/orchestration/story-plan-state.js +14 -29
  154. package/.agents/scripts/lib/orchestration/task-body-validator.js +52 -7
  155. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  156. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +119 -14
  157. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +3 -4
  158. package/.agents/scripts/lib/orchestration/ticket-validator.js +121 -18
  159. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -47
  160. package/.agents/scripts/lib/orchestration/ticketing/reads.js +19 -32
  161. package/.agents/scripts/lib/orchestration/ticketing/transition.js +61 -1
  162. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  163. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  164. package/.agents/scripts/lib/planning-corpus.js +12 -286
  165. package/.agents/scripts/lib/preflight-runner.js +2 -2
  166. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  167. package/.agents/scripts/lib/signals/index.js +4 -17
  168. package/.agents/scripts/lib/signals/read.js +35 -35
  169. package/.agents/scripts/lib/signals/schema.js +8 -11
  170. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  171. package/.agents/scripts/lib/signals/write.js +0 -1
  172. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  173. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  174. package/.agents/scripts/lib/story-adjacency.js +8 -7
  175. package/.agents/scripts/lib/story-body/story-body.js +81 -13
  176. package/.agents/scripts/lib/templates/decomposer-prompts.js +15 -16
  177. package/.agents/scripts/lib/test-env.js +14 -1
  178. package/.agents/scripts/lib/test-tiers.js +0 -3
  179. package/.agents/scripts/lib/ticket-body-sections.js +0 -14
  180. package/.agents/scripts/lib/validation-evidence.js +31 -59
  181. package/.agents/scripts/lib/wave-runner/live-probe.js +315 -0
  182. package/.agents/scripts/lib/wave-runner/ready-set.js +32 -6
  183. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  184. package/.agents/scripts/lib/worktree/lifecycle/reap.js +68 -19
  185. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  186. package/.agents/scripts/plan-context.js +38 -7
  187. package/.agents/scripts/plan-critics.js +203 -0
  188. package/.agents/scripts/plan-persist.js +145 -35
  189. package/.agents/scripts/plan-run-epilogue.js +83 -38
  190. package/.agents/scripts/post-structured-comment.js +0 -38
  191. package/.agents/scripts/pr-watch-with-update.js +43 -22
  192. package/.agents/scripts/providers/github/compose.js +0 -1
  193. package/.agents/scripts/providers/github/errors.js +0 -19
  194. package/.agents/scripts/providers/github/issues.js +1 -11
  195. package/.agents/scripts/providers/github/mappers.js +5 -0
  196. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  197. package/.agents/scripts/providers/github/tickets.js +33 -153
  198. package/.agents/scripts/providers/github.js +17 -6
  199. package/.agents/scripts/quality-preview.js +13 -6
  200. package/.agents/scripts/resolve-stories.js +236 -0
  201. package/.agents/scripts/run-coverage.js +4 -1
  202. package/.agents/scripts/run-lint.js +2 -2
  203. package/.agents/scripts/run-verify.js +31 -2
  204. package/.agents/scripts/signals-view.js +9 -10
  205. package/.agents/scripts/single-story-close.js +173 -18
  206. package/.agents/scripts/single-story-confirm-merge.js +288 -15
  207. package/.agents/scripts/single-story-init.js +6 -10
  208. package/.agents/scripts/stories-wave-tick.js +380 -53
  209. package/.agents/scripts/story-plan.js +3 -3
  210. package/.agents/scripts/update-ticket-state.js +8 -50
  211. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  212. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  213. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  214. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  215. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  216. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  217. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  218. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  219. package/.agents/skills/core/idea-refinement/SKILL.md +3 -3
  220. package/.agents/skills/core/scope-triage/SKILL.md +3 -0
  221. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  222. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  223. package/.agents/skills/skills.index.json +2 -12
  224. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  225. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  226. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  227. package/.agents/workflows/audit-architecture.md +3 -4
  228. package/.agents/workflows/audit-clean-code.md +4 -4
  229. package/.agents/workflows/audit-documentation.md +4 -5
  230. package/.agents/workflows/audit-lighthouse.md +8 -0
  231. package/.agents/workflows/audit-navigability.md +10 -0
  232. package/.agents/workflows/audit-performance.md +2 -3
  233. package/.agents/workflows/audit-quality.md +8 -9
  234. package/.agents/workflows/audit-security.md +1 -2
  235. package/.agents/workflows/audit-seo.md +10 -0
  236. package/.agents/workflows/audit-ux-ui.md +7 -0
  237. package/.agents/workflows/deliver.md +133 -45
  238. package/.agents/workflows/git-cleanup.md +2 -2
  239. package/.agents/workflows/git-deliver.md +1 -1
  240. package/.agents/workflows/helpers/acceptance-self-eval.md +34 -17
  241. package/.agents/workflows/helpers/code-quality-guardrails.md +15 -12
  242. package/.agents/workflows/helpers/code-review.md +14 -12
  243. package/.agents/workflows/helpers/deliver-story-reference.md +73 -32
  244. package/.agents/workflows/helpers/deliver-story.md +209 -118
  245. package/.agents/workflows/helpers/parallel-tooling.md +2 -2
  246. package/.agents/workflows/helpers/worktree-lifecycle.md +28 -32
  247. package/.agents/workflows/plan.md +239 -19
  248. package/.agents/workflows/qa-assist.md +6 -6
  249. package/.agents/workflows/qa-explore.md +3 -3
  250. package/.agents/workflows/qa-run.md +1 -5
  251. package/bin/mandrel.js +12 -1
  252. package/docs/CHANGELOG.md +62 -0
  253. package/lib/cli/registry.js +262 -19
  254. package/lib/cli/sync-agents.js +157 -0
  255. package/lib/cli/sync-commands.js +115 -6
  256. package/lib/cli/sync.js +168 -6
  257. package/lib/cli/update.js +105 -8
  258. package/lib/cli/version-helpers.js +131 -0
  259. package/lib/migrations/README.md +7 -5
  260. package/lib/migrations/index.js +17 -9
  261. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  262. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  263. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +154 -0
  264. package/package.json +2 -2
  265. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  266. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  267. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  268. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  269. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  270. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  271. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  272. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  273. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  274. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  275. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  276. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  277. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  278. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  279. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  280. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  281. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  282. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  283. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  284. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  285. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  286. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  287. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  288. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  289. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  290. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  291. package/.agents/schemas/risk-verdict.schema.json +0 -53
  292. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  293. package/.agents/scripts/analyze-execution.js +0 -444
  294. package/.agents/scripts/check-prepush-recovery.js +0 -90
  295. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  296. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  297. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -187
  298. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  299. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  300. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  301. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +0 -128
  302. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -273
  303. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  304. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  305. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  306. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  307. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  308. package/.agents/scripts/lib/orchestration/planning/risk-verdict.js +0 -104
  309. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  310. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  311. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  312. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -21
  313. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  314. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  315. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  316. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -397
  317. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  318. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +0 -155
  319. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  320. package/.agents/scripts/lib/orchestration/story-progress/story-run-progress-writer.js +0 -400
  321. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +0 -36
  322. package/.agents/scripts/resolve-plan-run.js +0 -117
  323. package/.agents/skills/core/analyze-execution/SKILL.md +0 -101
@@ -0,0 +1,375 @@
1
+ # Security and Hardening — Reference (on-demand)
2
+
3
+ **Read this when** a task engages one of the sections below and the Policy
4
+ Capsule in [`SKILL.md`](SKILL.md) does not settle it on its own. The capsule
5
+ is the contract; this file is the reference material behind it. Nothing here
6
+ relaxes a capsule MUST, and nothing here is required reading merely because
7
+ the skill is active.
8
+
9
+ ## When to Use
10
+
11
+ - Building anything that accepts user input
12
+ - Implementing authentication or authorization
13
+ - Storing or transmitting sensitive data
14
+ - Integrating with external APIs or services
15
+ - Adding file uploads, webhooks, or callbacks
16
+ - Handling payment or PII data
17
+
18
+ ## Security Surfacing, Not Runtime Pause
19
+
20
+ Some changes are not unsafe by themselves but expand the security surface
21
+ enough that the change must be **explicitly documented** in the PR
22
+ description and on the originating ticket so a reviewer can sign off in
23
+ band. Documenting them is the gate — they do **not** pause execution:
24
+
25
+ - Adding new authentication flows or changing auth logic
26
+ - Storing new categories of sensitive data (PII, payment info)
27
+ - Adding new external service integrations
28
+ - Changing CORS configuration
29
+ - Adding file upload handlers
30
+ - Modifying rate limiting or throttling
31
+ - Granting elevated permissions or roles
32
+
33
+ For each item that applies, call it out under a "Security surface" section
34
+ in the PR body and on the parent ticket, label the change `risk::high`,
35
+ and link the relevant `security-baseline.md` MUST. Reviewers gate the
36
+ merge; the agent keeps moving.
37
+
38
+ `agent::blocked` remains the **only** runtime pause label. Use it for
39
+ unrecoverable blockers (missing prerequisite, ambiguous spec a sub-agent
40
+ cannot resolve), not for "this change is sensitive." Sensitive changes
41
+ ship through the documentation path above.
42
+
43
+ ## OWASP Top 10 Prevention Patterns
44
+
45
+ The patterns below show **how** to satisfy the MUSTs in
46
+ [`security-baseline.md`](../../../rules/security-baseline.md). The MUSTs
47
+ themselves (parameterize queries, hash passwords, encode output, verify
48
+ ownership, set headers, restrict CORS, exclude sensitive fields) are listed
49
+ in the rule.
50
+
51
+ ### 1. Injection (SQL, NoSQL, OS Command)
52
+
53
+ See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering).
54
+
55
+ ```typescript
56
+ // BAD: SQL injection via string concatenation
57
+ const query = `SELECT * FROM users WHERE id = '${userId}'`;
58
+
59
+ // GOOD: Parameterized query
60
+ const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
61
+
62
+ // GOOD: ORM with parameterized input
63
+ const user = await prisma.user.findUnique({ where: { id: userId } });
64
+ ```
65
+
66
+ ### 2. Broken Authentication
67
+
68
+ See [security-baseline § Authentication](../../../rules/security-baseline.md#authentication).
69
+
70
+ ```typescript
71
+ import { hash, compare } from 'bcrypt';
72
+
73
+ const SALT_ROUNDS = 12;
74
+ const hashedPassword = await hash(plaintext, SALT_ROUNDS);
75
+ const isValid = await compare(plaintext, hashedPassword);
76
+
77
+ // Session management
78
+ app.use(
79
+ session({
80
+ secret: process.env.SESSION_SECRET, // From environment, not code
81
+ resave: false,
82
+ saveUninitialized: false,
83
+ cookie: {
84
+ httpOnly: true,
85
+ secure: true,
86
+ sameSite: 'lax',
87
+ maxAge: 24 * 60 * 60 * 1000,
88
+ },
89
+ }),
90
+ );
91
+ ```
92
+
93
+ ### 3. Cross-Site Scripting (XSS)
94
+
95
+ See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering).
96
+
97
+ ```typescript
98
+ // BAD: Rendering user input as HTML
99
+ element.innerHTML = userInput;
100
+
101
+ // GOOD: Use framework auto-escaping (React does this by default)
102
+ return <div>{userInput}</div>;
103
+
104
+ // If you MUST render HTML, sanitize first
105
+ import DOMPurify from 'dompurify';
106
+ const clean = DOMPurify.sanitize(userInput);
107
+ ```
108
+
109
+ ### 4. Broken Access Control
110
+
111
+ See [security-baseline § Authorization](../../../rules/security-baseline.md#authorization).
112
+
113
+ ```typescript
114
+ app.patch('/api/tasks/:id', authenticate, async (req, res) => {
115
+ const task = await taskService.findById(req.params.id);
116
+
117
+ if (task.ownerId !== req.user.id) {
118
+ return res.status(403).json({
119
+ error: {
120
+ code: 'FORBIDDEN',
121
+ message: 'Not authorized to modify this task',
122
+ },
123
+ });
124
+ }
125
+
126
+ const updated = await taskService.update(req.params.id, req.body);
127
+ return res.json(updated);
128
+ });
129
+ ```
130
+
131
+ ### 5. Security Misconfiguration
132
+
133
+ See [security-baseline § Transport & Headers](../../../rules/security-baseline.md#transport--headers).
134
+
135
+ ```typescript
136
+ import helmet from 'helmet';
137
+ app.use(helmet());
138
+
139
+ app.use(
140
+ helmet.contentSecurityPolicy({
141
+ directives: {
142
+ defaultSrc: ["'self'"],
143
+ scriptSrc: ["'self'"],
144
+ styleSrc: ["'self'", "'unsafe-inline'"],
145
+ imgSrc: ["'self'", 'data:', 'https:'],
146
+ connectSrc: ["'self'"],
147
+ },
148
+ }),
149
+ );
150
+
151
+ app.use(
152
+ cors({
153
+ origin: process.env.ALLOWED_ORIGINS?.split(',') || 'http://localhost:3000',
154
+ credentials: true,
155
+ }),
156
+ );
157
+ ```
158
+
159
+ ### 6. Sensitive Data Exposure
160
+
161
+ See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering)
162
+ and [§ Secrets Management](../../../rules/security-baseline.md#secrets-management).
163
+
164
+ ```typescript
165
+ function sanitizeUser(user: UserRecord): PublicUser {
166
+ const { passwordHash, resetToken, ...publicFields } = user;
167
+ return publicFields;
168
+ }
169
+
170
+ const API_KEY = process.env.STRIPE_API_KEY;
171
+ if (!API_KEY) throw new Error('STRIPE_API_KEY not configured');
172
+ ```
173
+
174
+ ## Input Validation Patterns
175
+
176
+ See [security-baseline § Input Validation](../../../rules/security-baseline.md#input-validation).
177
+
178
+ ### Schema Validation at Boundaries
179
+
180
+ ```typescript
181
+ import { z } from 'zod';
182
+
183
+ const CreateTaskSchema = z.object({
184
+ title: z.string().min(1).max(200).trim(),
185
+ description: z.string().max(2000).optional(),
186
+ priority: z.enum(['low', 'medium', 'high']).default('medium'),
187
+ dueDate: z.string().datetime().optional(),
188
+ });
189
+
190
+ app.post('/api/tasks', async (req, res) => {
191
+ const result = CreateTaskSchema.safeParse(req.body);
192
+ if (!result.success) {
193
+ return res.status(422).json({
194
+ error: {
195
+ code: 'VALIDATION_ERROR',
196
+ message: 'Invalid input',
197
+ details: result.error.flatten(),
198
+ },
199
+ });
200
+ }
201
+ const task = await taskService.create(result.data);
202
+ return res.status(201).json(task);
203
+ });
204
+ ```
205
+
206
+ ### File Upload Safety
207
+
208
+ ```typescript
209
+ const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/webp'];
210
+ const MAX_SIZE = 5 * 1024 * 1024; // 5MB
211
+
212
+ function validateUpload(file: UploadedFile) {
213
+ if (!ALLOWED_TYPES.includes(file.mimetype)) {
214
+ throw new ValidationError('File type not allowed');
215
+ }
216
+ if (file.size > MAX_SIZE) {
217
+ throw new ValidationError('File too large (max 5MB)');
218
+ }
219
+ // Don't trust the file extension — check magic bytes if critical
220
+ }
221
+ ```
222
+
223
+ ## Triaging npm audit Results
224
+
225
+ The MUST is in [security-baseline § Dependency Hygiene](../../../rules/security-baseline.md#dependency-hygiene).
226
+ This decision tree shows how to prioritize:
227
+
228
+ ```text
229
+ npm audit reports a vulnerability
230
+ ├── Severity: critical or high
231
+ │ ├── Is the vulnerable code reachable in your app?
232
+ │ │ ├── YES --> Fix immediately (update, patch, or replace the dependency)
233
+ │ │ └── NO (dev-only dep, unused code path) --> Fix soon, but not a blocker
234
+ │ └── Is a fix available?
235
+ │ ├── YES --> Update to the patched version
236
+ │ └── NO --> Check for workarounds, consider replacing the dependency, or add to allowlist with a review date
237
+ ├── Severity: moderate
238
+ │ ├── Reachable in production? --> Fix in the next release cycle
239
+ │ └── Dev-only? --> Fix when convenient, track in backlog
240
+ └── Severity: low
241
+ └── Track and fix during regular dependency updates
242
+ ```
243
+
244
+ **Key questions:**
245
+
246
+ - Is the vulnerable function actually called in your code path?
247
+ - Is the dependency a runtime dependency or dev-only?
248
+ - Is the vulnerability exploitable given your deployment context (e.g., a
249
+ server-side vulnerability in a client-only app)?
250
+
251
+ When you defer a fix, document the reason and set a review date.
252
+
253
+ ## Rate Limiting
254
+
255
+ ```typescript
256
+ import rateLimit from 'express-rate-limit';
257
+
258
+ // General API rate limit
259
+ app.use(
260
+ '/api/',
261
+ rateLimit({
262
+ windowMs: 15 * 60 * 1000,
263
+ max: 100,
264
+ standardHeaders: true,
265
+ legacyHeaders: false,
266
+ }),
267
+ );
268
+
269
+ // Stricter limit for auth endpoints (the rule MUSTs rate-limiting on auth)
270
+ app.use(
271
+ '/api/auth/',
272
+ rateLimit({
273
+ windowMs: 15 * 60 * 1000,
274
+ max: 10,
275
+ }),
276
+ );
277
+ ```
278
+
279
+ ## Secrets Management Layout
280
+
281
+ See [security-baseline § Secrets Management](../../../rules/security-baseline.md#secrets-management).
282
+
283
+ ```text
284
+ .env files:
285
+ ├── .env.example → Committed (template with placeholder values)
286
+ ├── .env → NOT committed (contains real secrets)
287
+ └── .env.local → NOT committed (local overrides)
288
+
289
+ .gitignore must include:
290
+ .env
291
+ .env.local
292
+ .env.*.local
293
+ *.pem
294
+ *.key
295
+ ```
296
+
297
+ **Always check before committing:**
298
+
299
+ ```bash
300
+ # Check for accidentally staged secrets
301
+ git diff --cached | grep -i "password\|secret\|api_key\|token"
302
+ ```
303
+
304
+ ## Security Review Checklist
305
+
306
+ Use this when reviewing your own change before requesting human review. Each
307
+ item maps to a section in
308
+ [`security-baseline.md`](../../../rules/security-baseline.md).
309
+
310
+ ```markdown
311
+ ### Authentication
312
+
313
+ - [ ] Passwords hashed with bcrypt/scrypt/argon2 (salt rounds ≥ 12)
314
+ - [ ] Session tokens are httpOnly, secure, sameSite
315
+ - [ ] Login has rate limiting
316
+ - [ ] Password reset tokens expire
317
+
318
+ ### Authorization
319
+
320
+ - [ ] Every endpoint checks user permissions
321
+ - [ ] Users can only access their own resources
322
+ - [ ] Admin actions require admin role verification
323
+
324
+ ### Input
325
+
326
+ - [ ] All user input validated at the boundary
327
+ - [ ] SQL queries are parameterized
328
+ - [ ] HTML output is encoded/escaped
329
+
330
+ ### Data
331
+
332
+ - [ ] No secrets in code or version control
333
+ - [ ] Sensitive fields excluded from API responses
334
+ - [ ] PII encrypted at rest (if applicable)
335
+
336
+ ### Infrastructure
337
+
338
+ - [ ] Security headers configured (CSP, HSTS, etc.)
339
+ - [ ] CORS restricted to known origins
340
+ - [ ] Dependencies audited for vulnerabilities
341
+ - [ ] Error messages don't expose internals
342
+ ```
343
+
344
+ ## Common Rationalizations
345
+
346
+ | Rationalization | Reality |
347
+ | --------------------------------------------------- | ------------------------------------------------------------------------------- |
348
+ | "This is an internal tool, security doesn't matter" | Internal tools get compromised. Attackers target the weakest link. |
349
+ | "We'll add security later" | Security retrofitting is 10x harder than building it in. Add it now. |
350
+ | "No one would try to exploit this" | Automated scanners will find it. Security by obscurity is not security. |
351
+ | "The framework handles security" | Frameworks provide tools, not guarantees. You still need to use them correctly. |
352
+ | "It's just a prototype" | Prototypes become production. Security habits from day one. |
353
+
354
+ ## Red Flags
355
+
356
+ - User input passed directly to database queries, shell commands, or HTML
357
+ rendering
358
+ - Secrets in source code or commit history
359
+ - API endpoints without authentication or authorization checks
360
+ - Missing CORS configuration or wildcard (`*`) origins
361
+ - No rate limiting on authentication endpoints
362
+ - Stack traces or internal errors exposed to users
363
+ - Dependencies with known critical vulnerabilities
364
+
365
+ ## Verification
366
+
367
+ After implementing security-relevant code, confirm against the rule:
368
+
369
+ - [ ] `npm audit` shows no critical or high vulnerabilities
370
+ - [ ] No secrets in source code or git history
371
+ - [ ] All user input validated at system boundaries
372
+ - [ ] Authentication and authorization checked on every protected endpoint
373
+ - [ ] Security headers present in response (check with browser DevTools)
374
+ - [ ] Error responses don't expose internal details
375
+ - [ ] Rate limiting active on auth endpoints
@@ -1,17 +1,7 @@
1
1
  {
2
- "generatedAt": "2026-07-14T21:42:10.296Z",
2
+ "generatedAt": "2026-07-16T20:44:41.281Z",
3
3
  "generator": "generate-skills-index.js@1",
4
4
  "skills": [
5
- {
6
- "name": "analyze-execution",
7
- "tier": "core",
8
- "category": "core",
9
- "path": ".agents/skills/core/analyze-execution/SKILL.md",
10
- "description": "Aggregate per-Story or per-plan-run execution signals into a structured perf-summary or perf-report and upsert it onto the corresponding GitHub ticket. Use after a Story closes (Story mode) or during run closeout (plan-run mode). Reads NDJSON via `lib/signals/read` and writes a single structured comment.",
11
- "policyCapsuleBullets": 8,
12
- "allowedTools": ["Read", "Bash"],
13
- "vendor": null
14
- },
15
5
  {
16
6
  "name": "api-and-interface-design",
17
7
  "tier": "core",
@@ -118,7 +108,7 @@
118
108
  "category": "core",
119
109
  "path": ".agents/skills/core/scope-triage/SKILL.md",
120
110
  "description": "Optional split-advisory for `/plan`. Under v2 there is no epic|story routing verdict — `/plan` always authors Stories. Use this skill only when judging whether a draft should stay one Story or legitimately split (near-zero overlap or an architectural seam).",
121
- "policyCapsuleBullets": 1,
111
+ "policyCapsuleBullets": 5,
122
112
  "allowedTools": null,
123
113
  "vendor": null
124
114
  },
@@ -122,9 +122,8 @@ authoring.
122
122
  expression across jobs — tag-sharding makes flake triage non-deterministic.
123
123
  - Run `bddgen` once per job before `playwright test`; cache the generated
124
124
  directory only if the cache key includes every `.feature` and step file.
125
- - Publish the Cucumber HTML/JSON report as the evidence artifact consumed by the
126
- `epic-testing` helper, alongside the Playwright HTML report and any trace
127
- zips.
125
+ - Publish the Cucumber HTML/JSON report as the evidence artifact, alongside
126
+ the Playwright HTML report and any trace zips.
128
127
  - Quarantine `@flaky` scenarios with a dedicated job that does not gate the
129
128
  merge queue; do not silently retry flakes in the main suite.
130
129
 
@@ -185,4 +184,3 @@ those outcomes.
185
184
  - Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
186
185
  - Browser-level conventions: `.agents/skills/stack/qa/playwright/SKILL.md`.
187
186
  - Operator entry point: `.agents/workflows/qa-run.md`.
188
- - Evidence handoff: `.agents/workflows/helpers/epic-testing.md`.
@@ -91,7 +91,7 @@ source, route definitions, and rendered markup rather than a running browser.
91
91
 
92
92
  The agent-driven Capture phase is **strictly read-only**. This invariant is
93
93
  inviolable per [`security-baseline.md`](../../../../rules/security-baseline.md)
94
- and the Epic's security considerations — it is not a soft preference.
94
+ and the Story's security considerations — it is not a soft preference.
95
95
 
96
96
  - **No source edits.** The agent does not modify application code, config, or
97
97
  tests while driving. Exploration observes; it never repairs.
@@ -192,9 +192,7 @@ Bundle findings **by likely root cause** into proposed follow-up tickets with
192
192
  `Depends-on` / `Blocks` relationships, then present the draft for operator
193
193
  approval. The harness **MUST NOT** create tickets autonomously — it stops at a
194
194
  draft. The operator-approval gate is the safety boundary against spurious
195
- filing. When the run was triggered from an Epic-testing context, hand the
196
- **approved** findings to the Epic-testing helper for attachment to the Epic's
197
- QA evidence ticket.
195
+ filing.
198
196
 
199
197
  ## 6. Sign-In & Contract Discipline
200
198
 
@@ -19,8 +19,7 @@ existing external APIs or business logic.
19
19
  ## Execution strategy (dual-path)
20
20
 
21
21
  This lens runs along one of two execution paths. Both emit the **identical**
22
- report contract (Step 3); downstream consumers (`/deliver` Phase 4
23
- epic-audit, `audit-to-stories`) are agnostic to which path produced it.
22
+ report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
24
23
 
25
24
  - **Orchestrated (dynamic-workflow) path.** When Claude Code's
26
25
  [dynamic workflows](https://code.claude.com/docs/en/workflows) are
@@ -218,7 +217,7 @@ Evaluate the gathered context against the following clean code dimensions:
218
217
  gates, baseline kinds, close-validation steps, dependencies, or
219
218
  harness subsystems under this dimension.
220
219
 
221
- **Scope-mode behavior.** When this lens is invoked in Epic mode (the
220
+ **Scope-mode behavior.** When this lens is invoked in Story scope (the
222
221
  `{{changedFiles}}` block above is populated with a file list), the
223
222
  maturity assessment for this dimension is a repo-wide property that
224
223
  cannot be represented by a small changeset. In that case, render the
@@ -269,7 +268,7 @@ architectural pain points and areas for simplification.]
269
268
  ## Architecture Guardrail Coverage
270
269
 
271
270
  [Codebase-wide mode: complete this section using the maturity rubric in
272
- Step 2. Epic-mode / scoped run: set `Current Maturity` to
271
+ Step 2. Story-scoped run: set `Current Maturity` to
273
272
  `Not Assessed — scoped run` and leave the remaining fields empty or
274
273
  marked `n/a`.]
275
274
 
@@ -39,8 +39,7 @@ before this section existed.
39
39
  ## Execution strategy (dual-path)
40
40
 
41
41
  This lens runs along one of two execution paths. Both emit the **identical**
42
- report contract (Step 3); downstream consumers (`/deliver` Phase 4
43
- epic-audit, `audit-to-stories`) are agnostic to which path produced it.
42
+ report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
44
43
 
45
44
  - **Orchestrated (dynamic-workflow) path.** When Claude Code's
46
45
  [dynamic workflows](https://code.claude.com/docs/en/workflows) are
@@ -102,8 +101,9 @@ Analyze the repository with a focus on:
102
101
  cyclomatic complexity > 8 (`delivery.quality.codingGuardrails.cyclomaticFlag`)
103
102
  is **flag in review** (annotate or split); > 12
104
103
  (`codingGuardrails.cyclomaticMustFix`) is **must-fix** before the work merges.
105
- A per-file MI drop > 1.5pt (`codingGuardrails.miDropMustRefactor`) requires a
106
- refactor in the same Story rather than a baseline bump.
104
+ A per-file MI drop beyond the configured
105
+ `delivery.quality.gates.maintainability.tolerance` (default 0.5pt) requires
106
+ a refactor in the same Story rather than a baseline bump.
107
107
  - **Duplication:** Find "copy-paste" logic that should be abstracted into
108
108
  reusable utilities or hooks.
109
109
  - **Component Health:** In UI code, look for "component bloat" (files > 300
@@ -16,7 +16,7 @@ renamed, scripts move, described workflows change shape, and
16
16
  version/topology claims go stale. The deterministic gates
17
17
  (`check-doc-links.js`, `check-lifecycle-doc-drift.js`,
18
18
  `validate-docs-freshness.js`) catch broken links, drift against generators,
19
- and Epic-scoped freshness — they cannot tell whether the prose still
19
+ and per-delivery freshness — they cannot tell whether the prose still
20
20
  describes how the code actually behaves. That semantic verification is this
21
21
  lens's job.
22
22
 
@@ -71,8 +71,7 @@ before this section existed.
71
71
  ## Execution strategy (dual-path)
72
72
 
73
73
  This lens runs along one of two execution paths. Both emit the **identical**
74
- report contract (Step 3); downstream consumers (`/deliver` Phase 4
75
- epic-audit, `audit-to-stories`) are agnostic to which path produced it.
74
+ report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
76
75
 
77
76
  - **Orchestrated (dynamic-workflow) path.** When Claude Code's
78
77
  [dynamic workflows](https://code.claude.com/docs/en/workflows) are
@@ -279,8 +278,8 @@ match the code), the deterministic-gate verdicts, and primary drift themes.]
279
278
  ## Periodic full-scope sweep
280
279
 
281
280
  Context Economy findings accrete slowly — a doc that is lean today grows a
282
- bloated tail over many Epics, and no single change-set-scoped `/deliver`
283
- Phase 4 run sees the whole picture. Run this lens **full-scope** on a
281
+ bloated tail over many deliveries, and no single change-set-scoped `/deliver`
282
+ run sees the whole picture. Run this lens **full-scope** on a
284
283
  recurring cadence so the drift is caught before it compounds:
285
284
 
286
285
  - **Scheduled invocation** — `/schedule` running `/audit-documentation`
@@ -5,6 +5,14 @@ command: false
5
5
 
6
6
  # Lighthouse Audit & Analysis
7
7
 
8
+ ## Applicability
9
+
10
+ **Web targets only.** Registered with `target: "web"` in
11
+ [`audit-rules.json`](../schemas/audit-rules.json): the selector skips this lens
12
+ on a project with no web surface, since there is no page to launch Lighthouse
13
+ against. See the `target` key's schema description for how applicability is
14
+ probed from the consumer's checkout.
15
+
8
16
  ## Role
9
17
 
10
18
  Senior Web Performance & Quality Engineer. You operate Lighthouse end-to-end:
@@ -8,6 +8,16 @@ description: >-
8
8
 
9
9
  # Navigability Audit
10
10
 
11
+ ## Applicability
12
+
13
+ **Web targets only.** Registered with `target: "web"` in
14
+ [`audit-rules.json`](../schemas/audit-rules.json). This is consistent with the
15
+ lens's own no-op contract below rather than an additional constraint: the
16
+ web-surface probe's first signal _is_ configured `routeGlobs`, so a consumer
17
+ that has configured this lens's route-tree SSOT always clears the gate. The
18
+ gate only bites where the lens had no route data to read anyway — it converts a
19
+ silent no-op run into no run at all.
20
+
11
21
  ## Role
12
22
 
13
23
  Information-Architecture Reviewer & Frontend Navigation Auditor
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Audit hot paths, algorithmic complexity, and I/O bottlenecks in the tooling surface (`epic-close`, dispatcher, gates); propose remediations.
2
+ description: Audit hot paths, algorithmic complexity, and I/O bottlenecks in the tooling surface (`single-story-close`, dispatcher, gates); propose remediations.
3
3
  ---
4
4
 
5
5
  # Performance & Bottleneck Audit
@@ -38,8 +38,7 @@ before this section existed.
38
38
  ## Execution strategy (dual-path)
39
39
 
40
40
  This lens runs along one of two execution paths. Both emit the **identical**
41
- report contract (Step 3); downstream consumers (`/deliver` Phase 4
42
- epic-audit, `audit-to-stories`) are agnostic to which path produced it.
41
+ report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
43
42
 
44
43
  - **Orchestrated (dynamic-workflow) path.** When Claude Code's
45
44
  [dynamic workflows](https://code.claude.com/docs/en/workflows) are
@@ -15,7 +15,7 @@ infrastructure, test coverage, and overall quality assurance practices. Your
15
15
  goal is to identify testing gaps, flaky tests, inefficient mocking strategies,
16
16
  and opportunities to improve test execution speed and reliability without making
17
17
  any immediate changes. Additionally, you must evaluate the implemented tests
18
- against the active Epic and the current codebase to ensure all quality
18
+ against the Story under audit and the current codebase to ensure all quality
19
19
  requirements are met and correctly documented.
20
20
 
21
21
  **Note on Testing Responsibilities**: When evaluating test maturity, note the
@@ -48,8 +48,7 @@ before this section existed.
48
48
  ## Execution strategy (dual-path)
49
49
 
50
50
  This lens runs along one of two execution paths. Both emit the **identical**
51
- report contract (Step 3); downstream consumers (`/deliver` Phase 4
52
- epic-audit, `audit-to-stories`) are agnostic to which path produced it.
51
+ report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
53
52
 
54
53
  - **Orchestrated (dynamic-workflow) path.** When Claude Code's
55
54
  [dynamic workflows](https://code.claude.com/docs/en/workflows) are
@@ -101,8 +100,8 @@ degrade to the sequential path.
101
100
 
102
101
  ## Step 0 - Project Context
103
102
 
104
- 1. Read the active Epic and its child tickets to identify the current milestone
105
- and target features.
103
+ 1. Read the Story under audit its `## Goal`, inline `acceptance[]` /
104
+ `verify[]`, and folded `## Spec` — to identify the target features.
106
105
  2. Identify the target codebase paths for the audit.
107
106
 
108
107
  ## Step 1: Context Gathering (Read-Only Scan)
@@ -116,8 +115,8 @@ files. Pay special attention to:
116
115
  `playwright.config.ts`, `cypress.json`).
117
116
  - Test directories and files (e.g., `__tests__/`, `spec/`, `e2e/`, `*.test.ts`,
118
117
  `*.spec.js`).
119
- - The active Epic and its child tickets to map out expected features versus
120
- implemented tests.
118
+ - The Story's `acceptance[]` / `verify[]` arrays, to map expected behaviour
119
+ versus implemented tests.
121
120
  - Mocking and stubbing setups (e.g., `__mocks__/`, `setupTests.js`, MSW
122
121
  handlers).
123
122
  - CI/CD workflow files to understand how and when tests are executed.
@@ -140,8 +139,8 @@ Evaluate the gathered context against the following test quality dimensions:
140
139
  5. **Performance & Execution:** Find bottlenecks in the test suite, such as
141
140
  unnecessary serial execution, heavy setup running too frequently, or
142
141
  opportunities for parallelization.
143
- 6. **Requirement Alignment:** Cross-reference the features outlined in the
144
- active Epic to ensure they have corresponding and complete test coverage.
142
+ 6. **Requirement Alignment:** Cross-reference the Story's `acceptance[]`
143
+ criteria to ensure they have corresponding and complete test coverage.
145
144
  Verify that the implementation found in the codebase correctly matches the
146
145
  architectural requirements and highlight any inconsistencies or gaps.
147
146
 
@@ -39,8 +39,7 @@ before this section existed.
39
39
  ## Execution strategy (dual-path)
40
40
 
41
41
  This lens runs along one of two execution paths. Both emit the **identical**
42
- report contract (Step 3); downstream consumers (`/deliver` Phase 4
43
- epic-audit, `audit-to-stories`) are agnostic to which path produced it.
42
+ report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
44
43
 
45
44
  - **Orchestrated (dynamic-workflow) path.** When Claude Code's
46
45
  [dynamic workflows](https://code.claude.com/docs/en/workflows) are
@@ -4,6 +4,16 @@ description: Audit SEO fundamentals and Generative Engine Optimization signals (
4
4
 
5
5
  # SEO & Generative Engine Optimization Audit
6
6
 
7
+ ## Applicability
8
+
9
+ **Web targets only.** This lens is registered with `target: "web"` in
10
+ [`audit-rules.json`](../schemas/audit-rules.json), so the selector skips it
11
+ entirely on a project with no web surface — however well its keyword triggers
12
+ match the ticket prose. Applicability is derived from the consumer's own
13
+ checkout (configured navigability `routeGlobs`, a declared web-framework
14
+ dependency, or a tracked `.html` / `.css` / `.jsx` / `.tsx` source file), not
15
+ from an `.agentrc` key, and the probe fails open when indeterminate.
16
+
7
17
  ## Role
8
18
 
9
19
  Senior Technical SEO and Generative Engine Optimization (GEO) Specialist. You
@@ -4,6 +4,13 @@ description: Audit UX/UI consistency and design system adherence
4
4
 
5
5
  # UX/UI & Design System Audit
6
6
 
7
+ ## Applicability
8
+
9
+ **Web targets only.** Registered with `target: "web"` in
10
+ [`audit-rules.json`](../schemas/audit-rules.json): the selector skips this lens
11
+ on a project with no rendered frontend. See the `target` key's schema
12
+ description for how applicability is probed from the consumer's checkout.
13
+
7
14
  ## Role
8
15
 
9
16
  Lead Product Designer & Frontend Architect