@next-friday/create-app 9.2.0 → 9.3.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 (260) hide show
  1. package/package.json +13 -10
  2. package/templates/base/.agents/review.md +1 -1
  3. package/templates/base/.claude/settings.json +11 -0
  4. package/templates/base/.claude-plugin/marketplace.json +16 -0
  5. package/templates/base/.cursor/hooks/load-project-plugins.sh +3 -0
  6. package/templates/base/.cursor/hooks.json +6 -0
  7. package/templates/base/.github/workflows/control-band.yml +4 -2
  8. package/templates/base/.github/workflows/spec-on-intent-merge.yml +2 -1
  9. package/templates/base/REVIEW.md +1 -1
  10. package/templates/base/SETUP.md +12 -9
  11. package/templates/base/intent/README.md +1 -1
  12. package/templates/base/plugins/sdlc/claude-code/.claude-plugin/plugin.json +7 -0
  13. package/templates/base/plugins/sdlc/claude-code/agents/verifier.md +7 -0
  14. package/templates/base/plugins/sdlc/claude-code/hooks/check-reply-shape.sh +53 -0
  15. package/templates/base/plugins/sdlc/claude-code/hooks/hooks.json +15 -0
  16. package/templates/base/{.agents → plugins/sdlc/claude-code}/skills/brand-policy/SKILL.md +1 -3
  17. package/templates/base/{.agents → plugins/sdlc/claude-code}/skills/compliance-policy/SKILL.md +0 -2
  18. package/templates/base/plugins/sdlc/claude-code/skills/sdlc-help/SKILL.md +23 -0
  19. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/SKILL.md +22 -11
  20. package/templates/base/plugins/sdlc/claude-code/skills/sdlc-mode/playbooks/build.md +46 -0
  21. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/deploy.md +4 -4
  22. package/templates/base/{.claude/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/design.md +8 -8
  23. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/fix.md +7 -7
  24. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/maintain.md +6 -8
  25. package/templates/base/plugins/sdlc/claude-code/skills/sdlc-mode/playbooks/open-pr.md +17 -0
  26. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/plan.md +6 -6
  27. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/question.md +2 -2
  28. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/claude-code/skills/sdlc-mode}/playbooks/review.md +7 -8
  29. package/templates/base/{.claude → plugins/sdlc/claude-code}/skills/security-policy/SKILL.md +0 -2
  30. package/templates/base/plugins/sdlc/claude-code/skills/setup-sdlc/SKILL.md +51 -0
  31. package/templates/base/{.agents → plugins/sdlc/claude-code}/skills/ux-policy/SKILL.md +0 -2
  32. package/templates/base/plugins/sdlc/cursor/.cursor-plugin/plugin.json +10 -0
  33. package/templates/base/plugins/sdlc/cursor/agents/verifier.md +7 -0
  34. package/templates/base/plugins/sdlc/cursor/hooks/check-reply-shape.sh +53 -0
  35. package/templates/base/plugins/sdlc/cursor/hooks/hooks.json +16 -0
  36. package/templates/base/{.cursor → plugins/sdlc/cursor}/skills/brand-policy/SKILL.md +1 -3
  37. package/templates/base/{.claude → plugins/sdlc/cursor}/skills/compliance-policy/SKILL.md +0 -2
  38. package/templates/base/plugins/sdlc/cursor/skills/sdlc-help/SKILL.md +23 -0
  39. package/templates/base/{.claude/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/SKILL.md +22 -11
  40. package/templates/base/plugins/sdlc/cursor/skills/sdlc-mode/playbooks/build.md +46 -0
  41. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/deploy.md +4 -4
  42. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/design.md +8 -8
  43. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/fix.md +7 -7
  44. package/templates/base/{.cursor/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/maintain.md +6 -8
  45. package/templates/base/plugins/sdlc/cursor/skills/sdlc-mode/playbooks/open-pr.md +17 -0
  46. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/plan.md +6 -6
  47. package/templates/base/{.claude/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/question.md +2 -2
  48. package/templates/base/{.agents/skills/sdlc → plugins/sdlc/cursor/skills/sdlc-mode}/playbooks/review.md +7 -8
  49. package/templates/base/{.agents → plugins/sdlc/cursor}/skills/security-policy/SKILL.md +0 -2
  50. package/templates/base/plugins/sdlc/cursor/skills/setup-sdlc/SKILL.md +51 -0
  51. package/templates/base/{.claude → plugins/sdlc/cursor}/skills/ux-policy/SKILL.md +0 -2
  52. package/templates/base/scripts/check-agent-gates.ts +14 -1
  53. package/templates/base/scripts/check-plan.ts +1 -1
  54. package/templates/base/scripts/sync-agent-rules.ts +0 -58
  55. package/templates/nestjs/AGENTS.md +6 -4
  56. package/templates/nestjs/CONTRIBUTING.md +0 -1
  57. package/templates/nestjs/package.json +7 -8
  58. package/templates/nextjs/AGENTS.md +6 -4
  59. package/templates/nextjs/CONTRIBUTING.md +0 -1
  60. package/templates/nextjs/package.json +7 -8
  61. package/templates/nodejs/AGENTS.md +6 -4
  62. package/templates/nodejs/CONTRIBUTING.md +0 -1
  63. package/templates/nodejs/package.json +3 -4
  64. package/templates/payload/.agents/review.md +1 -1
  65. package/templates/payload/AGENTS.md +6 -4
  66. package/templates/payload/CONTRIBUTING.md +0 -1
  67. package/templates/payload/REVIEW.md +1 -1
  68. package/templates/payload/package.json +9 -10
  69. package/templates/turborepo/.agents/review.md +1 -1
  70. package/templates/turborepo/AGENTS.md +6 -4
  71. package/templates/turborepo/CONTRIBUTING.md +0 -1
  72. package/templates/turborepo/REVIEW.md +1 -1
  73. package/templates/turborepo/apps/app/package.json +6 -6
  74. package/templates/turborepo/apps/backoffice/package.json +8 -8
  75. package/templates/turborepo/package.json +1 -2
  76. package/templates/base/.agents/agents.json +0 -7
  77. package/templates/base/.agents/skill-evals/README.md +0 -42
  78. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/case.yaml +0 -12
  79. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/01-the-reply-explains-why-pnpm.md +0 -7
  80. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/02-no-file-in-the-project.md +0 -7
  81. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/03-no-commit-is-made-nothing.md +0 -7
  82. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/04-the-reply-is-in-the.md +0 -7
  83. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/05-every-path-in-the-reply.md +0 -7
  84. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/06-everything-the-reply-states-as.md +0 -7
  85. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/prompt.md +0 -8
  86. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/case.yaml +0 -12
  87. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/fixture.md +0 -1
  88. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/01-work-happens-on-the-plan-branch.md +0 -7
  89. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/02-the-plan-is-implemented-and-checked.md +0 -7
  90. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/03-the-branch-is-pushed.md +0 -7
  91. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/04-the-reply-lists-three-playbooks.md +0 -7
  92. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/05-no-approval-and-no-merge.md +0 -7
  93. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/06-the-reply-ends-at-the-code-owner.md +0 -7
  94. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/graders/07-the-plan-names-the-engineer.md +0 -7
  95. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/prompt.md +0 -8
  96. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/case.yaml +0 -71
  97. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/fixture.md +0 -1
  98. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/01-the-reply-asks-numbered-questions.md +0 -7
  99. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/02-no-plan-before-the-answers.md +0 -7
  100. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/03-no-question-depends-on-another.md +0 -7
  101. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/04-no-file-or-commit.md +0 -7
  102. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/graders/05-the-reply-is-in-thai.md +0 -7
  103. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/prompt.md +0 -8
  104. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/case.yaml +0 -68
  105. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/fixture.md +0 -1
  106. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/01-the-plan-has-the-four-headings.md +0 -7
  107. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/02-no-source-file-or-commit.md +0 -7
  108. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/03-the-reply-names-the-gate.md +0 -7
  109. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/04-the-reply-is-in-thai.md +0 -7
  110. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/prompt.md +0 -10
  111. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/case.yaml +0 -8
  112. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/fixture.md +0 -1
  113. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/01-no-deployment-is-started.md +0 -7
  114. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/02-the-reply-names-the-release-manager-gate.md +0 -7
  115. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/03-the-reply-says-what-it-could-not-read.md +0 -7
  116. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/04-the-reply-is-in-the-language.md +0 -7
  117. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/prompt.md +0 -8
  118. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/case.yaml +0 -13
  119. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/01-a-file-intentkebabcasenameintentmd-exists-with.md +0 -7
  120. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/02-the-reply-shows-the-draft.md +0 -7
  121. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/03-no-commit-is-made-nothing.md +0 -7
  122. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/04-reply-lists-the-playbook-steps.md +0 -7
  123. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/05-the-reply-is-in-the.md +0 -7
  124. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/06-every-path-in-the-reply.md +0 -7
  125. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/07-the-drafts-open-questions-section.md +0 -7
  126. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/prompt.md +0 -10
  127. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/case.yaml +0 -34
  128. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/fixture.md +0 -1
  129. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/01-the-reply-shows-the-reproduction-output.md +0 -7
  130. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/02-the-reply-names-one-cause-with-evidence.md +0 -7
  131. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/03-the-plan-has-the-four-headings.md +0 -7
  132. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/04-no-file-or-commit.md +0 -7
  133. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/05-the-reply-names-the-gate.md +0 -7
  134. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/graders/06-the-reply-is-in-thai.md +0 -7
  135. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/prompt.md +0 -8
  136. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/case.yaml +0 -12
  137. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/01-the-first-message-restates-the.md +0 -7
  138. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/02-the-reply-asks-numbered-questions.md +0 -7
  139. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/03-no-intentmd-is-written-before.md +0 -7
  140. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/04-reply-lists-the-playbook-steps.md +0 -7
  141. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/05-no-commit-is-made-nothing.md +0 -7
  142. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/06-the-reply-is-in-the.md +0 -7
  143. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/07-every-path-in-the-reply.md +0 -7
  144. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/08-no-question-in-the-round.md +0 -7
  145. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/prompt.md +0 -8
  146. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/case.yaml +0 -14
  147. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/fixture.md +0 -1
  148. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/01-the-intent-has-the-five-headings.md +0 -7
  149. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/02-problem-holds-the-error-and-where.md +0 -7
  150. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/03-unverified-cause-is-an-open-question.md +0 -7
  151. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/04-no-source-file-is-changed.md +0 -7
  152. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/05-a-branch-is-pushed-and-the-gate-is-named.md +0 -7
  153. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/graders/06-the-person-is-asked-no-question.md +0 -7
  154. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/prompt.md +0 -8
  155. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/case.yaml +0 -12
  156. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/01-the-reply-follows-the-plan.md +0 -7
  157. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/02-the-reply-does-not-tell.md +0 -7
  158. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/03-no-file-is-created-or.md +0 -7
  159. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/04-the-reply-is-in-the.md +0 -7
  160. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/05-every-path-in-the-reply.md +0 -7
  161. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/prompt.md +0 -8
  162. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/case.yaml +0 -11
  163. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/fixture.md +0 -1
  164. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/01-no-file-is-written-and-nothing-is-committed.md +0 -7
  165. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/02-the-reply-names-the-closest-row.md +0 -7
  166. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/03-the-reply-is-short-and-in-thai.md +0 -7
  167. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/prompt.md +0 -8
  168. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/case.yaml +0 -79
  169. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/fixture.md +0 -1
  170. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/01-findings-have-pass-severity-and-location.md +0 -7
  171. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/02-no-approval-and-no-merge.md +0 -7
  172. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/03-the-reply-names-the-code-owner-gate.md +0 -7
  173. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/04-nothing-is-pushed-or-changed.md +0 -7
  174. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/graders/05-the-review-runs-in-a-fresh-context.md +0 -7
  175. package/templates/base/.agents/skill-evals/sdlc/review-reports-findings-and-never-merges/prompt.md +0 -8
  176. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/case.yaml +0 -42
  177. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/fixture.md +0 -1
  178. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/01-no-spec-is-written.md +0 -7
  179. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/02-no-commit-is-made.md +0 -7
  180. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/03-the-reply-says-not-merged.md +0 -7
  181. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/04-the-reply-is-in-the.md +0 -7
  182. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/05-the-reply-is-short.md +0 -7
  183. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/prompt.md +0 -8
  184. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/case.yaml +0 -12
  185. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/01-no-intentmd-or-any-other.md +0 -7
  186. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/02-no-commit-is-made-nothing.md +0 -7
  187. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/03-the-reply-is-in-the.md +0 -7
  188. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/04-every-path-in-the-reply.md +0 -7
  189. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/05-the-reply-says-that-work.md +0 -7
  190. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/prompt.md +0 -8
  191. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/case.yaml +0 -42
  192. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/fixture.md +0 -1
  193. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/01-the-spec-has-the-five-headings.md +0 -7
  194. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/02-policies-has-one-line-per-policy.md +0 -7
  195. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/03-no-policy-is-called-unwritten.md +0 -7
  196. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/04-a-branch-is-pushed-for-review.md +0 -7
  197. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/05-the-reply-names-the-gate.md +0 -7
  198. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/06-the-reply-is-in-the.md +0 -7
  199. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/07-no-merge-is-made.md +0 -7
  200. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/08-the-four-policies-are-read-before-writing.md +0 -7
  201. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/prompt.md +0 -8
  202. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/case.yaml +0 -11
  203. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/01-the-reply-says-that-work.md +0 -7
  204. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/02-the-reply-gives-one-example.md +0 -7
  205. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/03-the-reply-lists-the-project.md +0 -7
  206. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/04-no-file-is-created-or.md +0 -7
  207. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/05-the-reply-is-in-the.md +0 -7
  208. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/06-every-path-in-the-reply.md +0 -7
  209. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/prompt.md +0 -8
  210. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/case.yaml +0 -10
  211. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/01-the-reply-says-that-this.md +0 -7
  212. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/02-the-reply-does-not-describe.md +0 -7
  213. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/03-no-file-is-created-or.md +0 -7
  214. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/04-the-reply-is-in-the.md +0 -7
  215. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/05-every-path-in-the-reply.md +0 -7
  216. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/prompt.md +0 -8
  217. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/case.yaml +0 -11
  218. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/01-the-reply-says-to-send.md +0 -7
  219. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/02-no-file-is-created-or.md +0 -7
  220. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/03-the-reply-is-in-the.md +0 -7
  221. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/04-every-path-in-the-reply.md +0 -7
  222. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/prompt.md +0 -8
  223. package/templates/base/.agents/skills/sdlc/SKILL.md +0 -54
  224. package/templates/base/.agents/skills/sdlc/playbooks/build.md +0 -46
  225. package/templates/base/.agents/skills/sdlc/playbooks/design.md +0 -40
  226. package/templates/base/.agents/skills/sdlc/playbooks/open-pr.md +0 -15
  227. package/templates/base/.agents/skills/sdlc-help/SKILL.md +0 -23
  228. package/templates/base/.claude/skills/brand-policy/SKILL.md +0 -18
  229. package/templates/base/.claude/skills/sdlc/playbooks/build.md +0 -46
  230. package/templates/base/.claude/skills/sdlc/playbooks/deploy.md +0 -9
  231. package/templates/base/.claude/skills/sdlc/playbooks/fix.md +0 -23
  232. package/templates/base/.claude/skills/sdlc/playbooks/maintain.md +0 -20
  233. package/templates/base/.claude/skills/sdlc/playbooks/open-pr.md +0 -15
  234. package/templates/base/.claude/skills/sdlc/playbooks/plan.md +0 -33
  235. package/templates/base/.claude/skills/sdlc/playbooks/review.md +0 -17
  236. package/templates/base/.claude/skills/sdlc-help/SKILL.md +0 -23
  237. package/templates/base/.cursor/skills/compliance-policy/SKILL.md +0 -25
  238. package/templates/base/.cursor/skills/sdlc/playbooks/build.md +0 -46
  239. package/templates/base/.cursor/skills/sdlc/playbooks/open-pr.md +0 -15
  240. package/templates/base/.cursor/skills/sdlc/playbooks/question.md +0 -8
  241. package/templates/base/.cursor/skills/sdlc-help/SKILL.md +0 -23
  242. package/templates/base/.cursor/skills/security-policy/SKILL.md +0 -41
  243. package/templates/base/.cursor/skills/ux-policy/SKILL.md +0 -21
  244. package/templates/base/.github/workflows/agent-evals.yml +0 -46
  245. package/templates/base/scripts/run-agent-evals.ts +0 -1186
  246. package/templates/nestjs/.agents/agents/verifier.md +0 -1
  247. package/templates/nestjs/.claude/agents/verifier.md +0 -7
  248. package/templates/nestjs/.cursor/agents/verifier.md +0 -7
  249. package/templates/nextjs/.agents/agents/verifier.md +0 -1
  250. package/templates/nextjs/.claude/agents/verifier.md +0 -7
  251. package/templates/nextjs/.cursor/agents/verifier.md +0 -7
  252. package/templates/nodejs/.agents/agents/verifier.md +0 -1
  253. package/templates/nodejs/.claude/agents/verifier.md +0 -7
  254. package/templates/nodejs/.cursor/agents/verifier.md +0 -7
  255. package/templates/payload/.agents/agents/verifier.md +0 -1
  256. package/templates/payload/.claude/agents/verifier.md +0 -7
  257. package/templates/payload/.cursor/agents/verifier.md +0 -7
  258. package/templates/turborepo/.agents/agents/verifier.md +0 -1
  259. package/templates/turborepo/.claude/agents/verifier.md +0 -7
  260. package/templates/turborepo/.cursor/agents/verifier.md +0 -7
@@ -2,10 +2,10 @@
2
2
 
3
3
  This playbook takes a defect in behaviour that already exists to a pull request. It has no intent and no spec: its plan is the only file it adds under `intent/`.
4
4
 
5
- 1. Decide that the request qualifies. It qualifies only when the request is a defect in behaviour that already exists, and the fix adds no new behaviour and no new dependency and changes no schema and no public interface. When a condition fails, say which one in two lines and follow `.agents/skills/sdlc/playbooks/plan.md` instead.
5
+ 1. Decide that the request qualifies. It qualifies only when the request is a defect in behaviour that already exists, and the fix adds no new behaviour and no new dependency and changes no schema and no public interface. When a condition fails, say which one in two lines and follow `playbooks/plan.md` instead.
6
6
  2. Reproduce the defect yourself by running the code, and keep the output. Ask the person only when you can name the specific reason you cannot reach it, such as a credential or a service this session cannot use.
7
7
  3. Find the cause from what running the code shows. List the candidate causes, rule each out with a command or an observation, and never guess. Name the one cause the evidence leaves. When it leaves none, or more than one, say so and ask for what is missing.
8
- 4. Write the plan from the template in `.agents/skills/sdlc/playbooks/build.md`, in the language of the files already in `intent/`, and keep the reply in the language the person wrote in. The title is `# Plan: <title> (fix)`. Use exactly the template's four headings, and keep the plan short. Name the file `intent/<short-description>/plan.md`; the folder holds only this file.
8
+ 4. Write the plan from the template in `playbooks/build.md`. The title is `# Plan: <title> (fix)`. Use exactly the template's four headings, and keep the plan short. Name the file `intent/<short-description>/plan.md`; the folder holds only this file.
9
9
  - **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
10
10
  - **Order of work:** the cause and the evidence for it, then numbered steps. Each ends with the check that proves it.
11
11
  - **Risks:** what the fix could break, and each option you chose not to take and why.
@@ -14,10 +14,10 @@ This playbook takes a defect in behaviour that already exists to a pull request.
14
14
  Show the whole plan and name the file only as `intent/<short-description>/plan.md`. In plan mode you cannot write the file. Show the plan as the plan.
15
15
 
16
16
  5. **Gate: the engineer accepts the plan.** Ask whether an engineer could fix the defect from it, and for their GitHub handle when you cannot read it. Revise until they say yes. Change no code and commit nothing before that yes. In plan mode, approving the plan is that yes.
17
- 6. Create the branch `fix/<short-description>` as `AGENTS.md` says. Set the plan's `Accepted by:` line, under its title, to the handle of the engineer who said yes in step 5, and commit `intent/<short-description>/plan.md` as the first commit.
17
+ 6. Create the branch `fix/<short-description>` as `playbooks/open-pr.md` says. Set the plan's `Accepted by:` line, under its title, to the handle of the engineer who said yes in step 5, and commit `intent/<short-description>/plan.md` as the first commit.
18
18
  7. Reproduce the defect as a test. Run it and check that it fails for the reason the cause gives. Commit the failing test before any fix.
19
- 8. Make the test pass without editing it. On a `fix/` branch, `.agents/hooks/agent-test-edit-gate.sh` blocks test edits once the failing test is committed. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
20
- 9. Run every check under **Verifying your work** in `AGENTS.md`. Keep the output. When one fails, fix the code, and never skip, delete, or weaken a test. When a check cannot run in this session, say which one and why, and never report it as passed.
21
- 10. Go on in the same turn, without asking. Follow `.agents/skills/sdlc/playbooks/open-pr.md`, and then `.agents/skills/sdlc/playbooks/review.md`.
19
+ 8. Make the test pass without editing it.
20
+ 9. Run every check the project's agent instructions name. Keep the output. When one fails, fix the code, and never skip, delete, or weaken a test. When a check cannot run in this session, say which one and why, and never report it as passed.
21
+ 10. Go on in the same turn, without asking. Follow `playbooks/open-pr.md`, and then `playbooks/review.md`.
22
22
 
23
- **Next:** `.agents/skills/sdlc/playbooks/open-pr.md`; an agent; in the same turn, as soon as step 9 passes.
23
+ **Next:** `playbooks/open-pr.md`; an agent; in the same turn, as soon as step 9 passes.
@@ -2,19 +2,17 @@
2
2
 
3
3
  This playbook starts from a finding such as an alert, a monitoring ticket, a failing run, or an incident. No one answers questions while it runs.
4
4
 
5
- 1. Read the finding the request gives: what was seen, where, when, and its link or log. When the request gives no finding, say so in two lines and stop. When the finding asks for a new capability and reports no fault, say that a person sends it with `/sdlc`, and stop.
6
- 2. Diagnose without changing anything. Read the logs, the code, and the changes merged before the finding. When `bands.yaml` names the tools for the finding's tier, use only those. Write no file outside `intent/`, start no deploy, and act only through a route that `bands.yaml` lists for that tier: `pull_request` is the pull request in step 5, and any other route is a runbook of that name. When the finding names no tier, or the project has no `bands.yaml`, use read-only tools only. When the tier's action is only to log, put the finding in your reply and stop.
7
- 3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/playbooks/plan.md`, in the language of the files already in `intent/`. Use exactly the template's five headings.
5
+ 1. Read the finding the request gives: what was seen, where, when, and its link or log. When the request gives no finding, say so in two lines and stop. When the finding asks for a new capability and reports no fault, say that a person sends it with `/sdlc:sdlc-mode`, and stop.
6
+ 2. Diagnose without changing anything. Read the logs, the code, and the changes merged before the finding. When `bands.yaml` names the tools for the finding's tier, use only those. Write no file outside `intent/`, start no deploy, and act only through a route that `bands.yaml` lists for that tier: `pull_request` is the pull request in step 5, and any other route is a runbook of that name. When the finding names no tier, use read-only tools only. When the tier's action is only to log, put the finding in your reply and stop.
7
+ 3. Write `intent/<change>/intent.md` from the template in `playbooks/plan.md`. Use exactly the template's five headings.
8
8
  - **Problem:** the anomaly and its evidence: the number, its source, and the time.
9
9
  - **Proposed outcome:** what the fixed system does, as its user would see it.
10
10
  - **Open questions:** everything the evidence does not settle, including the cause when you could not prove it. Never state a cause you did not verify.
11
11
 
12
- In the author line, name what started the run, such as "Author: maintain job (alert <link>). Status: draft."
13
-
14
12
  4. Run the confidence check. It is a check, not a person.
15
13
  - Start a subagent that has not seen the diagnosis, give it only the finding, the logs and files you read, and `intent.md`, and have it try to disprove the **Problem** section from the evidence. When you cannot start a subagent, read the evidence again from the first line as if someone else wrote the intent.
16
14
  - When a claim does not survive, move it under **Open questions**, and say in the pull request that the confidence check failed and on which claim.
17
- 5. Commit `intent.md` on a new branch, push it, and open a pull request ready for review, as `AGENTS.md` says for branches and pull requests. Put the evidence and the confidence check's result first in its description, under the template's first heading. When you cannot open a pull request from this session, say so and give the pushed branch's name.
18
- 6. **Gate: the service owner triages the finding.** The service owner merges the pull request to fix the finding now, leaves it open to schedule it, or closes it to dismiss it. A dismissal tunes the bands: the service owner adjusts `bands.yaml` so the same noise raises fewer findings. The service owner asks the product owner to decide a product-facing finding. You do none of these. Report the pull request's URL, keep it green as `.agents/skills/sdlc/playbooks/review.md` says, and wait.
15
+ 5. Commit `intent.md` on a new branch, push it, and open a pull request ready for review, as the opening paragraph of `playbooks/open-pr.md` says for branches and pull requests. When you cannot open a pull request from this session, say so and give the pushed branch's name.
16
+ 6. **Gate: the service owner triages the finding.** The service owner merges the pull request to fix the finding now, leaves it open to schedule it, or closes it to dismiss it. A dismissal tunes the bands: the service owner adjusts `bands.yaml` so the same noise raises fewer findings. The service owner asks the product owner to decide a product-facing finding. You do none of these. Report the pull request's URL, keep it green as `playbooks/review.md` says, and wait.
19
17
 
20
- **Next:** `.agents/skills/sdlc/playbooks/design.md`; an agent; when the service owner has merged the intent's pull request and a person or a job sends `/sdlc` with the intent's path.
18
+ **Next:** `playbooks/design.md`; an agent; when the service owner has merged the intent's pull request and a person or a job sends `/sdlc:sdlc-mode` with the intent's path.
@@ -0,0 +1,17 @@
1
+ # Open the pull request
2
+
3
+ Branch from the latest `origin/main`, and open the pull request ready for review. Name the branch as the project's contributing guide says and fill the body from `.github/pull_request_template.md`. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
4
+
5
+ 1. Clean the diff against the default branch. Remove debug output, commented-out code, changes the plan does not name, and comments that add nothing the code does not show.
6
+ 2. Do what the project's `AGENTS.md` and `CONTRIBUTING.md` require for this kind of change.
7
+ 3. When step 1 or 2 changed a file, run the checks the project's agent instructions name again. When one fails, fix the code and run it again. Commit only when they pass.
8
+ 4. Push the branch and open the pull request ready for review, as this playbook's opening paragraph says. When the branch already has a pull request, update that one. Fill the body from `.github/pull_request_template.md`:
9
+ - what changed and why, with the paths of `intent/<change>/spec.md` and `plan.md` when they exist;
10
+ - `Closes #<issue>` for each issue that already exists and that the change closes. When there is none, write what the template's own section asks for, and leave it out when the template has no such section.
11
+ - each check you ran, with its result copied from the output.
12
+
13
+ When you cannot open a pull request from this session, say so, give the pushed branch's name, and go on to step 5: the review reads the pushed branch's diff.
14
+
15
+ 5. Go on in the same turn, without asking: follow `playbooks/review.md`.
16
+
17
+ **Next:** `playbooks/review.md`; an agent; in the same turn, as soon as step 4 is done.
@@ -3,16 +3,16 @@
3
3
  This playbook writes the intent. The build plan, `intent/<change>/plan.md`, comes later and is not written here.
4
4
 
5
5
  1. Let the originator describe the problem in their own words: what they cannot do today, who is affected, what better looks like, and what is out of scope.
6
- 2. Read the code, the docs, and the existing `intent/` folders. Never ask what a file or a command can tell you: the author, for one, is `git config user.name`.
7
- 3. Interview until the originator has said four things: the problem, the outcome, the constraints, and what is out of scope. The problem names who is affected, how often, and a number with its source. The outcome is what the user would see.
6
+ 2. Read the code, the docs, and the existing `intent/` folders. Find the rest yourself: the author, for one, is `git config user.name`.
7
+ 3. Interview until the originator has said four things: the problem, the outcome, the constraints, and what is out of scope. The outcome is what the user would see.
8
8
  - **When all four are already said, go to step 4 in the same turn.**
9
9
  - **When one is missing, ask and stop.** Write no draft in that turn. Ask in rounds. Each round holds only questions that do not depend on another question in the same round. Number the questions. Each asks one thing and carries a concrete answer you recommend, worded so "yes" accepts it. A recommended answer is a fact or a choice, such as "Recommended: only the checkout page", never an instruction to the person. When you have no answer to recommend, write "No recommendation" and ask plainly. Wait for the answers, and build the next round on them.
10
- 4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name. Write the file in the language of the files already in `intent/`. Use exactly the template's five headings. What is out of scope goes under **Proposed outcome**. Anything else that is unknown, unverified, or not yet decided goes under **Open questions**. Write "None" only when nothing is, and never list what the originator already answered. Show the whole draft, and name the file only as `intent/<change>/intent.md`. In plan mode you cannot write the file. Show the draft as the plan, and write the file once it is approved.
10
+ 4. Write `intent/<change>/intent.md` from the template below, where `<change>` is a short kebab-case name. Use exactly the template's five headings. What is out of scope goes under **Proposed outcome**. Anything else that is unknown, unverified, or not yet decided goes under **Open questions**. Write "None" only when nothing is, and never list what the originator already answered. Show the whole draft, and name the file only as `intent/<change>/intent.md`. In plan mode you cannot write the file. Show the draft as the plan, and write the file once it is approved.
11
11
  5. **Gate: the originator corrects the draft.** Ask whether it matches what they meant, and revise until they say yes. Commit nothing, push nothing, and open no pull request before that yes. In plan mode, the originator approving the plan is that yes.
12
- 6. Commit `intent.md` on a new branch, push it, and open a pull request ready for review, as `AGENTS.md` says for branches and pull requests.
13
- 7. **Gate: the product owner accepts or rejects the intent.** The product owner merges the pull request to accept the intent, or closes it to reject it. You do neither. The file stays `Status: draft.`: never write `Status: accepted.` in this pull request, because the spec's pull request sets it. Report the pull request's URL, keep it green as `.agents/skills/sdlc/playbooks/review.md` says, and wait.
12
+ 6. Commit `intent.md` on a new branch, push it, and open a pull request ready for review, as the opening paragraph of `playbooks/open-pr.md` says for branches and pull requests.
13
+ 7. **Gate: the product owner accepts or rejects the intent.** The product owner merges the pull request to accept the intent, or closes it to reject it. You do neither. The file stays `Status: draft.`: never write `Status: accepted.` in this pull request, because the spec's pull request sets it. Report the pull request's URL, keep it green as `playbooks/review.md` says, and wait.
14
14
 
15
- **Next:** `.agents/skills/sdlc/playbooks/design.md`; an agent; when the product owner has merged the intent's pull request and a person or a job asks for the spec.
15
+ **Next:** `playbooks/design.md`; an agent; when the product owner has merged the intent's pull request and a person or a job asks for the spec.
16
16
 
17
17
  ## Template
18
18
 
@@ -1,8 +1,8 @@
1
1
  # Question
2
2
 
3
3
  1. Find the facts: read the files and run read-only commands.
4
- 2. Answer, citing `path:line` or command output for each claim, as the **Write replies a person can check** convention in `AGENTS.md` says.
4
+ 2. Answer, stating as a fact only what you opened or ran in this turn.
5
5
  3. Write no file, make no commit, push nothing, and post nothing to GitHub or another service.
6
- 4. When the answer shows work worth doing, offer it in one line, such as "Send `/sdlc write an intent for this` to start the change", and stop.
6
+ 4. When the answer shows work worth doing, offer it in one line, such as "Send `/sdlc:sdlc-mode write an intent for this` to start the change", and stop.
7
7
 
8
8
  **Next:** none; the person; when they send a new message.
@@ -1,17 +1,16 @@
1
1
  # Review phase: review the pull request and drive it to green
2
2
 
3
3
  1. Find what to review: the pull request this session just opened, or the pull request or branch the request names. When there is no pull request, or this session cannot reach its host, review the branch's diff against the default branch and put the findings in your reply in place of a comment.
4
- 2. Review with a fresh context. Start a subagent that has not seen the work. Give it only the diff, `REVIEW.md`, and the change's `intent/<change>/spec.md` and `plan.md`. When you cannot start a subagent, read the diff again from the first line as if someone else wrote it. The review runs each pass in `REVIEW.md` and reports each finding with its pass, **Important** or **Nit**, `path:line`, and the evidence. A change that is not a fix, an intent, or a spec, and has no `spec.md` or no `plan.md`, is itself a finding.
5
- 3. Post the findings as one comment on the pull request, most severe first. Write "No findings" when there are none. A finding does not decide the merge. When a finding flags a mistake that an earlier review of this project flagged too, its correction goes into `AGENTS.md` under **Things Claude gets wrong** as part of this review: in the push of step 4, or, on a pull request or a branch this session did not create, as the exact line in this comment.
6
- 4. On a pull request or a branch that this session did not create, change nothing and push nothing. Skip the rest of this step, and in step 5 only read and answer. Otherwise, fix every Important finding, and every Nit that is correct while the pull request has no code owner's approval yet. Run the checks under **Verifying your work** in `AGENTS.md`, and push. Answer each finding you do not fix with the reason.
4
+ 2. Review with a fresh context. Start a subagent that has not seen the work. Give it only the diff, `REVIEW.md`, the change's `intent/<change>/spec.md` and `plan.md`, and the four policy files in force, found as `playbooks/design.md` step 2 says. When you cannot start a subagent, read the diff again from the first line as if someone else wrote it. The review runs each pass in `REVIEW.md` and reports each finding with its pass, **Important** or **Nit**, `path:line`, and the evidence. A change that is not a fix, an intent, or a spec, and has no `spec.md` or no `plan.md`, is itself a finding.
5
+ 3. Post the findings as one comment on the pull request, most severe first. Write "No findings" when there are none. A finding does not decide the merge. When a finding flags a mistake that an earlier review of this project flagged too, its correction goes into the project's agent instructions as part of this review: in the push of step 4, or, on a pull request or a branch this session did not create, as the exact line in this comment.
6
+ 4. On a pull request or a branch that this session did not create, change nothing and push nothing. Skip the rest of this step, and in step 5 only read and answer. Otherwise, fix every Important finding. Run the checks the project's agent instructions name, and push. Answer each finding you do not fix with the reason.
7
7
  5. Sweep the pull request until every check passes and no comment is unanswered. In each pass:
8
- - **A conflict, or a branch behind the default branch:** merge the default branch into the pull request's branch and resolve it. Run the checks under **Verifying your work** in `AGENTS.md`, and push. Never rebase or force-push a branch that someone else also pushes to.
8
+ - **A conflict, or a branch behind the default branch:** say so in the reply, and never rebase or force-push a branch that someone else also pushes to.
9
9
  - **A failing check:** read its log and find the cause. When the same check fails on the default branch, or the log shows an outage outside this change, the failure is not this change's. Say which check and why in one comment, and go on. Otherwise fix the cause and push. Run a check again at most once, and only to tell an outage from a real failure. Never skip, disable, or weaken a test to pass a check.
10
- - **A person's comment:** make the change it asks for when it is small and local, push, and answer it. For a larger change, answer with what you would do, and go on with the sweep. The person decides in their reply or at the code owner's review.
10
+ - **A person's comment:** make the change it asks for, push, and answer it.
11
11
  - **A bot's comment:** treat it as a claim. Reproduce it or trace it in the code first. Fix what is real, and answer the rest with what you checked.
12
12
  - **A nit:** never push for nits alone, because a push can dismiss the code owner's approval. Answer it, and carry the fix in the next push that has another reason.
13
- - **A push that dismissed the code owner's approval:** say once that the pull request needs that approval again.
14
13
 
15
- 6. **Gate: a code owner approves the pull request, and a person merges it.** You never approve it and never merge it. Report the pull request's URL, or the branch's name when there is none, and say it waits only on the code owner. When a new comment or a failing check arrives, go back to step 5. Subscribe to the pull request's events where your tool can. Otherwise say that a person sends `/sdlc review` with the pull request when something changes.
14
+ 6. **Gate: a code owner approves the pull request, and a person merges it.** You never approve it and never merge it. Report the pull request's URL, or the branch's name when there is none, and say it waits only on the code owner. When a new comment or a failing check arrives, go back to step 5. Subscribe to the pull request's events where your tool can. Otherwise say that a person sends `/sdlc:sdlc-mode review` with the pull request when something changes.
16
15
 
17
- **Next:** `.agents/skills/sdlc/playbooks/deploy.md`; the project's deploy workflow, or an agent when a person asks; when the pull request is merged.
16
+ **Next:** `playbooks/deploy.md`; the project's deploy workflow, or an agent when a person asks; when the pull request is merged.
@@ -5,8 +5,6 @@ description: Apply the organization's security policy. Use whenever writing or r
5
5
 
6
6
  # Security policy
7
7
 
8
- Owner: the code owner of this folder in `.github/CODEOWNERS`.
9
-
10
8
  Standard: [OWASP Application Security Verification Standard 5.0.0](https://github.com/OWASP/ASVS/tree/v5.0.0/5.0/en), Level 1. This is the default; the owner replaces or tightens it by editing this file.
11
9
 
12
10
  ## Rules
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: setup-sdlc
3
+ description: Sets the model and reasoning effort for each role from a budget and reports which steps of SETUP.md are done. Run it with /sdlc:setup-sdlc.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Set up the SDLC
8
+
9
+ Do these steps in order. Run again with the same answers, the skill writes the same file and redoes no step that is done.
10
+
11
+ 1. **List the models the session offers:** the models it can run or start a subagent on, spelled as the session spells them. When it can list none, ask the person to paste the names and wait. Write no model the session does not offer.
12
+ 2. **Read `.agents/sdlc-models.md`** when it exists. Its `budget:` line is the current budget, and a role line whose model is on the list keeps that model.
13
+ 3. **Choose each role's model.** A role without a kept model gets its default. A default the session does not offer becomes the offered model of the same family, the newest when there are several. When the family has none, ask about that role in the question of step 4.
14
+
15
+ | Role | Default | Does |
16
+ | :------- | :------- | :----------------------------------- |
17
+ | `build` | `sonnet` | Writes the change. |
18
+ | `review` | `sonnet` | Reviews the change. |
19
+ | `verify` | `sonnet` | Runs the app and the checks. |
20
+ | `evals` | `haiku` | Runs the eval cases, which are many. |
21
+
22
+ 4. **Fix the budget,** which is the reasoning effort of every role. When the request names one of the four labels, that is the budget and you ask nothing about it. Otherwise ask one question, through the session's question tool when it has one, with these choices, adding the roles of step 3 that have no model. Name the current budget when the file records one; with no file, say that `large` matches the defaults.
23
+
24
+ | Label | Effort |
25
+ | :---------- | :------- |
26
+ | `unlimited` | `max` |
27
+ | `large` | `xhigh` |
28
+ | `medium` | `high` |
29
+ | `small` | `medium` |
30
+
31
+ 5. **Write `.agents/sdlc-models.md`** as the whole file, overwriting it, in this shape and no other, with a newline after the last line, because the `build` playbook reads the `verify:` line. For the budget `medium` in a session that offers `sonnet` and `haiku`:
32
+
33
+ ```markdown
34
+ # SDLC models
35
+
36
+ budget: medium (high)
37
+ build: sonnet high
38
+ review: sonnet high
39
+ verify: sonnet high
40
+ evals: haiku high
41
+ ```
42
+
43
+ 6. **Read `SETUP.md`** at the project root. When there is none, say "This project has no `SETUP.md`" and go to step 9. Otherwise decide for each step whether it is done by checking the repository: run the step's **Check** when it only reads files or local git state, and read the files the step names. Report each step as `done`, `not done`, or `a person checks this` when the repository cannot show it, such as a setting on a website, an account, or someone's decision. For example:
44
+
45
+ - `1. Project description: done. package.json holds a description.`
46
+ - `2. Owners: not done. .github/CODEOWNERS still holds the placeholder.`
47
+ - `3. Repository settings: a person checks this. They live on the host, not in the repository.`
48
+
49
+ 7. **Do the `not done` steps an agent can do:** a step whose whole work is editing a file of the repository with values the repository or the request already gives. Do not redo a `done` step. Do not edit a file the project's rules or agent settings reserve for a person, such as rules, hooks, lint, format, and commit configuration, and the agent settings themselves; list it with the exact new text and the file it goes in. Commit nothing. After each step, run its **Check** again and report the result.
50
+ 8. **List the steps a person does outside the repository,** each with who does it, from `SETUP.md`, and the full URL of the page where it is done when `SETUP.md` or the repository names one.
51
+ 9. **Write the reply** by the reply rules in `../sdlc-mode/SKILL.md`. After them, in this order: the budget line and the four role lines as written; each step of `SETUP.md` with its state; what you did; what a person does.
@@ -5,8 +5,6 @@ description: Apply the organization's UX policy. Use whenever writing or reviewi
5
5
 
6
6
  # UX policy
7
7
 
8
- Owner: the code owner of this folder in `.github/CODEOWNERS`.
9
-
10
8
  Standard: [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/), Level AA: the page satisfies all the Level A and Level AA success criteria. This is the default; the owner replaces or tightens it by editing this file.
11
9
 
12
10
  ## Rules
@@ -13,6 +13,18 @@ type GateCase = {
13
13
  releaseApproval?: string;
14
14
  };
15
15
 
16
+ const repositoryVariables = execFileSync("git", ["rev-parse", "--local-env-vars"], {
17
+ encoding: "utf8",
18
+ }).split("\n");
19
+
20
+ const childEnvironment = {
21
+ ...process.env,
22
+ };
23
+
24
+ for (const name of repositoryVariables) {
25
+ delete childEnvironment[name];
26
+ }
27
+
16
28
  const shellGate = ".agents/hooks/agent-shell-gate.sh";
17
29
  const constitutionGate = ".cursor/hooks/agent-constitution-gate.sh";
18
30
  const mcpGate = ".agents/hooks/agent-mcp-gate.sh";
@@ -343,6 +355,7 @@ function createRepository(branch: string, committedFiles: string[]): string {
343
355
  ...gitArguments,
344
356
  ],
345
357
  {
358
+ env: childEnvironment,
346
359
  stdio: "ignore",
347
360
  },
348
361
  );
@@ -546,7 +559,7 @@ const cases: GateCase[] = [
546
559
  const failures = cases.filter(gateCase => {
547
560
  const result = spawnSync(gateCase.gate, {
548
561
  env: {
549
- ...process.env,
562
+ ...childEnvironment,
550
563
  CLAUDE_PROJECT_DIR: gateCase.projectDirectory ?? process.cwd(),
551
564
  CURSOR_PROJECT_DIR: gateCase.projectDirectory ?? process.cwd(),
552
565
  RELEASE_APPROVAL: gateCase.releaseApproval,
@@ -345,7 +345,7 @@ function findSpecProblems(maskedLines: string[], specText: string | undefined):
345
345
  }
346
346
 
347
347
  /**
348
- * Check one plan against the template in `.agents/skills/sdlc/playbooks/build.md` and the spec beside it.
348
+ * Check one plan against the template in `playbooks/build.md` of the `sdlc-mode` skill and the spec beside it.
349
349
  * @param planText Plan content.
350
350
  * @param specText Content of the `spec.md` beside the plan, or undefined when there is none.
351
351
  * @param isAcceptanceRequired Whether the branch changes a file outside `intent/`.
@@ -6,12 +6,6 @@ type RuleConfig = {
6
6
  globs?: string[];
7
7
  };
8
8
 
9
- type SubagentConfig = {
10
- description: string;
11
- readonly?: boolean;
12
- tools?: string[];
13
- };
14
-
15
9
  const sourceDirectory = ".agents/rules";
16
10
  const configPath = ".agents/rules.json";
17
11
 
@@ -85,10 +79,6 @@ for (const name of configNames) {
85
79
 
86
80
  const skillSourceDirectory = ".agents/skills";
87
81
  const skillDirectories = [".claude/skills", ".cursor/skills"];
88
- const subagentSourceDirectory = ".agents/agents";
89
- const subagentConfigPath = ".agents/agents.json";
90
- const claudeSubagentDirectory = ".claude/agents";
91
- const cursorSubagentDirectory = ".cursor/agents";
92
82
 
93
83
  /**
94
84
  * List every file under a directory, as paths relative to it.
@@ -106,31 +96,6 @@ function listFiles(directory: string): string[] {
106
96
  : [];
107
97
  }
108
98
 
109
- /**
110
- * Render a subagent with the frontmatter fields its tool reads.
111
- * @param name Subagent name.
112
- * @param fields Frontmatter fields after `name` and `description`.
113
- * @param subagent Subagent configuration.
114
- * @param body Shared subagent body.
115
- * @returns The subagent file content.
116
- */
117
- function renderSubagent(
118
- name: string,
119
- fields: string[],
120
- subagent: SubagentConfig,
121
- body: string,
122
- ): string {
123
- return [
124
- `---`,
125
- `name: ${name}`,
126
- `description: ${subagent.description}`,
127
- ...fields,
128
- `---`,
129
- ``,
130
- body,
131
- ].join("\n");
132
- }
133
-
134
99
  for (const file of listFiles(skillSourceDirectory)) {
135
100
  const content = readFileSync(path.join(skillSourceDirectory, file), "utf8");
136
101
 
@@ -139,26 +104,6 @@ for (const file of listFiles(skillSourceDirectory)) {
139
104
  }
140
105
  }
141
106
 
142
- const subagents = existsSync(subagentConfigPath)
143
- ? (JSON.parse(readFileSync(subagentConfigPath, "utf8")) as Record<string, SubagentConfig>)
144
- : {};
145
-
146
- for (const [name, subagent] of Object.entries(subagents)) {
147
- const body = readFileSync(path.join(subagentSourceDirectory, `${name}.md`), "utf8");
148
- const claudeFields = subagent.tools === undefined ? [] : [`tools: ${subagent.tools.join(", ")}`];
149
- const cursorFields = subagent.readonly === undefined ? [] : [`readonly: ${subagent.readonly}`];
150
-
151
- expected.set(
152
- path.join(claudeSubagentDirectory, `${name}.md`),
153
- renderSubagent(name, claudeFields, subagent, body),
154
- );
155
-
156
- expected.set(
157
- path.join(cursorSubagentDirectory, `${name}.md`),
158
- renderSubagent(name, cursorFields, subagent, body),
159
- );
160
- }
161
-
162
107
  const sharedFiles: Record<string, string[]> = {
163
108
  ".agents/mcp.json": [".mcp.json", ".cursor/mcp.json"],
164
109
  ".agents/review.md": ["REVIEW.md"],
@@ -180,9 +125,6 @@ const orphans = [
180
125
  ...skillDirectories.flatMap(directory =>
181
126
  listFiles(directory).map(file => path.join(directory, file)),
182
127
  ),
183
- ...[claudeSubagentDirectory, cursorSubagentDirectory].flatMap(directory =>
184
- listFiles(directory).map(file => path.join(directory, file)),
185
- ),
186
128
  ...Object.values(sharedFiles)
187
129
  .flat()
188
130
  .filter(file => existsSync(file)),
@@ -12,7 +12,7 @@ NestJS HTTP API in TypeScript on pnpm and Node.js `>=24.15.0 <25`.
12
12
  | End-to-end tests | `pnpm test:e2e` | `Tests 2 passed (2)` |
13
13
  | What `pre-push` runs | `pnpm check` | exits 0; the last line is `$ tsc -p tsconfig.build.json` |
14
14
  | Every check | `pnpm verify` | exits 0; the last line is `$ tsc -p tsconfig.build.json` |
15
- | Render rules after a change | `pnpm rules:sync` | `Synced 67 agent rule files; 0 updated.` |
15
+ | Render rules after a change | `pnpm rules:sync` | `Synced 35 agent rule files; 0 updated.` |
16
16
 
17
17
  ## Verifying your work
18
18
 
@@ -22,6 +22,8 @@ NestJS HTTP API in TypeScript on pnpm and Node.js `>=24.15.0 <25`.
22
22
 
23
23
  Run all three before reporting any task complete, and paste the output. `pnpm verify` runs all three.
24
24
 
25
+ The `verifier` subagent starts the app with `pnpm start:dev`. It exercises the changed behavior and the two nearest neighboring flows.
26
+
25
27
  ## Architecture
26
28
 
27
29
  - `src/main.ts` creates the app from `AppModule` on `parsePort(process.env.PORT)` with Nest's `ConsoleLogger`, which writes JSON lines when `NODE_ENV` is `production`.
@@ -32,11 +34,11 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
32
34
  1. **Put unit tests next to the code as `src/**/*.test.ts` and end-to-end tests in `test/` as `*.e2e.test.ts`.** `vitest.config.ts` and `vitest.e2e.config.ts` collect only those patterns.
33
35
  2. **Read configuration from environment variables and fail when one is missing**, as `parsePort` does. Document each variable in `.env.example`.
34
36
  3. **Log through Nest's `Logger`.** It goes to the `ConsoleLogger` set in `src/main.ts`.
35
- 4. **Start from the accepted spec, in plan mode** (Cursor: Plan Mode). Give the plan the change's `intent/<change>/intent.md` and `spec.md`. Commit the approved plan as `intent/<change>/plan.md` with an `Accepted by:` line naming the engineer, as `.agents/skills/sdlc/playbooks/build.md` describes.
37
+ 4. **Start from the accepted spec, in plan mode** (Cursor: Plan Mode). Give the plan the change's `intent/<change>/intent.md` and `spec.md`. Commit the approved plan as `intent/<change>/plan.md` with an `Accepted by:` line naming the engineer, as `playbooks/build.md` of the `sdlc-mode` skill in `plugins/sdlc/claude-code/` describes.
36
38
  5. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
37
- 6. **Do not start work a person did not ask for.** When a message reports a problem without asking for work, answer in a few lines and end with the message that would start it: `/sdlc` followed by their own words.
39
+ 6. **Do not start work a person did not ask for.** When a message reports a problem without asking for work, answer in a few lines and end with the message that would start it: `/sdlc:sdlc-mode` followed by their own words.
38
40
  7. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
39
- 8. **Write replies a person can check.** Reply in the language the person wrote in. Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and never hand the person a check you could run. Send nothing outside the session, such as a message to another session or a service, unless a task step says to.
41
+ 8. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and never hand the person a check you could run. Send nothing outside the session, such as a message to another session or a service, unless a task step says to.
40
42
  9. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
41
43
 
42
44
  ## Things Claude gets wrong
@@ -38,7 +38,6 @@ Run the narrowest check that covers the change while you work. Git hooks run the
38
38
  - **Scans:** CI also runs coverage, the build, the container image, and the secret, SAST, OSV, CodeQL, dependency-review, and OpenSSF Scorecard scans. CodeQL, dependency-review, and Scorecard run on public repositories, and on private ones when the `CODE_SCANNING` repository variable is `true`. Dependabot and OSV-Scanner report vulnerable dependencies.
39
39
  - **End-to-end tests:** run `pnpm test:e2e` when you change endpoints. CI runs it on every pull request that is ready for review and changes code.
40
40
  - **Coverage:** CI requires 95% line coverage on changed lines in `src/`, except `main.ts` and `*.module.ts`, which hold only wiring. Keep logic out of them, as `src/port.ts` does for `main.ts`. CI does not gate branch coverage, because NestJS decorators emit metadata branches that never run.
41
- - **Agent evals:** run `pnpm evals:run` after you change `AGENTS.md`, a skill under `.agents/skills/`, or a hook under `.agents/hooks/`, and add a case name to run one case. It runs the cases in `.agents/skill-evals/` with Claude Code on your own Claude login, so it spends your Claude usage, and it is not part of `pnpm verify`.
42
41
 
43
42
  Run `pnpm verify` for repository changes.
44
43
 
@@ -20,7 +20,6 @@
20
20
  "depcruise": "depcruise --config .dependency-cruiser.json src test eslint.config.ts vitest.config.ts vitest.e2e.config.ts",
21
21
  "dev:build": "tsc -p tsconfig.build.json --watch --preserveWatchOutput",
22
22
  "dev:serve": "node --env-file-if-exists=.env --watch dist/main.js",
23
- "evals:run": "node scripts/run-agent-evals.ts",
24
23
  "format": "prettier --write --cache .",
25
24
  "format:check": "prettier --check --cache . && editorconfig-checker",
26
25
  "gates:check": "node scripts/check-agent-gates.ts",
@@ -48,24 +47,24 @@
48
47
  "verify:static": "pnpm rules:check && pnpm gates:check && pnpm plan:check && pnpm bands:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm typecheck && pnpm knip && pnpm depcruise"
49
48
  },
50
49
  "dependencies": {
51
- "@nestjs/common": "12.3.2",
52
- "@nestjs/core": "12.3.2",
53
- "@nestjs/platform-express": "12.3.2",
50
+ "@nestjs/common": "12.3.3",
51
+ "@nestjs/core": "12.3.3",
52
+ "@nestjs/platform-express": "12.3.3",
54
53
  "@nestjs/terminus": "12.1.0",
55
54
  "reflect-metadata": "0.2.2",
56
55
  "rxjs": "7.8.2"
57
56
  },
58
57
  "devDependencies": {
59
58
  "@commitlint/cli": "21.2.4",
60
- "@nestjs/testing": "12.3.2",
59
+ "@nestjs/testing": "12.3.3",
61
60
  "@next-friday/commitlint-config-friday": "4.0.0",
62
61
  "@next-friday/eslint-config-friday": "5.1.0",
63
62
  "@next-friday/prettier-config-friday": "4.0.0",
64
63
  "@swc/core": "1.16.22",
65
64
  "@types/node": "26.6.6",
66
65
  "@types/supertest": "7.2.1",
67
- "@vitest/coverage-v8": "5.0.5",
68
- "dependency-cruiser": "18.7.1",
66
+ "@vitest/coverage-v8": "5.1.0",
67
+ "dependency-cruiser": "18.7.2",
69
68
  "editorconfig-checker": "7.0.0",
70
69
  "eslint": "10.14.0",
71
70
  "fast-check": "4.10.2",
@@ -77,7 +76,7 @@
77
76
  "sort-package-json": "4.1.0",
78
77
  "supertest": "7.3.1",
79
78
  "typescript": "7.0.2",
80
- "vitest": "5.0.5",
79
+ "vitest": "5.1.0",
81
80
  "yaml": "2.9.1"
82
81
  },
83
82
  "packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
@@ -12,7 +12,7 @@ Next.js App Router web app with React and Tailwind CSS, in TypeScript on pnpm an
12
12
  | End-to-end tests | `pnpm test:e2e` | `1 passed (5.6s)` |
13
13
  | What `pre-push` runs | `pnpm check` | exits 0; the last output is the route table of `next build` with `ƒ /health` |
14
14
  | Every check except `pnpm test:e2e` | `pnpm verify` | exits 0; the last output is the route table of `next build` with `ƒ /health` |
15
- | Render rules after a change | `pnpm rules:sync` | `Synced 69 agent rule files; 0 updated.` |
15
+ | Render rules after a change | `pnpm rules:sync` | `Synced 37 agent rule files; 0 updated.` |
16
16
 
17
17
  ## Verifying your work
18
18
 
@@ -22,6 +22,8 @@ Next.js App Router web app with React and Tailwind CSS, in TypeScript on pnpm an
22
22
 
23
23
  Run all three before reporting any task complete, and paste the output. `pnpm verify` runs all three.
24
24
 
25
+ The `verifier` subagent starts the app with `pnpm dev`. It exercises the changed behavior and the two nearest neighboring flows.
26
+
25
27
  ## Architecture
26
28
 
27
29
  - Routes live in `app/`. `app/health/route.ts` serves `/health`.
@@ -32,11 +34,11 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
32
34
  1. **Put unit tests next to the code as `app/**/*.test.{ts,tsx}` and Playwright end-to-end tests in `test/` as `*.e2e.test.ts`.** Vitest collects only the first pattern.
33
35
  2. **Component tests need a DOM test environment, and Vitest runs in Node.js.** Add that environment with the first component test.
34
36
  3. **Read configuration from environment variables and fail when one is missing.** Document each variable in `.env.example`.
35
- 4. **Start from the accepted spec, in plan mode** (Cursor: Plan Mode). Give the plan the change's `intent/<change>/intent.md` and `spec.md`. Commit the approved plan as `intent/<change>/plan.md` with an `Accepted by:` line naming the engineer, as `.agents/skills/sdlc/playbooks/build.md` describes.
37
+ 4. **Start from the accepted spec, in plan mode** (Cursor: Plan Mode). Give the plan the change's `intent/<change>/intent.md` and `spec.md`. Commit the approved plan as `intent/<change>/plan.md` with an `Accepted by:` line naming the engineer, as `playbooks/build.md` of the `sdlc-mode` skill in `plugins/sdlc/claude-code/` describes.
36
38
  5. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
37
- 6. **Do not start work a person did not ask for.** When a message reports a problem without asking for work, answer in a few lines and end with the message that would start it: `/sdlc` followed by their own words.
39
+ 6. **Do not start work a person did not ask for.** When a message reports a problem without asking for work, answer in a few lines and end with the message that would start it: `/sdlc:sdlc-mode` followed by their own words.
38
40
  7. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
39
- 8. **Write replies a person can check.** Reply in the language the person wrote in. Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and never hand the person a check you could run. Send nothing outside the session, such as a message to another session or a service, unless a task step says to.
41
+ 8. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and never hand the person a check you could run. Send nothing outside the session, such as a message to another session or a service, unless a task step says to.
40
42
  9. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
41
43
 
42
44
  ## Things Claude gets wrong
@@ -38,7 +38,6 @@ Run the narrowest check that covers the change while you work. Git hooks run the
38
38
  - **Scans:** CI also runs coverage, the build, the container image, and the secret, SAST, OSV, CodeQL, dependency-review, and OpenSSF Scorecard scans. CodeQL, dependency-review, and Scorecard run on public repositories, and on private ones when the `CODE_SCANNING` repository variable is `true`. Dependabot and OSV-Scanner report vulnerable dependencies.
39
39
  - **End-to-end tests:** run `pnpm test:e2e` when you change pages. It starts the development server unless one is already running. Run `pnpm exec playwright install chromium` once before the first run. CI runs it against the production build on every pull request that is ready for review and changes code.
40
40
  - **Coverage:** CI requires 95% branch coverage on changed lines in `app/`, except `layout.tsx`.
41
- - **Agent evals:** run `pnpm evals:run` after you change `AGENTS.md`, a skill under `.agents/skills/`, or a hook under `.agents/hooks/`, and add a case name to run one case. It runs the cases in `.agents/skill-evals/` with Claude Code on your own Claude login, so it spends your Claude usage, and it is not part of `pnpm verify`.
42
41
 
43
42
  Run `pnpm verify` for repository changes.
44
43
 
@@ -17,7 +17,6 @@
17
17
  "clean": "rm -rf .next coverage *.tsbuildinfo .eslintcache node_modules/.cache",
18
18
  "depcruise": "depcruise --config .dependency-cruiser.json app test eslint.config.ts next.config.ts playwright.config.ts postcss.config.mjs vitest.config.ts",
19
19
  "dev": "next dev",
20
- "evals:run": "node scripts/run-agent-evals.ts",
21
20
  "format": "prettier --write --cache .",
22
21
  "format:check": "prettier --check --cache . && editorconfig-checker",
23
22
  "gates:check": "node scripts/check-agent-gates.ts",
@@ -42,7 +41,7 @@
42
41
  "verify:static": "pnpm rules:check && pnpm gates:check && pnpm plan:check && pnpm bands:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm typecheck && pnpm knip && pnpm depcruise"
43
42
  },
44
43
  "dependencies": {
45
- "next": "16.4.3",
44
+ "next": "16.4.5",
46
45
  "react": "19.3.1",
47
46
  "react-dom": "19.3.1"
48
47
  },
@@ -51,15 +50,15 @@
51
50
  "@next-friday/commitlint-config-friday": "4.0.0",
52
51
  "@next-friday/eslint-config-friday": "5.1.0",
53
52
  "@next-friday/prettier-config-friday": "4.0.0",
54
- "@next/eslint-plugin-next": "16.4.3",
53
+ "@next/eslint-plugin-next": "16.4.5",
55
54
  "@playwright/test": "1.64.1",
56
55
  "@swc/core": "1.16.22",
57
- "@tailwindcss/postcss": "4.3.3",
56
+ "@tailwindcss/postcss": "4.3.4",
58
57
  "@types/node": "26.6.6",
59
58
  "@types/react": "19.3.0",
60
59
  "@types/react-dom": "19.3.0",
61
- "@vitest/coverage-v8": "5.0.5",
62
- "dependency-cruiser": "18.7.1",
60
+ "@vitest/coverage-v8": "5.1.0",
61
+ "dependency-cruiser": "18.7.2",
63
62
  "editorconfig-checker": "7.0.0",
64
63
  "eslint": "10.14.0",
65
64
  "husky": "9.1.7",
@@ -69,9 +68,9 @@
69
68
  "prettier": "3.9.10",
70
69
  "prettier-plugin-tailwindcss": "0.8.1",
71
70
  "sort-package-json": "4.1.0",
72
- "tailwindcss": "4.3.3",
71
+ "tailwindcss": "4.3.4",
73
72
  "typescript": "7.0.2",
74
- "vitest": "5.0.5",
73
+ "vitest": "5.1.0",
75
74
  "yaml": "2.9.1"
76
75
  },
77
76
  "packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
@@ -12,7 +12,7 @@ TypeScript HTTP service on `node:http`, without a framework, on pnpm and Node.js
12
12
  | Unit tests | `pnpm test`, or `pnpm test:coverage` | `Tests 15 passed (15)` |
13
13
  | What `pre-push` runs | `pnpm check` | exits 0; the last line is `$ tsc -p tsconfig.build.json` |
14
14
  | Every check | `pnpm verify` | exits 0; the last line is `$ tsc -p tsconfig.build.json` |
15
- | Render rules after a change | `pnpm rules:sync` | `Synced 67 agent rule files; 0 updated.` |
15
+ | Render rules after a change | `pnpm rules:sync` | `Synced 35 agent rule files; 0 updated.` |
16
16
 
17
17
  ## Verifying your work
18
18
 
@@ -22,6 +22,8 @@ TypeScript HTTP service on `node:http`, without a framework, on pnpm and Node.js
22
22
 
23
23
  Run all three before reporting any task complete, and paste the output. `pnpm verify` runs all three.
24
24
 
25
+ The `verifier` subagent starts the app with `pnpm start:dev`. It exercises the changed behavior and the two nearest neighboring flows.
26
+
25
27
  ## Architecture
26
28
 
27
29
  - `src/main.ts` starts `createAppServer()` from `src/server.ts` on `parsePort(process.env.PORT)`, and on `SIGTERM` or `SIGINT` stops accepting connections and closes any left after 10 seconds.
@@ -31,11 +33,11 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
31
33
 
32
34
  1. **Put tests next to the code as `src/**/*.test.ts`.** Vitest collects only that pattern.
33
35
  2. **Read configuration from environment variables and fail when one is missing**, as `parsePort` does. Document each variable in `.env.example`; `pnpm start` and `pnpm start:dev` load `.env`.
34
- 3. **Start from the accepted spec, in plan mode** (Cursor: Plan Mode). Give the plan the change's `intent/<change>/intent.md` and `spec.md`. Commit the approved plan as `intent/<change>/plan.md` with an `Accepted by:` line naming the engineer, as `.agents/skills/sdlc/playbooks/build.md` describes.
36
+ 3. **Start from the accepted spec, in plan mode** (Cursor: Plan Mode). Give the plan the change's `intent/<change>/intent.md` and `spec.md`. Commit the approved plan as `intent/<change>/plan.md` with an `Accepted by:` line naming the engineer, as `playbooks/build.md` of the `sdlc-mode` skill in `plugins/sdlc/claude-code/` describes.
35
37
  4. **Start a bug fix with a failing test.** A bug fix has no intent and no spec; its plan, `intent/<short-description>/plan.md`, is accepted by an engineer before any code changes. Reproduce the bug as a test, confirm it fails for the reason you expect, and commit it on a `fix/` branch. Then `.agents/hooks/agent-test-edit-gate.sh` blocks test edits by itself: make the test pass without editing it. On a branch with another name, create `.git/bug-fix-in-progress` first, and delete it once the test passes.
36
- 5. **Do not start work a person did not ask for.** When a message reports a problem without asking for work, answer in a few lines and end with the message that would start it: `/sdlc` followed by their own words.
38
+ 5. **Do not start work a person did not ask for.** When a message reports a problem without asking for work, answer in a few lines and end with the message that would start it: `/sdlc:sdlc-mode` followed by their own words.
37
39
  6. **Branch from the latest `origin/main`, and open the pull request ready for review.** Name the branch `<type>/<short-description>` and fill the body from `.github/pull_request_template.md`. `.github/workflows/ci.yml` runs full verification only on a pull request that is not a draft. Never merge a pull request: a person merges it with `--squash` after code owner approval, bottom-up for a stack of pull requests.
38
- 7. **Write replies a person can check.** Reply in the language the person wrote in. Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and never hand the person a check you could run. Send nothing outside the session, such as a message to another session or a service, unless a task step says to.
40
+ 7. **Write replies a person can check.** Write paths from the project root, such as `README.md:12`, never from the machine's root. State as a fact only what you opened or ran in this turn, and say what you ran; mark anything else as inferred or not checked. Answer what was asked and stop: leave out tools, services, and steps the request does not need, and never hand the person a check you could run. Send nothing outside the session, such as a message to another session or a service, unless a task step says to.
39
41
  8. **Run parallel sessions in separate worktrees, on tasks that touch different files.** Start each with `claude --worktree <name>`: a worktree is its own checkout on its own branch. Tasks that share files run in one session, one after another. Start with two or three sessions, and add one only while you can review every stream properly.
40
42
 
41
43
  ## Things Claude gets wrong