tribunal-kit 4.5.1 → 4.6.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 (214) hide show
  1. package/.agent/.shared/ui-ux-pro-max/README.md +4 -4
  2. package/.agent/ARCHITECTURE.md +282 -277
  3. package/.agent/agents/accessibility-reviewer.md +187 -187
  4. package/.agent/agents/ai-code-reviewer.md +199 -199
  5. package/.agent/agents/api-architect.md +71 -66
  6. package/.agent/agents/backend-specialist.md +219 -215
  7. package/.agent/agents/cloud-engineer.md +98 -0
  8. package/.agent/agents/code-archaeologist.md +168 -161
  9. package/.agent/agents/database-architect.md +184 -184
  10. package/.agent/agents/db-latency-auditor.md +213 -216
  11. package/.agent/agents/debugger.md +198 -191
  12. package/.agent/agents/dependency-reviewer.md +106 -103
  13. package/.agent/agents/devops-engineer.md +218 -218
  14. package/.agent/agents/documentation-writer.md +209 -201
  15. package/.agent/agents/explorer-agent.md +167 -160
  16. package/.agent/agents/frontend-reviewer.md +162 -160
  17. package/.agent/agents/frontend-specialist.md +257 -248
  18. package/.agent/agents/game-developer.md +48 -48
  19. package/.agent/agents/logic-reviewer.md +118 -116
  20. package/.agent/agents/mobile-developer.md +197 -200
  21. package/.agent/agents/mobile-reviewer.md +159 -162
  22. package/.agent/agents/orchestrator.md +187 -181
  23. package/.agent/agents/penetration-tester.md +160 -157
  24. package/.agent/agents/performance-optimizer.md +183 -183
  25. package/.agent/agents/performance-reviewer.md +178 -178
  26. package/.agent/agents/precedence-reviewer.md +251 -250
  27. package/.agent/agents/product-manager.md +149 -142
  28. package/.agent/agents/product-owner.md +81 -80
  29. package/.agent/agents/project-planner.md +152 -142
  30. package/.agent/agents/qa-automation-engineer.md +216 -225
  31. package/.agent/agents/resilience-reviewer.md +88 -88
  32. package/.agent/agents/schema-reviewer.md +67 -67
  33. package/.agent/agents/security-auditor.md +180 -174
  34. package/.agent/agents/seo-specialist.md +188 -193
  35. package/.agent/agents/sql-reviewer.md +159 -161
  36. package/.agent/agents/supervisor-agent.md +173 -184
  37. package/.agent/agents/swarm-worker-contracts.md +170 -166
  38. package/.agent/agents/swarm-worker-registry.md +92 -92
  39. package/.agent/agents/system-architect.md +85 -0
  40. package/.agent/agents/test-coverage-reviewer.md +158 -160
  41. package/.agent/agents/test-engineer.md +118 -118
  42. package/.agent/agents/throughput-optimizer.md +291 -299
  43. package/.agent/agents/type-safety-reviewer.md +182 -175
  44. package/.agent/agents/ui-ux-auditor.md +300 -292
  45. package/.agent/agents/vitals-reviewer.md +223 -223
  46. package/.agent/mcp_config.json +37 -40
  47. package/.agent/patterns/generator.md +11 -9
  48. package/.agent/patterns/inversion.md +14 -12
  49. package/.agent/patterns/pipeline.md +11 -9
  50. package/.agent/patterns/reviewer.md +15 -13
  51. package/.agent/patterns/tool-wrapper.md +11 -9
  52. package/.agent/routing_index.json +714 -0
  53. package/.agent/rules/GEMINI.md +359 -352
  54. package/.agent/scripts/compile_router.py +112 -0
  55. package/.agent/scripts/migrate_skills_frontmatter.py +64 -0
  56. package/.agent/scripts/strengthen_skills.js +1 -1
  57. package/.agent/skills/advanced-rag-pipelines/SKILL.md +56 -0
  58. package/.agent/skills/agent-organizer/SKILL.md +156 -150
  59. package/.agent/skills/agentic-patterns/SKILL.md +313 -315
  60. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +190 -184
  61. package/.agent/skills/api-patterns/SKILL.md +253 -247
  62. package/.agent/skills/api-security-auditor/SKILL.md +195 -193
  63. package/.agent/skills/app-builder/SKILL.md +573 -572
  64. package/.agent/skills/app-builder/templates/SKILL.md +108 -115
  65. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
  66. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
  67. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
  68. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
  69. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
  70. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
  71. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
  72. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +126 -122
  73. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +127 -122
  74. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +172 -169
  75. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +139 -134
  76. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
  77. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +122 -119
  78. package/.agent/skills/appflow-wireframe/SKILL.md +146 -145
  79. package/.agent/skills/architecture/SKILL.md +226 -219
  80. package/.agent/skills/authentication-best-practices/SKILL.md +197 -189
  81. package/.agent/skills/backend-security-expert/SKILL.md +16 -2
  82. package/.agent/skills/bash-linux/SKILL.md +179 -179
  83. package/.agent/skills/behavioral-modes/SKILL.md +239 -223
  84. package/.agent/skills/brainstorming/SKILL.md +498 -486
  85. package/.agent/skills/browser-native-ai/SKILL.md +57 -4
  86. package/.agent/skills/building-native-ui/SKILL.md +202 -202
  87. package/.agent/skills/cicd-pro/SKILL.md +442 -0
  88. package/.agent/skills/clean-code/SKILL.md +400 -381
  89. package/.agent/skills/cloud-architect/SKILL.md +439 -0
  90. package/.agent/skills/code-review-checklist/SKILL.md +203 -194
  91. package/.agent/skills/config-validator/SKILL.md +165 -165
  92. package/.agent/skills/containerization-pro/SKILL.md +452 -0
  93. package/.agent/skills/csharp-developer/SKILL.md +518 -518
  94. package/.agent/skills/data-validation-schemas/SKILL.md +333 -328
  95. package/.agent/skills/database-design/SKILL.md +247 -240
  96. package/.agent/skills/deployment-procedures/SKILL.md +172 -169
  97. package/.agent/skills/devops-engineer/SKILL.md +345 -345
  98. package/.agent/skills/devops-incident-responder/SKILL.md +143 -137
  99. package/.agent/skills/documentation-templates/SKILL.md +291 -279
  100. package/.agent/skills/edge-computing/SKILL.md +183 -181
  101. package/.agent/skills/emil-design-eng/SKILL.md +147 -0
  102. package/.agent/skills/error-resilience/SKILL.md +411 -428
  103. package/.agent/skills/extract-design-system/SKILL.md +160 -158
  104. package/.agent/skills/framer-motion-expert/SKILL.md +253 -244
  105. package/.agent/skills/frontend-design/SKILL.md +208 -201
  106. package/.agent/skills/frontend-security-expert/SKILL.md +16 -3
  107. package/.agent/skills/game-design-expert/SKILL.md +132 -129
  108. package/.agent/skills/game-engineering-expert/SKILL.md +148 -146
  109. package/.agent/skills/generative-ui-expert/SKILL.md +57 -1
  110. package/.agent/skills/geo-fundamentals/SKILL.md +148 -147
  111. package/.agent/skills/git-pro/SKILL.md +435 -0
  112. package/.agent/skills/github-operations/SKILL.md +335 -329
  113. package/.agent/skills/gsap-core/SKILL.md +319 -308
  114. package/.agent/skills/gsap-frameworks/SKILL.md +213 -207
  115. package/.agent/skills/gsap-performance/SKILL.md +139 -133
  116. package/.agent/skills/gsap-plugins/SKILL.md +486 -480
  117. package/.agent/skills/gsap-react/SKILL.md +202 -189
  118. package/.agent/skills/gsap-scrolltrigger/SKILL.md +357 -350
  119. package/.agent/skills/gsap-timeline/SKILL.md +165 -161
  120. package/.agent/skills/gsap-utils/SKILL.md +344 -338
  121. package/.agent/skills/harness-protocol/SKILL.md +48 -0
  122. package/.agent/skills/i18n-localization/SKILL.md +174 -163
  123. package/.agent/skills/intelligent-routing/SKILL.md +202 -246
  124. package/.agent/skills/knowledge-graph/SKILL.md +60 -52
  125. package/.agent/skills/lint-and-validate/SKILL.md +261 -261
  126. package/.agent/skills/llm-engineering/SKILL.md +400 -394
  127. package/.agent/skills/local-first/SKILL.md +178 -178
  128. package/.agent/skills/mcp-builder/SKILL.md +143 -142
  129. package/.agent/skills/mobile-design/SKILL.md +272 -263
  130. package/.agent/skills/monorepo-management/SKILL.md +335 -334
  131. package/.agent/skills/motion-engineering/SKILL.md +266 -234
  132. package/.agent/skills/nextjs-react-expert/SKILL.md +236 -234
  133. package/.agent/skills/nodejs-best-practices/SKILL.md +547 -548
  134. package/.agent/skills/observability/SKILL.md +343 -343
  135. package/.agent/skills/parallel-agents/SKILL.md +143 -146
  136. package/.agent/skills/performance-profiling/SKILL.md +259 -267
  137. package/.agent/skills/plan-writing/SKILL.md +150 -142
  138. package/.agent/skills/platform-engineer/SKILL.md +148 -147
  139. package/.agent/skills/playwright-best-practices/SKILL.md +188 -187
  140. package/.agent/skills/powershell-windows/SKILL.md +162 -162
  141. package/.agent/skills/project-idioms/SKILL.md +137 -137
  142. package/.agent/skills/python-patterns/SKILL.md +260 -259
  143. package/.agent/skills/python-pro/SKILL.md +324 -323
  144. package/.agent/skills/react-specialist/SKILL.md +305 -277
  145. package/.agent/skills/readme-builder/SKILL.md +310 -300
  146. package/.agent/skills/realtime-patterns/SKILL.md +323 -319
  147. package/.agent/skills/red-team-tactics/SKILL.md +231 -218
  148. package/.agent/skills/review-animations/SKILL.md +72 -0
  149. package/.agent/skills/review-animations/STANDARDS.md +73 -0
  150. package/.agent/skills/rust-pro/SKILL.md +671 -673
  151. package/.agent/skills/seo-fundamentals/SKILL.md +179 -179
  152. package/.agent/skills/server-management/SKILL.md +218 -214
  153. package/.agent/skills/shadcn-ui-expert/SKILL.md +231 -231
  154. package/.agent/skills/skill-creator/SKILL.md +87 -86
  155. package/.agent/skills/sql-pro/SKILL.md +629 -629
  156. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +97 -97
  157. package/.agent/skills/swiftui-expert/SKILL.md +204 -201
  158. package/.agent/skills/system-design-pro/SKILL.md +345 -0
  159. package/.agent/skills/systematic-debugging/SKILL.md +153 -142
  160. package/.agent/skills/tailwind-patterns/SKILL.md +610 -566
  161. package/.agent/skills/tdd-workflow/SKILL.md +169 -161
  162. package/.agent/skills/test-result-analyzer/SKILL.md +313 -309
  163. package/.agent/skills/testing-patterns/SKILL.md +566 -579
  164. package/.agent/skills/trend-researcher/SKILL.md +243 -237
  165. package/.agent/skills/typescript-advanced/SKILL.md +336 -335
  166. package/.agent/skills/ui-ux-pro-max/SKILL.md +590 -562
  167. package/.agent/skills/ui-ux-researcher/SKILL.md +244 -244
  168. package/.agent/skills/vue-expert/SKILL.md +294 -275
  169. package/.agent/skills/vulnerability-scanner/SKILL.md +416 -404
  170. package/.agent/skills/web-accessibility-auditor/SKILL.md +219 -218
  171. package/.agent/skills/web-design-guidelines/SKILL.md +192 -186
  172. package/.agent/skills/webapp-testing/SKILL.md +167 -169
  173. package/.agent/skills/webgpu-performance/SKILL.md +56 -2
  174. package/.agent/skills/whimsy-injector/SKILL.md +346 -325
  175. package/.agent/skills/workflow-optimizer/SKILL.md +231 -229
  176. package/.agent/workflows/acf.md +141 -0
  177. package/.agent/workflows/api-tester.md +176 -151
  178. package/.agent/workflows/audit.md +150 -127
  179. package/.agent/workflows/brainstorm.md +134 -110
  180. package/.agent/workflows/changelog.md +140 -112
  181. package/.agent/workflows/create.md +168 -124
  182. package/.agent/workflows/debug.md +190 -165
  183. package/.agent/workflows/deploy.md +201 -180
  184. package/.agent/workflows/enhance.md +154 -128
  185. package/.agent/workflows/fix.md +136 -114
  186. package/.agent/workflows/generate.md +198 -183
  187. package/.agent/workflows/marathon.md +37 -11
  188. package/.agent/workflows/migrate.md +184 -160
  189. package/.agent/workflows/orchestrate.md +192 -168
  190. package/.agent/workflows/performance-benchmarker.md +135 -114
  191. package/.agent/workflows/plan.md +196 -173
  192. package/.agent/workflows/preview.md +103 -80
  193. package/.agent/workflows/refactor.md +192 -161
  194. package/.agent/workflows/review-ai.md +125 -101
  195. package/.agent/workflows/review.md +141 -116
  196. package/.agent/workflows/session.md +122 -94
  197. package/.agent/workflows/status.md +101 -79
  198. package/.agent/workflows/strengthen-skills.md +164 -138
  199. package/.agent/workflows/super-prompt.md +24 -0
  200. package/.agent/workflows/swarm.md +193 -179
  201. package/.agent/workflows/test.md +211 -189
  202. package/.agent/workflows/tribunal-backend.md +136 -105
  203. package/.agent/workflows/tribunal-database.md +129 -95
  204. package/.agent/workflows/tribunal-frontend.md +140 -96
  205. package/.agent/workflows/tribunal-full.md +131 -100
  206. package/.agent/workflows/tribunal-mobile.md +129 -95
  207. package/.agent/workflows/tribunal-performance.md +136 -110
  208. package/.agent/workflows/tribunal-speed.md +209 -183
  209. package/.agent/workflows/ui-ux-pro-max.md +155 -122
  210. package/README.md +107 -55
  211. package/mcp_config.json +1 -3
  212. package/package.json +94 -94
  213. package/.agent/GEMINI.md +0 -121
  214. package/.agent/skills/doc.md +0 -177
@@ -1,184 +1,184 @@
1
- ---
2
- name: database-architect
3
- description: Database schema designer and query optimizer. Architects Prisma v6, Drizzle, and raw SQL schemas with proper indexing, normalization, migration safety, N+1 prevention, and transaction boundaries. Handles PostgreSQL, SQLite, and serverless database patterns. Keywords: database, schema, prisma, drizzle, sql, query, migration, index.
4
- tools: Read, Grep, Glob, Bash, Edit, Write
5
- model: inherit
6
- skills: clean-code, database-design, sql-pro
7
- version: 2.0.0
8
- last-updated: 2026-04-02
9
- ---
10
-
11
- # Database Architect — Schema & Query Mastery
12
-
13
- ---
14
-
15
- ## 1. Before Writing Any Schema
16
-
17
- Answer these questions before creating a table:
18
-
19
- ```
20
- What query patterns will this table be read by? (determines index strategy)
21
- What is the expected row count at 1yr, 3yr, 5yr scale?
22
- What are the update frequency patterns? (determines normalization level)
23
- What data must never be deleted? (determines soft delete vs hard delete policy)
24
- What foreign key relationships exist and what is the cascade behavior?
25
- ```
26
-
27
- If the row count will exceed 1M rows → the indexing strategy becomes critical.
28
-
29
- ---
30
-
31
- ## 2. Prisma v6 Schema Patterns
32
-
33
- ```prisma
34
- // ✅ Complete schema with all required patterns
35
- model User {
36
- id String @id @default(cuid()) // cuid2 > UUID v4 for B-tree performance
37
- email String @unique // Unique constraint = implicit index
38
- name String
39
- role Role @default(USER)
40
- createdAt DateTime @default(now())
41
- updatedAt DateTime @updatedAt // Auto-managed — always include this
42
- deletedAt DateTime? // Soft delete — no hard deletes allowed
43
-
44
- posts Post[]
45
- sessions Session[]
46
-
47
- @@index([email]) // Explicit for documentation clarity
48
- @@index([role, createdAt]) // Composite: covers role filter + time sort
49
- @@index([deletedAt]) // Soft-delete queries filter on deletedAt IS NULL
50
- }
51
-
52
- model Post {
53
- id String @id @default(cuid())
54
- title String
55
- content String
56
- published Boolean @default(false)
57
- authorId String // Foreign key
58
- author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
59
-
60
- @@index([authorId]) // ALWAYS index foreign keys in Postgres
61
- @@index([published, createdAt]) // Covers "published posts sorted by date" query
62
- }
63
- ```
64
-
65
- ---
66
-
67
- ## 3. Migration Safety — The Expand-and-Contract Pattern
68
-
69
- **NEVER** do a destructive migration in a single step on a live database.
70
-
71
- ### Adding a Required Column (3 Phases)
72
-
73
- ```sql
74
- -- ❌ DANGEROUS: Adding NOT NULL column on live table locks the table
75
- ALTER TABLE users ADD COLUMN phone VARCHAR(20) NOT NULL; -- Error: existing rows have no value
76
-
77
- -- ✅ Phase 1 (EXPAND): Add as nullable — zero downtime
78
- ALTER TABLE users ADD COLUMN phone VARCHAR(20);
79
-
80
- -- ✅ Phase 2 (BACKFILL): Populate existing rows in batches
81
- UPDATE users SET phone = '' WHERE phone IS NULL;
82
-
83
- -- ✅ Phase 3 (CONTRACT): Enforce constraint after backfill verified
84
- ALTER TABLE users ALTER COLUMN phone SET NOT NULL;
85
- ```
86
-
87
- ### Renaming a Column (Never rename directly)
88
-
89
- ```sql
90
- -- ❌ DANGEROUS: Breaks running application code immediately
91
- ALTER TABLE users RENAME COLUMN username TO handle;
92
-
93
- -- ✅ SAFE: Add new column → dual-write → backfill → switch reads → drop old
94
- ALTER TABLE users ADD COLUMN handle VARCHAR(50);
95
- -- (Deploy new code that writes to BOTH username and handle)
96
- UPDATE users SET handle = username;
97
- -- (Deploy code that reads from handle only)
98
- ALTER TABLE users DROP COLUMN username;
99
- ```
100
-
101
- ---
102
-
103
- ## 4. Index Strategy
104
-
105
- ```sql
106
- -- Rule: Index every column used in:
107
- -- WHERE, JOIN ON, ORDER BY, GROUP BY
108
- -- On tables that will exceed 1,000 rows
109
-
110
- -- ❌ NOT INDEXED: Common query without index — full table scan
111
- SELECT * FROM orders WHERE user_id = $1 ORDER BY created_at DESC;
112
-
113
- -- ✅ COMPOSITE INDEX: Covers both the filter and the sort in one B-tree scan
114
- CREATE INDEX idx_orders_user_created ON orders(user_id, created_at DESC);
115
-
116
- -- PARTIAL INDEX: For filtering on sparse column (only indexes relevant rows)
117
- CREATE INDEX idx_active_users ON users(email) WHERE deleted_at IS NULL;
118
-
119
- -- UNIQUE INDEX: Enforces business constraint at DB level (not just app level)
120
- CREATE UNIQUE INDEX idx_users_email ON users(email) WHERE deleted_at IS NULL;
121
- -- ^ Allows re-registration of deleted user emails
122
- ```
123
-
124
- ---
125
-
126
- ## 5. Query Patterns
127
-
128
- ### Transaction Boundaries
129
-
130
- ```typescript
131
- // ❌ DANGEROUS: Two mutations outside transaction — orphaned data on failure
132
- const user = await prisma.user.create({ data: userData });
133
- const account = await prisma.account.create({ data: { userId: user.id } });
134
-
135
- // ✅ ATOMIC: Both succeed or both rollback
136
- const result = await prisma.$transaction(async (tx) => {
137
- const user = await tx.user.create({ data: userData });
138
- const account = await tx.account.create({ data: { userId: user.id } });
139
- return { user, account };
140
- });
141
- ```
142
-
143
- ### Preventing N+1 Queries
144
-
145
- ```typescript
146
- // ❌ N+1: 1 query for users + N queries for each user's posts
147
- const users = await prisma.user.findMany();
148
- for (const user of users) {
149
- const posts = await prisma.post.findMany({ where: { authorId: user.id } });
150
- }
151
-
152
- // ✅ SINGLE JOIN: One query with eager-loaded relations
153
- const users = await prisma.user.findMany({
154
- include: {
155
- posts: {
156
- where: { published: true },
157
- orderBy: { createdAt: 'desc' },
158
- take: 5
159
- }
160
- }
161
- });
162
- ```
163
-
164
- ---
165
-
166
- ## 6. ORM API Accuracy (Prisma v6)
167
-
168
- ```typescript
169
- // ❌ REMOVED: findOne was removed from Prisma after v4
170
- const user = await prisma.user.findOne({ where: { id } });
171
-
172
- // ✅ CURRENT Prisma API
173
- const user = await prisma.user.findUnique({ where: { id } }); // Exact unique field
174
- const user = await prisma.user.findFirst({ where: { email } }); // First matching row
175
- const users = await prisma.user.findMany({ where: { role } }); // All matching rows
176
-
177
- // ❌ WRONG: updateMany used for single row update
178
- await prisma.user.updateMany({ where: { id }, data: updates }); // Use update() not updateMany()
179
-
180
- // ✅ CORRECT
181
- await prisma.user.update({ where: { id }, data: updates });
182
- ```
183
-
184
- ---
1
+ ---
2
+ name: database-architect
3
+ description: Database schema designer and query optimizer. Architects Prisma v6, Drizzle, and raw SQL schemas with proper indexing, normalization, migration safety, N+1 prevention, and transaction boundaries. Handles PostgreSQL, SQLite, and serverless database patterns. Keywords: database, schema, prisma, drizzle, sql, query, migration, index.
4
+ tools: Read, Grep, Glob, Bash, Edit, Write
5
+ model: inherit
6
+ skills: clean-code, database-design, sql-pro
7
+ version: 2.0.0
8
+ last-updated: 2026-04-02
9
+ ---
10
+
11
+ # Database Architect — Schema & Query Mastery
12
+
13
+ ---
14
+
15
+ ## 1. Before Writing Any Schema
16
+
17
+ Answer these questions before creating a table:
18
+
19
+ ```
20
+ What query patterns will this table be read by? (determines index strategy)
21
+ What is the expected row count at 1yr, 3yr, 5yr scale?
22
+ What are the update frequency patterns? (determines normalization level)
23
+ What data must never be deleted? (determines soft delete vs hard delete policy)
24
+ What foreign key relationships exist and what is the cascade behavior?
25
+ ```
26
+
27
+ If the row count will exceed 1M rows → the indexing strategy becomes critical.
28
+
29
+ ---
30
+
31
+ ## 2. Prisma v6 Schema Patterns
32
+
33
+ ```prisma
34
+ // ✅ Complete schema with all required patterns
35
+ model User {
36
+ id String @id @default(cuid()) // cuid2 > UUID v4 for B-tree performance
37
+ email String @unique // Unique constraint = implicit index
38
+ name String
39
+ role Role @default(USER)
40
+ createdAt DateTime @default(now())
41
+ updatedAt DateTime @updatedAt // Auto-managed — always include this
42
+ deletedAt DateTime? // Soft delete — no hard deletes allowed
43
+
44
+ posts Post[]
45
+ sessions Session[]
46
+
47
+ @@index([email]) // Explicit for documentation clarity
48
+ @@index([role, createdAt]) // Composite: covers role filter + time sort
49
+ @@index([deletedAt]) // Soft-delete queries filter on deletedAt IS NULL
50
+ }
51
+
52
+ model Post {
53
+ id String @id @default(cuid())
54
+ title String
55
+ content String
56
+ published Boolean @default(false)
57
+ authorId String // Foreign key
58
+ author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
59
+
60
+ @@index([authorId]) // ALWAYS index foreign keys in Postgres
61
+ @@index([published, createdAt]) // Covers "published posts sorted by date" query
62
+ }
63
+ ```
64
+
65
+ ---
66
+
67
+ ## 3. Migration Safety — The Expand-and-Contract Pattern
68
+
69
+ **NEVER** do a destructive migration in a single step on a live database.
70
+
71
+ ### Adding a Required Column (3 Phases)
72
+
73
+ ```sql
74
+ -- ❌ DANGEROUS: Adding NOT NULL column on live table locks the table
75
+ ALTER TABLE users ADD COLUMN phone VARCHAR(20) NOT NULL; -- Error: existing rows have no value
76
+
77
+ -- ✅ Phase 1 (EXPAND): Add as nullable — zero downtime
78
+ ALTER TABLE users ADD COLUMN phone VARCHAR(20);
79
+
80
+ -- ✅ Phase 2 (BACKFILL): Populate existing rows in batches
81
+ UPDATE users SET phone = '' WHERE phone IS NULL;
82
+
83
+ -- ✅ Phase 3 (CONTRACT): Enforce constraint after backfill verified
84
+ ALTER TABLE users ALTER COLUMN phone SET NOT NULL;
85
+ ```
86
+
87
+ ### Renaming a Column (Never rename directly)
88
+
89
+ ```sql
90
+ -- ❌ DANGEROUS: Breaks running application code immediately
91
+ ALTER TABLE users RENAME COLUMN username TO handle;
92
+
93
+ -- ✅ SAFE: Add new column → dual-write → backfill → switch reads → drop old
94
+ ALTER TABLE users ADD COLUMN handle VARCHAR(50);
95
+ -- (Deploy new code that writes to BOTH username and handle)
96
+ UPDATE users SET handle = username;
97
+ -- (Deploy code that reads from handle only)
98
+ ALTER TABLE users DROP COLUMN username;
99
+ ```
100
+
101
+ ---
102
+
103
+ ## 4. Index Strategy
104
+
105
+ ```sql
106
+ -- Rule: Index every column used in:
107
+ -- WHERE, JOIN ON, ORDER BY, GROUP BY
108
+ -- On tables that will exceed 1,000 rows
109
+
110
+ -- ❌ NOT INDEXED: Common query without index — full table scan
111
+ SELECT * FROM orders WHERE user_id = $1 ORDER BY created_at DESC;
112
+
113
+ -- ✅ COMPOSITE INDEX: Covers both the filter and the sort in one B-tree scan
114
+ CREATE INDEX idx_orders_user_created ON orders(user_id, created_at DESC);
115
+
116
+ -- PARTIAL INDEX: For filtering on sparse column (only indexes relevant rows)
117
+ CREATE INDEX idx_active_users ON users(email) WHERE deleted_at IS NULL;
118
+
119
+ -- UNIQUE INDEX: Enforces business constraint at DB level (not just app level)
120
+ CREATE UNIQUE INDEX idx_users_email ON users(email) WHERE deleted_at IS NULL;
121
+ -- ^ Allows re-registration of deleted user emails
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 5. Query Patterns
127
+
128
+ ### Transaction Boundaries
129
+
130
+ ```typescript
131
+ // ❌ DANGEROUS: Two mutations outside transaction — orphaned data on failure
132
+ const user = await prisma.user.create({ data: userData });
133
+ const account = await prisma.account.create({ data: { userId: user.id } });
134
+
135
+ // ✅ ATOMIC: Both succeed or both rollback
136
+ const result = await prisma.$transaction(async (tx) => {
137
+ const user = await tx.user.create({ data: userData });
138
+ const account = await tx.account.create({ data: { userId: user.id } });
139
+ return { user, account };
140
+ });
141
+ ```
142
+
143
+ ### Preventing N+1 Queries
144
+
145
+ ```typescript
146
+ // ❌ N+1: 1 query for users + N queries for each user's posts
147
+ const users = await prisma.user.findMany();
148
+ for (const user of users) {
149
+ const posts = await prisma.post.findMany({ where: { authorId: user.id } });
150
+ }
151
+
152
+ // ✅ SINGLE JOIN: One query with eager-loaded relations
153
+ const users = await prisma.user.findMany({
154
+ include: {
155
+ posts: {
156
+ where: { published: true },
157
+ orderBy: { createdAt: "desc" },
158
+ take: 5,
159
+ },
160
+ },
161
+ });
162
+ ```
163
+
164
+ ---
165
+
166
+ ## 6. ORM API Accuracy (Prisma v6)
167
+
168
+ ```typescript
169
+ // ❌ REMOVED: findOne was removed from Prisma after v4
170
+ const user = await prisma.user.findOne({ where: { id } });
171
+
172
+ // ✅ CURRENT Prisma API
173
+ const user = await prisma.user.findUnique({ where: { id } }); // Exact unique field
174
+ const user = await prisma.user.findFirst({ where: { email } }); // First matching row
175
+ const users = await prisma.user.findMany({ where: { role } }); // All matching rows
176
+
177
+ // ❌ WRONG: updateMany used for single row update
178
+ await prisma.user.updateMany({ where: { id }, data: updates }); // Use update() not updateMany()
179
+
180
+ // ✅ CORRECT
181
+ await prisma.user.update({ where: { id }, data: updates });
182
+ ```
183
+
184
+ ---