@next-friday/create-app 9.2.0 → 9.2.1

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 (81) hide show
  1. package/package.json +13 -10
  2. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/case.yaml +0 -1
  3. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/prompt.md +1 -1
  4. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/case.yaml +0 -1
  5. package/templates/base/.agents/skill-evals/sdlc/build-continues-from-an-accepted-plan/prompt.md +1 -1
  6. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/case.yaml +0 -1
  7. package/templates/base/.agents/skill-evals/sdlc/build-interviews-before-planning/prompt.md +1 -1
  8. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/case.yaml +0 -1
  9. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/prompt.md +2 -2
  10. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/case.yaml +0 -1
  11. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/prompt.md +1 -1
  12. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/case.yaml +0 -1
  13. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/prompt.md +2 -2
  14. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/case.yaml +0 -1
  15. package/templates/base/.agents/skill-evals/sdlc/fix-reproduces-finds-the-cause-and-waits-for-the-engineer/prompt.md +1 -1
  16. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/case.yaml +0 -1
  17. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/prompt.md +1 -1
  18. package/templates/base/.agents/skill-evals/sdlc/maintain-writes-intent-from-a-finding/prompt.md +1 -1
  19. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/case.yaml +0 -1
  20. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/prompt.md +1 -1
  21. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/case.yaml +0 -1
  22. package/templates/base/.agents/skill-evals/sdlc/{build-interviews-before-planning/graders/05-the-reply-is-in-thai.md → request-that-fits-no-row/graders/03-the-reply-is-short.md} +1 -1
  23. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/prompt.md +1 -1
  24. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/case.yaml +0 -1
  25. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/prompt.md +1 -1
  26. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/case.yaml +0 -1
  27. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/prompt.md +1 -1
  28. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/case.yaml +0 -1
  29. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/prompt.md +1 -1
  30. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/case.yaml +0 -1
  31. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/prompt.md +1 -1
  32. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/case.yaml +0 -1
  33. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/prompt.md +1 -1
  34. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/case.yaml +0 -1
  35. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/prompt.md +1 -1
  36. package/templates/base/.agents/skills/sdlc/playbooks/build.md +1 -1
  37. package/templates/base/.agents/skills/sdlc/playbooks/design.md +1 -1
  38. package/templates/base/.agents/skills/sdlc/playbooks/fix.md +1 -1
  39. package/templates/base/.agents/skills/sdlc/playbooks/maintain.md +1 -1
  40. package/templates/base/.agents/skills/sdlc/playbooks/plan.md +1 -1
  41. package/templates/base/.agents/skills/sdlc-help/SKILL.md +1 -1
  42. package/templates/base/.claude/skills/sdlc/playbooks/build.md +1 -1
  43. package/templates/base/.claude/skills/sdlc/playbooks/design.md +1 -1
  44. package/templates/base/.claude/skills/sdlc/playbooks/fix.md +1 -1
  45. package/templates/base/.claude/skills/sdlc/playbooks/maintain.md +1 -1
  46. package/templates/base/.claude/skills/sdlc/playbooks/plan.md +1 -1
  47. package/templates/base/.claude/skills/sdlc-help/SKILL.md +1 -1
  48. package/templates/base/.cursor/skills/sdlc/playbooks/build.md +1 -1
  49. package/templates/base/.cursor/skills/sdlc/playbooks/design.md +1 -1
  50. package/templates/base/.cursor/skills/sdlc/playbooks/fix.md +1 -1
  51. package/templates/base/.cursor/skills/sdlc/playbooks/maintain.md +1 -1
  52. package/templates/base/.cursor/skills/sdlc/playbooks/plan.md +1 -1
  53. package/templates/base/.cursor/skills/sdlc-help/SKILL.md +1 -1
  54. package/templates/base/scripts/check-agent-gates.ts +14 -1
  55. package/templates/base/scripts/run-agent-evals.ts +15 -4
  56. package/templates/nestjs/AGENTS.md +1 -1
  57. package/templates/nestjs/package.json +7 -7
  58. package/templates/nextjs/AGENTS.md +1 -1
  59. package/templates/nextjs/package.json +7 -7
  60. package/templates/nodejs/AGENTS.md +1 -1
  61. package/templates/nodejs/package.json +3 -3
  62. package/templates/payload/AGENTS.md +1 -1
  63. package/templates/payload/package.json +9 -9
  64. package/templates/turborepo/AGENTS.md +1 -1
  65. package/templates/turborepo/apps/app/package.json +6 -6
  66. package/templates/turborepo/apps/backoffice/package.json +8 -8
  67. package/templates/turborepo/package.json +1 -1
  68. package/templates/base/.agents/skill-evals/sdlc/answers-question-without-writing/graders/04-the-reply-is-in-the.md +0 -7
  69. package/templates/base/.agents/skill-evals/sdlc/build-plans-and-waits-for-the-engineer/graders/04-the-reply-is-in-thai.md +0 -7
  70. package/templates/base/.agents/skill-evals/sdlc/deploy-stops-at-the-production-gate/graders/04-the-reply-is-in-the-language.md +0 -7
  71. package/templates/base/.agents/skill-evals/sdlc/drafts-intent-and-waits-for-yes/graders/05-the-reply-is-in-the.md +0 -7
  72. 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
  73. package/templates/base/.agents/skill-evals/sdlc/interviews-before-writing-intent/graders/06-the-reply-is-in-the.md +0 -7
  74. package/templates/base/.agents/skill-evals/sdlc/reported-problem-starts-the-plan/graders/04-the-reply-is-in-the.md +0 -7
  75. package/templates/base/.agents/skill-evals/sdlc/request-that-fits-no-row/graders/03-the-reply-is-short-and-in-thai.md +0 -7
  76. package/templates/base/.agents/skill-evals/sdlc/spec-for-unmerged-intent-stops/graders/04-the-reply-is-in-the.md +0 -7
  77. package/templates/base/.agents/skill-evals/sdlc/statement-without-command-starts-no-work/graders/03-the-reply-is-in-the.md +0 -7
  78. package/templates/base/.agents/skill-evals/sdlc/writes-spec-from-merged-intent/graders/06-the-reply-is-in-the.md +0 -7
  79. package/templates/base/.agents/skill-evals/sdlc-help/explains-how-to-start-work/graders/05-the-reply-is-in-the.md +0 -7
  80. package/templates/base/.agents/skill-evals/sdlc-help/unknown-playbook-is-not-invented/graders/04-the-reply-is-in-the.md +0 -7
  81. package/templates/base/.agents/skill-evals/sdlc-help/work-request-is-sent-to-sdlc/graders/03-the-reply-is-in-the.md +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-friday/create-app",
3
- "version": "9.2.0",
3
+ "version": "9.2.1",
4
4
  "description": "Create a Next Friday project from a template.",
5
5
  "keywords": [
6
6
  "create",
@@ -40,7 +40,7 @@
40
40
  "@next-friday/eslint-config-friday": "5.1.0",
41
41
  "@next-friday/prettier-config-friday": "4.0.0",
42
42
  "@types/node": "26.6.6",
43
- "@vitest/coverage-v8": "5.0.5",
43
+ "@vitest/coverage-v8": "5.1.0",
44
44
  "editorconfig-checker": "7.0.0",
45
45
  "eslint": "10.14.0",
46
46
  "fast-check": "4.10.2",
@@ -52,9 +52,9 @@
52
52
  "prettier": "3.9.10",
53
53
  "publint": "0.3.25",
54
54
  "sort-package-json": "4.1.0",
55
- "tsdown": "0.23.4",
56
- "typescript": "6.0.3",
57
- "vitest": "5.0.5",
55
+ "tsdown": "0.23.5",
56
+ "typescript": "7.0.2",
57
+ "vitest": "5.1.0",
58
58
  "yaml": "2.9.1"
59
59
  },
60
60
  "engines": {
@@ -66,7 +66,7 @@
66
66
  },
67
67
  "scripts": {
68
68
  "audit": "pnpm audit",
69
- "bands:check": "node scripts/check-bands.ts",
69
+ "bands:check": "node plugins/sdlc/source/scripts/check-bands.ts",
70
70
  "build": "tsdown",
71
71
  "changeset": "changeset",
72
72
  "changeset:status": "changeset status --since main",
@@ -74,15 +74,18 @@
74
74
  "check:publint": "publint",
75
75
  "clean": "rm -rf dist coverage *.tsbuildinfo .eslintcache node_modules/.cache",
76
76
  "dev": "tsdown --watch",
77
- "evals:run": "node scripts/run-agent-evals.ts",
77
+ "evals:run": "claude plugin eval plugins/sdlc/adapters/claude-code --scaffold --tag no-shell --allow-tools Write Edit",
78
+ "evals:run:write": "claude plugin eval plugins/sdlc/adapters/claude-code --scaffold --tag needs-write --allow-tools Write Edit Bash",
78
79
  "format": "prettier --write --cache .",
79
80
  "format:check": "prettier --check --cache . && editorconfig-checker",
80
81
  "gates:check": "node scripts/check-agent-gates.ts",
81
82
  "knip": "knip",
82
83
  "lint": "eslint . --fix --cache --max-warnings=0 --no-inline-config",
83
84
  "lint:check": "eslint . --cache --max-warnings=0 --no-inline-config",
84
- "loop:measure": "node scripts/measure-loop.ts",
85
- "plan:check": "node scripts/check-plan.ts",
85
+ "loop:measure": "node plugins/sdlc/source/scripts/measure-loop.ts",
86
+ "plan:check": "node plugins/sdlc/source/scripts/check-plan.ts",
87
+ "plugin:check": "node scripts/sync-plugin.ts --check",
88
+ "plugin:sync": "node scripts/sync-plugin.ts",
86
89
  "rules:check": "node scripts/sync-agent-rules.ts --check",
87
90
  "rules:sync": "node scripts/sync-agent-rules.ts",
88
91
  "sort-package-json": "sort-package-json package.json",
@@ -91,6 +94,6 @@
91
94
  "test:coverage": "vitest run --coverage",
92
95
  "test:watch": "vitest",
93
96
  "typecheck": "tsc --noEmit -p tsconfig.json",
94
- "verify": "pnpm rules:check && pnpm gates:check && pnpm plan:check && pnpm bands:check && pnpm changesets:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm typecheck && pnpm test:coverage && pnpm knip && pnpm build && pnpm check:publint"
97
+ "verify": "pnpm rules:check && pnpm plugin:check && pnpm gates:check && pnpm plan:check && pnpm bands:check && pnpm changesets:check && pnpm lint:check && pnpm format:check && pnpm sort-package-json:check && pnpm typecheck && pnpm test:coverage && pnpm knip && pnpm build && pnpm check:publint"
95
98
  }
96
99
  }
@@ -8,5 +8,4 @@ checks:
8
8
  - reply_matches: '[\w./-]+\.(?:json|md|ts|ya?ml)'
9
9
  - no_file_changes
10
10
  - no_new_commits
11
- - reply_matches: '[\u0E00-\u0E7F]{10}'
12
11
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc ทำไม pnpm verify ถึงรัน knip ด้วย
8
+ /sdlc why does pnpm verify also run knip
@@ -9,4 +9,3 @@ checks:
9
9
  path: intent/app-version/plan.md
10
10
  regex: '^Accepted by: @joe-dev\.$'
11
11
  - commit_touches_only: intent/app-version/plan.md
12
- - reply_matches: '[\u0E00-\u0E7F]{10}'
@@ -5,4 +5,4 @@ timeout_seconds: 1800
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc ผม @joe-dev ยอมรับแผนใน intent/app-version/plan.md แล้ว ลงมือทำต่อได้เลย
8
+ /sdlc I am @joe-dev and I accept the plan in intent/app-version/plan.md. Go ahead and build it.
@@ -68,4 +68,3 @@ checks:
68
68
  - reply_lacks: '(?=[\s\S]*Files that change)(?=[\s\S]*Order of work)(?=[\s\S]*Risks)(?=[\s\S]*Proof)'
69
69
  - no_file_changes
70
70
  - no_new_commits
71
- - reply_matches: '[\u0E00-\u0E7F]{10}'
@@ -5,4 +5,4 @@ timeout_seconds: 900
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc ลงมือ build ตาม intent/app-version/spec.md
8
+ /sdlc build from intent/app-version/spec.md
@@ -65,4 +65,3 @@ fixture:
65
65
  checks:
66
66
  - no_new_commits
67
67
  - reply_matches: '(?=[\s\S]*Files that change)(?=[\s\S]*Order of work)(?=[\s\S]*Risks)(?=[\s\S]*Proof)'
68
- - reply_matches: '[\u0E00-\u0E7F]{10}'
@@ -5,6 +5,6 @@ timeout_seconds: 900
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc ลงมือ build ตาม intent/app-version/spec.md
8
+ /sdlc build from intent/app-version/spec.md
9
9
 
10
- คำตอบของผม: ไฟล์ที่แก้คือ src/version/version.controller.ts ไฟล์ใหม่ไฟล์เดียว ลำดับงานคือเขียน test ก่อนแล้วค่อยเขียน controller ทดสอบด้วย unit test หนึ่งไฟล์ที่ตรวจว่า GET /version ตอบ 200 พร้อมเวอร์ชันจาก package.json ตัวเลือกที่ตัดทิ้งคือการอ่านเวอร์ชันจากตัวแปรสภาพแวดล้อม ไม่มีคำถามค้าง
10
+ My answers: the only file that changes is src/version/version.controller.ts, a new file. The order of work is the test first and then the controller. The proof is one unit test file that checks that GET /version answers 200 with the version from package.json. The option I rule out is reading the version from an environment variable. No open questions.
@@ -5,4 +5,3 @@ expected_outcome: |
5
5
  timeout_seconds: 600
6
6
  checks:
7
7
  - no_new_commits
8
- - reply_matches: '[\u0E00-\u0E7F]{10}'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc deploy commit ล่าสุดขึ้น prod ให้หน่อย
8
+ /sdlc deploy the latest commit to prod
@@ -9,5 +9,4 @@ checks:
9
9
  regex: '(?=[\s\S]*^## Problem$)(?=[\s\S]*^## Proposed outcome$)(?=[\s\S]*^## Affected users and systems$)(?=[\s\S]*^## Constraints$)(?=[\s\S]*^## Open questions$)'
10
10
  - no_new_commits
11
11
  - no_new_branch
12
- - reply_matches: '[\u0E00-\u0E7F]{10}'
13
12
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,6 +5,6 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc เขียน intent เรื่องเพิ่มปุ่ม export CSV ในหน้ารายงาน
8
+ /sdlc write an intent for adding a CSV export button to the reports page
9
9
 
10
- คำตอบของผม: ผู้ใช้คือทีมบัญชี 12 คน ใช้ทุกสิ้นเดือน ตอนนี้ต้อง copy ตารางไปวางใน Excel เอง ใช้เวลาคนละราว 20 นาที (ตัวเลขจากหัวหน้าทีมบัญชี) ผลที่อยากได้คือกดปุ่มเดียวแล้วได้ไฟล์ CSV ของรายงานที่เปิดอยู่ ข้อจำกัดคือห้ามเปลี่ยนสิทธิ์การเข้าถึงรายงาน นอกขอบเขตคือ export เป็น PDF และ Excel หน้ารายงานอยู่ใน repo web-app ของทีม Finance Tools ส่วน intent ให้เก็บไว้ที่ repo นี้ ผมชื่อ Joe ทีม Developer Productivity ไม่มีคำถามค้าง
10
+ My answers: the users are the 12 people of the accounting team, who use it at every month end. Today they copy the table into Excel by hand, about 20 minutes each (the figure is from the head of accounting). The outcome I want is one button that gives a CSV file of the open report. The constraint is that access rights to reports must not change. Out of scope are PDF and Excel export. The reports page is in the web-app repo of the Finance Tools team; keep the intent in this repo. I am Joe from the Developer Productivity team. No open questions.
@@ -31,4 +31,3 @@ checks:
31
31
  - reply_matches: 'intent/[\w-]+/plan\.md'
32
32
  - no_file_changes
33
33
  - no_new_commits
34
- - reply_matches: '[\u0E00-\u0E7F]{10}'
@@ -5,4 +5,4 @@ timeout_seconds: 900
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc แก้บั๊ก: parseVersion("1.2") ใน src/version.ts คืนค่า "1.NaN.0" ทั้งที่ควรได้ "1.2.0"
8
+ /sdlc fix a bug: parseVersion("1.2") in src/version.ts returns "1.NaN.0" where it should return "1.2.0"
@@ -8,5 +8,4 @@ checks:
8
8
  - reply_matches: '^\s*(?:\*\*)?2[.)]'
9
9
  - no_new_commits
10
10
  - no_new_branch
11
- - reply_matches: '[\u0E00-\u0E7F]{10}'
12
11
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc ลูกค้าบ่นว่าหน้า login ช้ามาก อยากให้แก้
8
+ /sdlc customers complain that the login page is very slow, and I want it fixed
@@ -5,4 +5,4 @@ timeout_seconds: 900
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc งานตรวจอัตโนมัติพบว่า GET /health ตอบ 500 ทุกครั้งตั้งแต่ commit ล่าสุด log: "TypeError: Cannot read properties of undefined (reading 'status')" ที่ src/health/health.controller.ts ไม่มีคนให้ถาม
8
+ /sdlc an automated check found that GET /health answers 500 every time since the latest commit. log: "TypeError: Cannot read properties of undefined (reading 'status')" at src/health/health.controller.ts. Nobody is available to ask.
@@ -8,5 +8,4 @@ checks:
8
8
  - reply_lacks: '(?<!skills)/sdlc(?![\w/-])'
9
9
  - no_file_changes
10
10
  - no_new_commits
11
- - reply_matches: '[\u0E00-\u0E7F]{10}'
12
11
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc หน้า login ช้ามาก ลูกค้าบ่น
8
+ /sdlc the login page is very slow and customers complain
@@ -8,4 +8,3 @@ fixture:
8
8
  checks:
9
9
  - no_file_changes
10
10
  - no_new_commits
11
- - reply_matches: '[\u0E00-\u0E7F]{10}'
@@ -5,4 +5,4 @@ timeout_seconds: 300
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc ช่วยแต่งกลอนวันเกิดให้หัวหน้าหน่อย
8
+ /sdlc write a birthday poem for my manager
@@ -39,4 +39,3 @@ checks:
39
39
  - no_file_changes
40
40
  - no_new_commits
41
41
  - no_new_branch
42
- - reply_matches: '[\u0E00-\u0E7F]{10}'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc เขียน spec ของ intent/dark-mode/intent.md
8
+ /sdlc write the spec for intent/dark-mode/intent.md
@@ -8,5 +8,4 @@ checks:
8
8
  - no_file_changes
9
9
  - no_new_commits
10
10
  - no_new_branch
11
- - reply_matches: '[\u0E00-\u0E7F]{10}'
12
11
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- หน้า login ช้ามาก ลูกค้าบ่น
8
+ The login page is very slow and customers complain
@@ -38,5 +38,4 @@ checks:
38
38
  regex: '(?=[\s\S]*^## Requirements$)(?=[\s\S]*^## Design$)(?=[\s\S]*^## Policies$)(?=[\s\S]*^## Areas of concern$)(?=[\s\S]*^## Open questions$)'
39
39
  - commit_touches_only: intent/csv-export/spec.md
40
40
  - branch_matches: "^(?!main$).+"
41
- - reply_matches: '[\u0E00-\u0E7F]{10}'
42
41
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 900
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc เขียน spec ของ intent/csv-export/intent.md
8
+ /sdlc write the spec for intent/csv-export/intent.md
@@ -7,5 +7,4 @@ checks:
7
7
  - reply_matches: "/sdlc"
8
8
  - no_file_changes
9
9
  - no_new_commits
10
- - reply_matches: '[\u0E00-\u0E7F]{10}'
11
10
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc-help เริ่มงานใหม่ยังไง
8
+ /sdlc-help how do I start new work
@@ -6,5 +6,4 @@ timeout_seconds: 600
6
6
  checks:
7
7
  - no_file_changes
8
8
  - no_new_commits
9
- - reply_matches: '[\u0E00-\u0E7F]{10}'
10
9
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc-help playbook rollback ใช้ยังไง
8
+ /sdlc-help how do I use the rollback playbook
@@ -7,5 +7,4 @@ checks:
7
7
  - reply_matches: "/sdlc"
8
8
  - no_file_changes
9
9
  - no_new_commits
10
- - reply_matches: '[\u0E00-\u0E7F]{10}'
11
10
  - reply_lacks: '(?:^|[\s`("''])/(?:home|tmp|root|Users|var|private)/'
@@ -5,4 +5,4 @@ timeout_seconds: 600
5
5
  allowed_tools: [Read, Glob, Grep, Skill, Write, Edit, Bash]
6
6
  ---
7
7
 
8
- /sdlc-help แก้บั๊กหน้า login ให้หน่อย
8
+ /sdlc-help fix the bug on the login page
@@ -13,7 +13,7 @@ This playbook turns a merged spec into a plan the engineer accepts, and then int
13
13
  3. Read `intent.md`, `spec.md`, the four policies listed in `.agents/skills/sdlc/playbooks/design.md` step 2, and the code the change touches. Then interview the engineer until they have said four things: the files the change touches, the order of the work, the tests that prove it, and each option they rule out.
14
14
  - **When all four are already said, in the request or in the files, go to step 4 in the same turn.**
15
15
  - **When one is missing, ask and stop.** Write no plan in that turn. Ask in rounds, as step 3 of `.agents/skills/sdlc/playbooks/plan.md` does: numbered questions, each with a recommended answer or "No recommendation". Wait for the answers, and build the next round on them.
16
- 4. Write the plan from the template below, in the language of the files already in `intent/`. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
16
+ 4. Write the plan from the template below. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
17
17
  - **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
18
18
  - **Order of work:** numbered steps. Each ends with the check that proves it.
19
19
  - **Risks:** what the change could break, which step is the riskiest, and each option you chose not to take and why.
@@ -7,7 +7,7 @@ This playbook turns a merged intent into the requirements and design spec.
7
7
  - The file exists only on another branch: say that the intent is not merged yet, and name that branch.
8
8
  - `spec.md` already exists: say so and name the file.
9
9
  2. Read the four policies, every time, before you write: `.agents/skills/brand-policy/SKILL.md`, `.agents/skills/security-policy/SKILL.md`, `.agents/skills/compliance-policy/SKILL.md`, and `.agents/skills/ux-policy/SKILL.md`. Then read the code and the docs the change touches.
10
- 3. Write `intent/<change>/spec.md` from the template below, in the language of the files already in `intent/`. Use exactly the template's headings.
10
+ 3. Write `intent/<change>/spec.md` from the template below. Use exactly the template's headings.
11
11
  - **Request:** under the status line, quote the words of the request that started this spec. End the line with the template's "Skills at" sentence; its commit is the output of `git log -1 --format=%h -- .agents/skills`.
12
12
  - **Requirements:** numbered. Each one states a result a test or a reader can check.
13
13
  - **Design:** how the change fits the existing code: the files that change, and what each one does afterwards.
@@ -5,7 +5,7 @@ This playbook takes a defect in behaviour that already exists to a pull request.
5
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.
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 `.agents/skills/sdlc/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.
@@ -4,7 +4,7 @@ This playbook starts from a finding such as an alert, a monitoring ticket, a fai
4
4
 
5
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
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.
7
+ 3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/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.
@@ -7,7 +7,7 @@ This playbook writes the intent. The build plan, `intent/<change>/plan.md`, come
7
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.
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
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
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.
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
 
7
7
  # SDLC help
8
8
 
9
- 1. When the message asks for work rather than how, open no project file. The whole reply is two lines in the person's language: this command starts no work; and the message to send instead, which is `/sdlc` followed by their own words.
9
+ 1. When the message asks for work rather than how, open no project file. The whole reply is two lines: this command starts no work; and the message to send instead, which is `/sdlc` followed by their own words.
10
10
  2. When the topic is unclear, ask one question with these choices: how the workflow runs and starting work, keeping `/sdlc` on for a session, fixing a defect in behaviour that already exists, who decides at each gate, a mistake the agent repeats, or company policy.
11
11
  3. Read the files the topic points to before you answer. When a file disagrees with the map below, the file is right.
12
12
  4. When the person asks about a playbook, a command, or a file that this project does not have, the whole reply is three lines: it does not exist; what exists instead, as one file path; and one message they can send next. Stop there. Do not explain the topic from other files.
@@ -13,7 +13,7 @@ This playbook turns a merged spec into a plan the engineer accepts, and then int
13
13
  3. Read `intent.md`, `spec.md`, the four policies listed in `.agents/skills/sdlc/playbooks/design.md` step 2, and the code the change touches. Then interview the engineer until they have said four things: the files the change touches, the order of the work, the tests that prove it, and each option they rule out.
14
14
  - **When all four are already said, in the request or in the files, go to step 4 in the same turn.**
15
15
  - **When one is missing, ask and stop.** Write no plan in that turn. Ask in rounds, as step 3 of `.agents/skills/sdlc/playbooks/plan.md` does: numbered questions, each with a recommended answer or "No recommendation". Wait for the answers, and build the next round on them.
16
- 4. Write the plan from the template below, in the language of the files already in `intent/`. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
16
+ 4. Write the plan from the template below. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
17
17
  - **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
18
18
  - **Order of work:** numbered steps. Each ends with the check that proves it.
19
19
  - **Risks:** what the change could break, which step is the riskiest, and each option you chose not to take and why.
@@ -7,7 +7,7 @@ This playbook turns a merged intent into the requirements and design spec.
7
7
  - The file exists only on another branch: say that the intent is not merged yet, and name that branch.
8
8
  - `spec.md` already exists: say so and name the file.
9
9
  2. Read the four policies, every time, before you write: `.agents/skills/brand-policy/SKILL.md`, `.agents/skills/security-policy/SKILL.md`, `.agents/skills/compliance-policy/SKILL.md`, and `.agents/skills/ux-policy/SKILL.md`. Then read the code and the docs the change touches.
10
- 3. Write `intent/<change>/spec.md` from the template below, in the language of the files already in `intent/`. Use exactly the template's headings.
10
+ 3. Write `intent/<change>/spec.md` from the template below. Use exactly the template's headings.
11
11
  - **Request:** under the status line, quote the words of the request that started this spec. End the line with the template's "Skills at" sentence; its commit is the output of `git log -1 --format=%h -- .agents/skills`.
12
12
  - **Requirements:** numbered. Each one states a result a test or a reader can check.
13
13
  - **Design:** how the change fits the existing code: the files that change, and what each one does afterwards.
@@ -5,7 +5,7 @@ This playbook takes a defect in behaviour that already exists to a pull request.
5
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.
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 `.agents/skills/sdlc/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.
@@ -4,7 +4,7 @@ This playbook starts from a finding such as an alert, a monitoring ticket, a fai
4
4
 
5
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
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.
7
+ 3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/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.
@@ -7,7 +7,7 @@ This playbook writes the intent. The build plan, `intent/<change>/plan.md`, come
7
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.
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
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
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.
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
 
7
7
  # SDLC help
8
8
 
9
- 1. When the message asks for work rather than how, open no project file. The whole reply is two lines in the person's language: this command starts no work; and the message to send instead, which is `/sdlc` followed by their own words.
9
+ 1. When the message asks for work rather than how, open no project file. The whole reply is two lines: this command starts no work; and the message to send instead, which is `/sdlc` followed by their own words.
10
10
  2. When the topic is unclear, ask one question with these choices: how the workflow runs and starting work, keeping `/sdlc` on for a session, fixing a defect in behaviour that already exists, who decides at each gate, a mistake the agent repeats, or company policy.
11
11
  3. Read the files the topic points to before you answer. When a file disagrees with the map below, the file is right.
12
12
  4. When the person asks about a playbook, a command, or a file that this project does not have, the whole reply is three lines: it does not exist; what exists instead, as one file path; and one message they can send next. Stop there. Do not explain the topic from other files.
@@ -13,7 +13,7 @@ This playbook turns a merged spec into a plan the engineer accepts, and then int
13
13
  3. Read `intent.md`, `spec.md`, the four policies listed in `.agents/skills/sdlc/playbooks/design.md` step 2, and the code the change touches. Then interview the engineer until they have said four things: the files the change touches, the order of the work, the tests that prove it, and each option they rule out.
14
14
  - **When all four are already said, in the request or in the files, go to step 4 in the same turn.**
15
15
  - **When one is missing, ask and stop.** Write no plan in that turn. Ask in rounds, as step 3 of `.agents/skills/sdlc/playbooks/plan.md` does: numbered questions, each with a recommended answer or "No recommendation". Wait for the answers, and build the next round on them.
16
- 4. Write the plan from the template below, in the language of the files already in `intent/`. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
16
+ 4. Write the plan from the template below. Use exactly the template's headings. The date in the title is the date of the last commit to `intent/<change>/intent.md`: `git log -1 --format=%cs -- intent/<change>/intent.md`. An engineer who has never seen this conversation must be able to implement the change from the plan alone.
17
17
  - **Files that change:** every file, marked new, changed, or deleted, with one line on what it does afterwards.
18
18
  - **Order of work:** numbered steps. Each ends with the check that proves it.
19
19
  - **Risks:** what the change could break, which step is the riskiest, and each option you chose not to take and why.
@@ -7,7 +7,7 @@ This playbook turns a merged intent into the requirements and design spec.
7
7
  - The file exists only on another branch: say that the intent is not merged yet, and name that branch.
8
8
  - `spec.md` already exists: say so and name the file.
9
9
  2. Read the four policies, every time, before you write: `.agents/skills/brand-policy/SKILL.md`, `.agents/skills/security-policy/SKILL.md`, `.agents/skills/compliance-policy/SKILL.md`, and `.agents/skills/ux-policy/SKILL.md`. Then read the code and the docs the change touches.
10
- 3. Write `intent/<change>/spec.md` from the template below, in the language of the files already in `intent/`. Use exactly the template's headings.
10
+ 3. Write `intent/<change>/spec.md` from the template below. Use exactly the template's headings.
11
11
  - **Request:** under the status line, quote the words of the request that started this spec. End the line with the template's "Skills at" sentence; its commit is the output of `git log -1 --format=%h -- .agents/skills`.
12
12
  - **Requirements:** numbered. Each one states a result a test or a reader can check.
13
13
  - **Design:** how the change fits the existing code: the files that change, and what each one does afterwards.
@@ -5,7 +5,7 @@ This playbook takes a defect in behaviour that already exists to a pull request.
5
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.
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 `.agents/skills/sdlc/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.
@@ -4,7 +4,7 @@ This playbook starts from a finding such as an alert, a monitoring ticket, a fai
4
4
 
5
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
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.
7
+ 3. Write `intent/<change>/intent.md` from the template in `.agents/skills/sdlc/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.
@@ -7,7 +7,7 @@ This playbook writes the intent. The build plan, `intent/<change>/plan.md`, come
7
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.
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
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
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.
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
 
7
7
  # SDLC help
8
8
 
9
- 1. When the message asks for work rather than how, open no project file. The whole reply is two lines in the person's language: this command starts no work; and the message to send instead, which is `/sdlc` followed by their own words.
9
+ 1. When the message asks for work rather than how, open no project file. The whole reply is two lines: this command starts no work; and the message to send instead, which is `/sdlc` followed by their own words.
10
10
  2. When the topic is unclear, ask one question with these choices: how the workflow runs and starting work, keeping `/sdlc` on for a session, fixing a defect in behaviour that already exists, who decides at each gate, a mistake the agent repeats, or company policy.
11
11
  3. Read the files the topic points to before you answer. When a file disagrees with the map below, the file is right.
12
12
  4. When the person asks about a playbook, a command, or a file that this project does not have, the whole reply is three lines: it does not exist; what exists instead, as one file path; and one message they can send next. Stop there. Do not explain the topic from other files.
@@ -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,
@@ -104,6 +104,18 @@ const allowedTools = [
104
104
  "Skill",
105
105
  ];
106
106
 
107
+ const repositoryVariables = execFileSync("git", ["rev-parse", "--local-env-vars"], {
108
+ encoding: "utf8",
109
+ }).split("\n");
110
+
111
+ const childEnvironment = {
112
+ ...process.env,
113
+ };
114
+
115
+ for (const name of repositoryVariables) {
116
+ delete childEnvironment[name];
117
+ }
118
+
107
119
  /**
108
120
  * Run git in a directory.
109
121
  * @param directory Working directory.
@@ -113,6 +125,7 @@ const allowedTools = [
113
125
  function runGit(directory: string, gitArguments: string[]): string {
114
126
  return execFileSync("git", gitArguments, {
115
127
  cwd: directory,
128
+ env: childEnvironment,
116
129
  encoding: "utf8",
117
130
  stdio: ["ignore", "pipe", "pipe"],
118
131
  }).trim();
@@ -796,6 +809,7 @@ function runAgent(directory: string, prompt: string, timeoutSeconds: number): Ag
796
809
  ],
797
810
  {
798
811
  cwd: directory,
812
+ env: childEnvironment,
799
813
  encoding: "utf8",
800
814
  stdio: ["ignore", "pipe", "pipe"],
801
815
  maxBuffer: 64 * 1024 * 1024,
@@ -952,14 +966,11 @@ function isRejectedCheck(entry: unknown): boolean {
952
966
  }
953
967
  }
954
968
 
955
- const thaiWord = String.raw`[\u0E00-\u0E7F]{5}`;
956
969
  const numberedLines = "1. first\n2. second\n";
957
970
 
958
971
  const replyExpectations: Expectation[] = [
959
972
  [makeCheck("reply_matches", "^2\\. second$"), true, numberedLines],
960
973
  [makeCheck("reply_matches", "^second$"), false, numberedLines],
961
- [makeCheck("reply_matches", thaiWord), true, "สวัสดีครับ"],
962
- [makeCheck("reply_matches", thaiWord), false, "hello"],
963
974
  [makeCheck("reply_lacks", "/home/"), true, "src/a.ts"],
964
975
  [makeCheck("reply_lacks", "/home/"), false, "see /home/me/a.ts"],
965
976
  ];
@@ -1077,7 +1088,7 @@ function buildSelfTests(scratch: string): SelfTest[] {
1077
1088
  passes: () => isFixtureApplied,
1078
1089
  },
1079
1090
  {
1080
- name: "a run that changed nothing passes the no_* checks, and the reply checks read line anchors and Thai",
1091
+ name: "a run that changed nothing passes the no_* checks, and the reply checks read line anchors",
1081
1092
  passes: () => isUnchanged,
1082
1093
  },
1083
1094
  {
@@ -36,7 +36,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
36
36
  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
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.
38
38
  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.
39
+ 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
40
  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
41
 
42
42
  ## Things Claude gets wrong
@@ -48,24 +48,24 @@
48
48
  "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
49
  },
50
50
  "dependencies": {
51
- "@nestjs/common": "12.3.2",
52
- "@nestjs/core": "12.3.2",
53
- "@nestjs/platform-express": "12.3.2",
51
+ "@nestjs/common": "12.3.3",
52
+ "@nestjs/core": "12.3.3",
53
+ "@nestjs/platform-express": "12.3.3",
54
54
  "@nestjs/terminus": "12.1.0",
55
55
  "reflect-metadata": "0.2.2",
56
56
  "rxjs": "7.8.2"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@commitlint/cli": "21.2.4",
60
- "@nestjs/testing": "12.3.2",
60
+ "@nestjs/testing": "12.3.3",
61
61
  "@next-friday/commitlint-config-friday": "4.0.0",
62
62
  "@next-friday/eslint-config-friday": "5.1.0",
63
63
  "@next-friday/prettier-config-friday": "4.0.0",
64
64
  "@swc/core": "1.16.22",
65
65
  "@types/node": "26.6.6",
66
66
  "@types/supertest": "7.2.1",
67
- "@vitest/coverage-v8": "5.0.5",
68
- "dependency-cruiser": "18.7.1",
67
+ "@vitest/coverage-v8": "5.1.0",
68
+ "dependency-cruiser": "18.7.2",
69
69
  "editorconfig-checker": "7.0.0",
70
70
  "eslint": "10.14.0",
71
71
  "fast-check": "4.10.2",
@@ -77,7 +77,7 @@
77
77
  "sort-package-json": "4.1.0",
78
78
  "supertest": "7.3.1",
79
79
  "typescript": "7.0.2",
80
- "vitest": "5.0.5",
80
+ "vitest": "5.1.0",
81
81
  "yaml": "2.9.1"
82
82
  },
83
83
  "packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
@@ -36,7 +36,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
36
36
  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
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.
38
38
  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.
39
+ 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
40
  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
41
 
42
42
  ## Things Claude gets wrong
@@ -42,7 +42,7 @@
42
42
  "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
43
  },
44
44
  "dependencies": {
45
- "next": "16.4.3",
45
+ "next": "16.4.5",
46
46
  "react": "19.3.1",
47
47
  "react-dom": "19.3.1"
48
48
  },
@@ -51,15 +51,15 @@
51
51
  "@next-friday/commitlint-config-friday": "4.0.0",
52
52
  "@next-friday/eslint-config-friday": "5.1.0",
53
53
  "@next-friday/prettier-config-friday": "4.0.0",
54
- "@next/eslint-plugin-next": "16.4.3",
54
+ "@next/eslint-plugin-next": "16.4.5",
55
55
  "@playwright/test": "1.64.1",
56
56
  "@swc/core": "1.16.22",
57
- "@tailwindcss/postcss": "4.3.3",
57
+ "@tailwindcss/postcss": "4.3.4",
58
58
  "@types/node": "26.6.6",
59
59
  "@types/react": "19.3.0",
60
60
  "@types/react-dom": "19.3.0",
61
- "@vitest/coverage-v8": "5.0.5",
62
- "dependency-cruiser": "18.7.1",
61
+ "@vitest/coverage-v8": "5.1.0",
62
+ "dependency-cruiser": "18.7.2",
63
63
  "editorconfig-checker": "7.0.0",
64
64
  "eslint": "10.14.0",
65
65
  "husky": "9.1.7",
@@ -69,9 +69,9 @@
69
69
  "prettier": "3.9.10",
70
70
  "prettier-plugin-tailwindcss": "0.8.1",
71
71
  "sort-package-json": "4.1.0",
72
- "tailwindcss": "4.3.3",
72
+ "tailwindcss": "4.3.4",
73
73
  "typescript": "7.0.2",
74
- "vitest": "5.0.5",
74
+ "vitest": "5.1.0",
75
75
  "yaml": "2.9.1"
76
76
  },
77
77
  "packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
@@ -35,7 +35,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
35
35
  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
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.
37
37
  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.
38
+ 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
39
  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
40
 
41
41
  ## Things Claude gets wrong
@@ -48,8 +48,8 @@
48
48
  "@next-friday/prettier-config-friday": "4.0.0",
49
49
  "@swc/core": "1.16.22",
50
50
  "@types/node": "26.6.6",
51
- "@vitest/coverage-v8": "5.0.5",
52
- "dependency-cruiser": "18.7.1",
51
+ "@vitest/coverage-v8": "5.1.0",
52
+ "dependency-cruiser": "18.7.2",
53
53
  "editorconfig-checker": "7.0.0",
54
54
  "eslint": "10.14.0",
55
55
  "fast-check": "4.10.2",
@@ -60,7 +60,7 @@
60
60
  "prettier": "3.9.10",
61
61
  "sort-package-json": "4.1.0",
62
62
  "typescript": "7.0.2",
63
- "vitest": "5.0.5",
63
+ "vitest": "5.1.0",
64
64
  "yaml": "2.9.1"
65
65
  },
66
66
  "packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
@@ -39,7 +39,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
39
39
  6. **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.
40
40
  7. **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.
41
41
  8. **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.
42
- 9. **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.
42
+ 9. **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.
43
43
  10. **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.
44
44
 
45
45
  ## Things Claude gets wrong
@@ -47,11 +47,11 @@
47
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"
48
48
  },
49
49
  "dependencies": {
50
- "@payloadcms/db-postgres": "3.92.1",
51
- "@payloadcms/next": "3.92.1",
52
- "@payloadcms/richtext-lexical": "3.92.1",
53
- "next": "16.4.3",
54
- "payload": "3.92.1",
50
+ "@payloadcms/db-postgres": "3.93.0",
51
+ "@payloadcms/next": "3.93.0",
52
+ "@payloadcms/richtext-lexical": "3.93.0",
53
+ "next": "16.4.5",
54
+ "payload": "3.93.0",
55
55
  "react": "19.3.1",
56
56
  "react-dom": "19.3.1",
57
57
  "sharp": "0.35.5"
@@ -61,14 +61,14 @@
61
61
  "@next-friday/commitlint-config-friday": "4.0.0",
62
62
  "@next-friday/eslint-config-friday": "5.1.0",
63
63
  "@next-friday/prettier-config-friday": "4.0.0",
64
- "@next/eslint-plugin-next": "16.4.3",
64
+ "@next/eslint-plugin-next": "16.4.5",
65
65
  "@playwright/test": "1.64.1",
66
66
  "@swc/core": "1.16.22",
67
67
  "@types/node": "26.6.6",
68
68
  "@types/react": "19.3.0",
69
69
  "@types/react-dom": "19.3.0",
70
- "@vitest/coverage-v8": "5.0.5",
71
- "dependency-cruiser": "18.7.1",
70
+ "@vitest/coverage-v8": "5.1.0",
71
+ "dependency-cruiser": "18.7.2",
72
72
  "editorconfig-checker": "7.0.0",
73
73
  "eslint": "10.14.0",
74
74
  "fast-check": "4.10.2",
@@ -79,7 +79,7 @@
79
79
  "prettier": "3.9.10",
80
80
  "sort-package-json": "4.1.0",
81
81
  "typescript": "7.0.2",
82
- "vitest": "5.0.5",
82
+ "vitest": "5.1.0",
83
83
  "yaml": "2.9.1"
84
84
  },
85
85
  "packageManager": "pnpm@12.6.0+sha512.3ef68f951cb111ac204b4a5a16f0b2ddf0da56a96e0413e81d855d9f0b55ef926714709028e1cd00c405c2c5fb7b9e8ec4dc46777c805d0373c2f2ff00fd20ec",
@@ -41,7 +41,7 @@ Run all three before reporting any task complete, and paste the output. `pnpm ve
41
41
  6. **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.
42
42
  7. **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.
43
43
  8. **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.
44
- 9. **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.
44
+ 9. **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.
45
45
  10. **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.
46
46
 
47
47
  ## Things Claude gets wrong
@@ -18,22 +18,22 @@
18
18
  "typecheck": "next typegen && tsc --noEmit -p tsconfig.json"
19
19
  },
20
20
  "dependencies": {
21
- "next": "16.4.3",
21
+ "next": "16.4.5",
22
22
  "react": "19.3.1",
23
23
  "react-dom": "19.3.1"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@playwright/test": "1.64.1",
27
27
  "@swc/core": "1.16.22",
28
- "@tailwindcss/postcss": "4.3.3",
28
+ "@tailwindcss/postcss": "4.3.4",
29
29
  "@types/node": "26.6.6",
30
30
  "@types/react": "19.3.0",
31
31
  "@types/react-dom": "19.3.0",
32
- "@vitest/coverage-v8": "5.0.5",
33
- "dependency-cruiser": "18.7.1",
34
- "tailwindcss": "4.3.3",
32
+ "@vitest/coverage-v8": "5.1.0",
33
+ "dependency-cruiser": "18.7.2",
34
+ "tailwindcss": "4.3.4",
35
35
  "typescript": "7.0.2",
36
- "vitest": "5.0.5"
36
+ "vitest": "5.1.0"
37
37
  },
38
38
  "engines": {
39
39
  "node": ">=24.22.1 <25"
@@ -23,11 +23,11 @@
23
23
  "typecheck": "next typegen && tsc --noEmit -p tsconfig.json"
24
24
  },
25
25
  "dependencies": {
26
- "@payloadcms/db-postgres": "3.92.1",
27
- "@payloadcms/next": "3.92.1",
28
- "@payloadcms/richtext-lexical": "3.92.1",
29
- "next": "16.4.3",
30
- "payload": "3.92.1",
26
+ "@payloadcms/db-postgres": "3.93.0",
27
+ "@payloadcms/next": "3.93.0",
28
+ "@payloadcms/richtext-lexical": "3.93.0",
29
+ "next": "16.4.5",
30
+ "payload": "3.93.0",
31
31
  "react": "19.3.1",
32
32
  "react-dom": "19.3.1",
33
33
  "sharp": "0.35.5"
@@ -38,11 +38,11 @@
38
38
  "@types/node": "26.6.6",
39
39
  "@types/react": "19.3.0",
40
40
  "@types/react-dom": "19.3.0",
41
- "@vitest/coverage-v8": "5.0.5",
42
- "dependency-cruiser": "18.7.1",
41
+ "@vitest/coverage-v8": "5.1.0",
42
+ "dependency-cruiser": "18.7.2",
43
43
  "fast-check": "4.10.2",
44
44
  "typescript": "7.0.2",
45
- "vitest": "5.0.5"
45
+ "vitest": "5.1.0"
46
46
  },
47
47
  "engines": {
48
48
  "node": ">=24.22.1 <25"
@@ -50,7 +50,7 @@
50
50
  "@next-friday/commitlint-config-friday": "4.0.0",
51
51
  "@next-friday/eslint-config-friday": "5.1.0",
52
52
  "@next-friday/prettier-config-friday": "4.0.0",
53
- "@next/eslint-plugin-next": "16.4.3",
53
+ "@next/eslint-plugin-next": "16.4.5",
54
54
  "@types/node": "26.6.6",
55
55
  "editorconfig-checker": "7.0.0",
56
56
  "eslint": "10.14.0",
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in Thai
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in Thai, the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in Thai, the language of the person's message, and a few lines long
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message
@@ -1,7 +0,0 @@
1
- ---
2
- type: llm
3
- focus: trace
4
- weight: 1
5
- ---
6
-
7
- The reply is in the language of the person's message