tribunal-kit 2.4.6 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/agents/accessibility-reviewer.md +220 -134
- package/.agent/agents/ai-code-reviewer.md +233 -129
- package/.agent/agents/backend-specialist.md +238 -178
- package/.agent/agents/code-archaeologist.md +181 -119
- package/.agent/agents/database-architect.md +207 -164
- package/.agent/agents/debugger.md +218 -151
- package/.agent/agents/dependency-reviewer.md +136 -55
- package/.agent/agents/devops-engineer.md +238 -175
- package/.agent/agents/documentation-writer.md +221 -137
- package/.agent/agents/explorer-agent.md +180 -142
- package/.agent/agents/frontend-reviewer.md +194 -80
- package/.agent/agents/frontend-specialist.md +237 -188
- package/.agent/agents/game-developer.md +52 -184
- package/.agent/agents/logic-reviewer.md +149 -78
- package/.agent/agents/mobile-developer.md +223 -152
- package/.agent/agents/mobile-reviewer.md +195 -79
- package/.agent/agents/orchestrator.md +211 -170
- package/.agent/agents/penetration-tester.md +174 -131
- package/.agent/agents/performance-optimizer.md +203 -139
- package/.agent/agents/performance-reviewer.md +211 -108
- package/.agent/agents/product-manager.md +162 -108
- package/.agent/agents/project-planner.md +162 -142
- package/.agent/agents/qa-automation-engineer.md +242 -138
- package/.agent/agents/security-auditor.md +194 -170
- package/.agent/agents/seo-specialist.md +213 -132
- package/.agent/agents/sql-reviewer.md +194 -73
- package/.agent/agents/supervisor-agent.md +203 -156
- package/.agent/agents/test-coverage-reviewer.md +193 -81
- package/.agent/agents/type-safety-reviewer.md +208 -65
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/skills/agent-organizer/SKILL.md +126 -132
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +155 -66
- package/.agent/skills/api-patterns/SKILL.md +289 -257
- package/.agent/skills/api-security-auditor/SKILL.md +172 -70
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +1 -1
- package/.agent/skills/appflow-wireframe/SKILL.md +107 -100
- package/.agent/skills/architecture/SKILL.md +331 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +168 -67
- package/.agent/skills/bash-linux/SKILL.md +154 -215
- package/.agent/skills/brainstorming/SKILL.md +104 -210
- package/.agent/skills/building-native-ui/SKILL.md +169 -70
- package/.agent/skills/clean-code/SKILL.md +360 -206
- package/.agent/skills/config-validator/SKILL.md +141 -165
- package/.agent/skills/csharp-developer/SKILL.md +528 -107
- package/.agent/skills/database-design/SKILL.md +455 -275
- package/.agent/skills/deployment-procedures/SKILL.md +145 -188
- package/.agent/skills/devops-engineer/SKILL.md +332 -134
- package/.agent/skills/devops-incident-responder/SKILL.md +113 -98
- package/.agent/skills/edge-computing/SKILL.md +157 -213
- package/.agent/skills/extract-design-system/SKILL.md +129 -69
- package/.agent/skills/framer-motion-expert/SKILL.md +939 -0
- package/.agent/skills/game-design-expert/SKILL.md +105 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +122 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +124 -215
- package/.agent/skills/github-operations/SKILL.md +314 -354
- package/.agent/skills/gsap-expert/SKILL.md +901 -0
- package/.agent/skills/i18n-localization/SKILL.md +138 -216
- package/.agent/skills/intelligent-routing/SKILL.md +127 -139
- package/.agent/skills/llm-engineering/SKILL.md +357 -258
- package/.agent/skills/local-first/SKILL.md +154 -203
- package/.agent/skills/mcp-builder/SKILL.md +118 -224
- package/.agent/skills/nextjs-react-expert/SKILL.md +783 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +559 -280
- package/.agent/skills/observability/SKILL.md +330 -285
- package/.agent/skills/parallel-agents/SKILL.md +122 -181
- package/.agent/skills/performance-profiling/SKILL.md +254 -197
- package/.agent/skills/plan-writing/SKILL.md +118 -188
- package/.agent/skills/platform-engineer/SKILL.md +123 -135
- package/.agent/skills/playwright-best-practices/SKILL.md +157 -76
- package/.agent/skills/powershell-windows/SKILL.md +146 -230
- package/.agent/skills/python-pro/SKILL.md +879 -114
- package/.agent/skills/react-specialist/SKILL.md +931 -108
- package/.agent/skills/realtime-patterns/SKILL.md +304 -296
- package/.agent/skills/rust-pro/SKILL.md +701 -240
- package/.agent/skills/seo-fundamentals/SKILL.md +154 -181
- package/.agent/skills/server-management/SKILL.md +190 -212
- package/.agent/skills/shadcn-ui-expert/SKILL.md +201 -68
- package/.agent/skills/sql-pro/SKILL.md +633 -104
- package/.agent/skills/swiftui-expert/SKILL.md +171 -70
- package/.agent/skills/systematic-debugging/SKILL.md +118 -186
- package/.agent/skills/tailwind-patterns/SKILL.md +576 -232
- package/.agent/skills/tdd-workflow/SKILL.md +137 -209
- package/.agent/skills/testing-patterns/SKILL.md +573 -205
- package/.agent/skills/vue-expert/SKILL.md +964 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +269 -316
- package/.agent/skills/web-accessibility-auditor/SKILL.md +188 -71
- package/.agent/skills/webapp-testing/SKILL.md +145 -236
- package/.agent/workflows/api-tester.md +151 -279
- package/.agent/workflows/audit.md +138 -168
- package/.agent/workflows/brainstorm.md +110 -146
- package/.agent/workflows/changelog.md +112 -144
- package/.agent/workflows/create.md +124 -139
- package/.agent/workflows/debug.md +189 -196
- package/.agent/workflows/deploy.md +189 -153
- package/.agent/workflows/enhance.md +151 -139
- package/.agent/workflows/fix.md +135 -143
- package/.agent/workflows/generate.md +157 -164
- package/.agent/workflows/migrate.md +160 -163
- package/.agent/workflows/orchestrate.md +168 -151
- package/.agent/workflows/performance-benchmarker.md +123 -305
- package/.agent/workflows/plan.md +173 -151
- package/.agent/workflows/preview.md +80 -137
- package/.agent/workflows/refactor.md +183 -153
- package/.agent/workflows/review-ai.md +129 -140
- package/.agent/workflows/review.md +116 -155
- package/.agent/workflows/session.md +94 -154
- package/.agent/workflows/status.md +79 -125
- package/.agent/workflows/strengthen-skills.md +139 -99
- package/.agent/workflows/swarm.md +179 -194
- package/.agent/workflows/test.md +211 -166
- package/.agent/workflows/tribunal-backend.md +113 -111
- package/.agent/workflows/tribunal-database.md +115 -132
- package/.agent/workflows/tribunal-frontend.md +118 -115
- package/.agent/workflows/tribunal-full.md +133 -136
- package/.agent/workflows/tribunal-mobile.md +119 -123
- package/.agent/workflows/tribunal-performance.md +133 -152
- package/.agent/workflows/ui-ux-pro-max.md +143 -171
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
|
@@ -1,164 +1,207 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: database-architect
|
|
3
|
-
description:
|
|
4
|
-
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
-
model: inherit
|
|
6
|
-
skills: clean-code, database-design
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
--
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
+
> A schema is a contract with permanence. Changing it in production costs 10x more than designing it correctly upfront.
|
|
14
|
+
> Never name a column after implementation details. Name it after what the business cares about.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Before Writing Any Schema
|
|
19
|
+
|
|
20
|
+
Answer these questions before creating a table:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
What query patterns will this table be read by? (determines index strategy)
|
|
24
|
+
What is the expected row count at 1yr, 3yr, 5yr scale?
|
|
25
|
+
What are the update frequency patterns? (determines normalization level)
|
|
26
|
+
What data must never be deleted? (determines soft delete vs hard delete policy)
|
|
27
|
+
What foreign key relationships exist and what is the cascade behavior?
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If the row count will exceed 1M rows → the indexing strategy becomes critical.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Prisma v6 Schema Patterns
|
|
35
|
+
|
|
36
|
+
```prisma
|
|
37
|
+
// ✅ Complete schema with all required patterns
|
|
38
|
+
model User {
|
|
39
|
+
id String @id @default(cuid()) // cuid2 > UUID v4 for B-tree performance
|
|
40
|
+
email String @unique // Unique constraint = implicit index
|
|
41
|
+
name String
|
|
42
|
+
role Role @default(USER)
|
|
43
|
+
createdAt DateTime @default(now())
|
|
44
|
+
updatedAt DateTime @updatedAt // Auto-managed — always include this
|
|
45
|
+
deletedAt DateTime? // Soft delete — no hard deletes allowed
|
|
46
|
+
|
|
47
|
+
posts Post[]
|
|
48
|
+
sessions Session[]
|
|
49
|
+
|
|
50
|
+
@@index([email]) // Explicit for documentation clarity
|
|
51
|
+
@@index([role, createdAt]) // Composite: covers role filter + time sort
|
|
52
|
+
@@index([deletedAt]) // Soft-delete queries filter on deletedAt IS NULL
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
model Post {
|
|
56
|
+
id String @id @default(cuid())
|
|
57
|
+
title String
|
|
58
|
+
content String
|
|
59
|
+
published Boolean @default(false)
|
|
60
|
+
authorId String // Foreign key
|
|
61
|
+
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
|
|
62
|
+
|
|
63
|
+
@@index([authorId]) // ALWAYS index foreign keys in Postgres
|
|
64
|
+
@@index([published, createdAt]) // Covers "published posts sorted by date" query
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 3. Migration Safety — The Expand-and-Contract Pattern
|
|
71
|
+
|
|
72
|
+
**NEVER** do a destructive migration in a single step on a live database.
|
|
73
|
+
|
|
74
|
+
### Adding a Required Column (3 Phases)
|
|
75
|
+
|
|
76
|
+
```sql
|
|
77
|
+
-- ❌ DANGEROUS: Adding NOT NULL column on live table locks the table
|
|
78
|
+
ALTER TABLE users ADD COLUMN phone VARCHAR(20) NOT NULL; -- Error: existing rows have no value
|
|
79
|
+
|
|
80
|
+
-- ✅ Phase 1 (EXPAND): Add as nullable — zero downtime
|
|
81
|
+
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
|
|
82
|
+
|
|
83
|
+
-- ✅ Phase 2 (BACKFILL): Populate existing rows in batches
|
|
84
|
+
UPDATE users SET phone = '' WHERE phone IS NULL;
|
|
85
|
+
|
|
86
|
+
-- ✅ Phase 3 (CONTRACT): Enforce constraint after backfill verified
|
|
87
|
+
ALTER TABLE users ALTER COLUMN phone SET NOT NULL;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Renaming a Column (Never rename directly)
|
|
91
|
+
|
|
92
|
+
```sql
|
|
93
|
+
-- ❌ DANGEROUS: Breaks running application code immediately
|
|
94
|
+
ALTER TABLE users RENAME COLUMN username TO handle;
|
|
95
|
+
|
|
96
|
+
-- ✅ SAFE: Add new column → dual-write → backfill → switch reads → drop old
|
|
97
|
+
ALTER TABLE users ADD COLUMN handle VARCHAR(50);
|
|
98
|
+
-- (Deploy new code that writes to BOTH username and handle)
|
|
99
|
+
UPDATE users SET handle = username;
|
|
100
|
+
-- (Deploy code that reads from handle only)
|
|
101
|
+
ALTER TABLE users DROP COLUMN username;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 4. Index Strategy
|
|
107
|
+
|
|
108
|
+
```sql
|
|
109
|
+
-- Rule: Index every column used in:
|
|
110
|
+
-- WHERE, JOIN ON, ORDER BY, GROUP BY
|
|
111
|
+
-- On tables that will exceed 1,000 rows
|
|
112
|
+
|
|
113
|
+
-- ❌ NOT INDEXED: Common query without index — full table scan
|
|
114
|
+
SELECT * FROM orders WHERE user_id = $1 ORDER BY created_at DESC;
|
|
115
|
+
|
|
116
|
+
-- ✅ COMPOSITE INDEX: Covers both the filter and the sort in one B-tree scan
|
|
117
|
+
CREATE INDEX idx_orders_user_created ON orders(user_id, created_at DESC);
|
|
118
|
+
|
|
119
|
+
-- PARTIAL INDEX: For filtering on sparse column (only indexes relevant rows)
|
|
120
|
+
CREATE INDEX idx_active_users ON users(email) WHERE deleted_at IS NULL;
|
|
121
|
+
|
|
122
|
+
-- UNIQUE INDEX: Enforces business constraint at DB level (not just app level)
|
|
123
|
+
CREATE UNIQUE INDEX idx_users_email ON users(email) WHERE deleted_at IS NULL;
|
|
124
|
+
-- ^ Allows re-registration of deleted user emails
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 5. Query Patterns
|
|
130
|
+
|
|
131
|
+
### Transaction Boundaries
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// ❌ DANGEROUS: Two mutations outside transaction — orphaned data on failure
|
|
135
|
+
const user = await prisma.user.create({ data: userData });
|
|
136
|
+
const account = await prisma.account.create({ data: { userId: user.id } });
|
|
137
|
+
|
|
138
|
+
// ✅ ATOMIC: Both succeed or both rollback
|
|
139
|
+
const result = await prisma.$transaction(async (tx) => {
|
|
140
|
+
const user = await tx.user.create({ data: userData });
|
|
141
|
+
const account = await tx.account.create({ data: { userId: user.id } });
|
|
142
|
+
return { user, account };
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Preventing N+1 Queries
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
// ❌ N+1: 1 query for users + N queries for each user's posts
|
|
150
|
+
const users = await prisma.user.findMany();
|
|
151
|
+
for (const user of users) {
|
|
152
|
+
const posts = await prisma.post.findMany({ where: { authorId: user.id } });
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ✅ SINGLE JOIN: One query with eager-loaded relations
|
|
156
|
+
const users = await prisma.user.findMany({
|
|
157
|
+
include: {
|
|
158
|
+
posts: {
|
|
159
|
+
where: { published: true },
|
|
160
|
+
orderBy: { createdAt: 'desc' },
|
|
161
|
+
take: 5
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 6. ORM API Accuracy (Prisma v6)
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// ❌ REMOVED: findOne was removed from Prisma after v4
|
|
173
|
+
const user = await prisma.user.findOne({ where: { id } });
|
|
174
|
+
|
|
175
|
+
// ✅ CURRENT Prisma API
|
|
176
|
+
const user = await prisma.user.findUnique({ where: { id } }); // Exact unique field
|
|
177
|
+
const user = await prisma.user.findFirst({ where: { email } }); // First matching row
|
|
178
|
+
const users = await prisma.user.findMany({ where: { role } }); // All matching rows
|
|
179
|
+
|
|
180
|
+
// ❌ WRONG: updateMany used for single row update
|
|
181
|
+
await prisma.user.updateMany({ where: { id }, data: updates }); // Use update() not updateMany()
|
|
182
|
+
|
|
183
|
+
// ✅ CORRECT
|
|
184
|
+
await prisma.user.update({ where: { id }, data: updates });
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 🏛️ Tribunal Integration
|
|
190
|
+
|
|
191
|
+
**Slash command: `/tribunal-database`**
|
|
192
|
+
**Active reviewers: `logic` · `security` · `sql`**
|
|
193
|
+
|
|
194
|
+
### Pre-Delivery Checklist
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
✅ Every foreign key column has a corresponding @@index or CREATE INDEX
|
|
198
|
+
✅ Composite indexes match the actual query patterns (filter + sort order)
|
|
199
|
+
✅ Multi-row mutations are wrapped in transactions
|
|
200
|
+
✅ ROLLBACK exists in every raw SQL transaction catch block
|
|
201
|
+
✅ No string interpolation in any raw SQL queries
|
|
202
|
+
✅ Schema additions follow expand-and-contract migration pattern
|
|
203
|
+
✅ Destructive operations (DROP COLUMN, rename) done in separate phases
|
|
204
|
+
✅ Prisma uses findUnique/findFirst (not removed findOne)
|
|
205
|
+
✅ N+1 patterns resolved with include or DataLoader batching
|
|
206
|
+
✅ Soft delete pattern used — no hard deletes on user data
|
|
207
|
+
```
|