tribunal-kit 3.0.0 → 3.1.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/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +187 -220
- package/.agent/agents/ai-code-reviewer.md +199 -233
- package/.agent/agents/backend-specialist.md +215 -238
- package/.agent/agents/code-archaeologist.md +161 -181
- package/.agent/agents/database-architect.md +184 -207
- package/.agent/agents/debugger.md +191 -218
- package/.agent/agents/dependency-reviewer.md +103 -136
- package/.agent/agents/devops-engineer.md +218 -238
- package/.agent/agents/documentation-writer.md +201 -221
- package/.agent/agents/explorer-agent.md +160 -180
- package/.agent/agents/frontend-reviewer.md +160 -194
- package/.agent/agents/frontend-specialist.md +248 -237
- package/.agent/agents/game-developer.md +48 -52
- package/.agent/agents/logic-reviewer.md +116 -149
- package/.agent/agents/mobile-developer.md +200 -223
- package/.agent/agents/mobile-reviewer.md +162 -195
- package/.agent/agents/orchestrator.md +181 -211
- package/.agent/agents/penetration-tester.md +157 -174
- package/.agent/agents/performance-optimizer.md +183 -203
- package/.agent/agents/performance-reviewer.md +178 -211
- package/.agent/agents/product-manager.md +142 -162
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +142 -162
- package/.agent/agents/qa-automation-engineer.md +225 -242
- package/.agent/agents/security-auditor.md +174 -194
- package/.agent/agents/seo-specialist.md +193 -213
- package/.agent/agents/sql-reviewer.md +161 -194
- package/.agent/agents/supervisor-agent.md +184 -203
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +160 -193
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +175 -208
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +92 -126
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +126 -160
- package/.agent/skills/api-patterns/SKILL.md +123 -215
- package/.agent/skills/api-security-auditor/SKILL.md +143 -177
- package/.agent/skills/app-builder/SKILL.md +326 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +87 -121
- package/.agent/skills/architecture/SKILL.md +82 -252
- package/.agent/skills/authentication-best-practices/SKILL.md +139 -173
- package/.agent/skills/bash-linux/SKILL.md +120 -154
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +428 -104
- package/.agent/skills/building-native-ui/SKILL.md +143 -174
- package/.agent/skills/clean-code/SKILL.md +323 -360
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +107 -141
- package/.agent/skills/csharp-developer/SKILL.md +468 -528
- package/.agent/skills/database-design/SKILL.md +104 -369
- package/.agent/skills/deployment-procedures/SKILL.md +111 -145
- package/.agent/skills/devops-engineer/SKILL.md +295 -332
- package/.agent/skills/devops-incident-responder/SKILL.md +79 -113
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +19 -63
- package/.agent/skills/edge-computing/SKILL.md +123 -157
- package/.agent/skills/extract-design-system/SKILL.md +100 -134
- package/.agent/skills/framer-motion-expert/SKILL.md +111 -855
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +71 -105
- package/.agent/skills/game-engineering-expert/SKILL.md +88 -122
- package/.agent/skills/geo-fundamentals/SKILL.md +89 -124
- package/.agent/skills/github-operations/SKILL.md +279 -314
- package/.agent/skills/gsap-expert/SKILL.md +119 -826
- package/.agent/skills/i18n-localization/SKILL.md +104 -138
- package/.agent/skills/intelligent-routing/SKILL.md +159 -127
- package/.agent/skills/lint-and-validate/SKILL.md +8 -52
- package/.agent/skills/llm-engineering/SKILL.md +344 -357
- package/.agent/skills/local-first/SKILL.md +120 -154
- package/.agent/skills/mcp-builder/SKILL.md +84 -118
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +99 -698
- package/.agent/skills/nodejs-best-practices/SKILL.md +498 -559
- package/.agent/skills/observability/SKILL.md +293 -330
- package/.agent/skills/parallel-agents/SKILL.md +88 -122
- package/.agent/skills/performance-profiling/SKILL.md +217 -254
- package/.agent/skills/plan-writing/SKILL.md +84 -118
- package/.agent/skills/platform-engineer/SKILL.md +89 -123
- package/.agent/skills/playwright-best-practices/SKILL.md +128 -162
- package/.agent/skills/powershell-windows/SKILL.md +112 -146
- package/.agent/skills/python-patterns/SKILL.md +7 -35
- package/.agent/skills/python-pro/SKILL.md +148 -754
- package/.agent/skills/react-specialist/SKILL.md +123 -827
- package/.agent/skills/readme-builder/SKILL.md +15 -85
- package/.agent/skills/realtime-patterns/SKILL.md +269 -304
- package/.agent/skills/red-team-tactics/SKILL.md +10 -51
- package/.agent/skills/rust-pro/SKILL.md +623 -701
- package/.agent/skills/seo-fundamentals/SKILL.md +120 -154
- package/.agent/skills/server-management/SKILL.md +156 -190
- package/.agent/skills/shadcn-ui-expert/SKILL.md +172 -206
- package/.agent/skills/skill-creator/SKILL.md +18 -58
- package/.agent/skills/sql-pro/SKILL.md +579 -633
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
- package/.agent/skills/swiftui-expert/SKILL.md +142 -176
- package/.agent/skills/systematic-debugging/SKILL.md +84 -118
- package/.agent/skills/tailwind-patterns/SKILL.md +516 -576
- package/.agent/skills/tdd-workflow/SKILL.md +103 -137
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +512 -573
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +127 -866
- package/.agent/skills/vulnerability-scanner/SKILL.md +354 -269
- package/.agent/skills/web-accessibility-auditor/SKILL.md +159 -193
- package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
- package/.agent/skills/webapp-testing/SKILL.md +111 -145
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +151 -151
- package/.agent/workflows/audit.md +127 -138
- package/.agent/workflows/brainstorm.md +110 -110
- package/.agent/workflows/changelog.md +112 -112
- package/.agent/workflows/create.md +124 -124
- package/.agent/workflows/debug.md +165 -189
- package/.agent/workflows/deploy.md +180 -189
- package/.agent/workflows/enhance.md +128 -151
- package/.agent/workflows/fix.md +114 -135
- package/.agent/workflows/generate.md +12 -4
- package/.agent/workflows/migrate.md +160 -160
- package/.agent/workflows/orchestrate.md +168 -168
- package/.agent/workflows/performance-benchmarker.md +114 -123
- package/.agent/workflows/plan.md +173 -173
- package/.agent/workflows/preview.md +80 -80
- package/.agent/workflows/refactor.md +161 -183
- package/.agent/workflows/review-ai.md +101 -129
- package/.agent/workflows/review.md +116 -116
- package/.agent/workflows/session.md +94 -94
- package/.agent/workflows/status.md +79 -79
- package/.agent/workflows/strengthen-skills.md +138 -139
- package/.agent/workflows/swarm.md +179 -179
- package/.agent/workflows/test.md +189 -211
- package/.agent/workflows/tribunal-backend.md +93 -113
- package/.agent/workflows/tribunal-database.md +94 -115
- package/.agent/workflows/tribunal-frontend.md +95 -118
- package/.agent/workflows/tribunal-full.md +92 -133
- package/.agent/workflows/tribunal-mobile.md +94 -119
- package/.agent/workflows/tribunal-performance.md +109 -133
- package/.agent/workflows/ui-ux-pro-max.md +122 -143
- package/package.json +1 -1
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
|
@@ -2,184 +2,80 @@
|
|
|
2
2
|
name: architecture
|
|
3
3
|
description: Software architecture mastery. System design patterns, clean architecture, hexagonal/ports-and-adapters, event-driven architecture, microservices vs monolith decision framework, CQRS, domain-driven design, Architecture Decision Records (ADRs), and scalability patterns. Use when making architecture decisions, designing systems, or documenting technical decisions.
|
|
4
4
|
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
-
version:
|
|
6
|
-
last-updated: 2026-04-
|
|
7
|
-
applies-to-model: gemini-
|
|
5
|
+
version: 3.1.0
|
|
6
|
+
last-updated: 2026-04-07
|
|
7
|
+
applies-to-model: gemini-3-1-pro, claude-3-7-sonnet
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Architecture — System Design Mastery
|
|
11
11
|
|
|
12
|
-
> Architecture is the set of decisions you wish you could get right the first time.
|
|
13
|
-
> Every architecture decision is a trade-off. Document the trade-off, not just the choice.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
12
|
## Architecture Selection
|
|
18
13
|
|
|
19
14
|
```
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
│ │
|
|
29
|
-
│ Scale requirements? │
|
|
30
|
-
│ ├── Single region, <10K RPM → Monolith │
|
|
31
|
-
│ ├── Multi-region, <100K RPM → Monolith + CDN + Read Replicas │
|
|
32
|
-
│ └── Global, >100K RPM → Microservices + Edge │
|
|
33
|
-
│ │
|
|
34
|
-
│ Deployment cadence? │
|
|
35
|
-
│ ├── Weekly releases → Monolith │
|
|
36
|
-
│ ├── Daily releases, different modules → Modular Monolith │
|
|
37
|
-
│ └── Continuous per-service deployment → Microservices │
|
|
38
|
-
│ │
|
|
39
|
-
│ ❌ HALLUCINATION TRAP: Microservices are NOT inherently better │
|
|
40
|
-
│ A well-structured monolith beats a poorly designed microservice│
|
|
41
|
-
│ architecture. Start monolith. Extract services when you MUST. │
|
|
42
|
-
└────────────────────────────────────────────────────────────────┘
|
|
15
|
+
Team size? Scale? Cadence?
|
|
16
|
+
1–5 → Monolith <10K RPM → Monolith Weekly → Monolith
|
|
17
|
+
5–20 → Mod. Mono <100K RPM → Mono+CDN Daily → Modular Mono
|
|
18
|
+
20+ → Microsvcs >100K RPM → Microsvcs Per-svc → Microsvcs
|
|
19
|
+
|
|
20
|
+
❌ Microservices are NOT inherently better.
|
|
21
|
+
A well-structured monolith beats a poorly designed microservice system.
|
|
22
|
+
Start monolith. Extract services only when proven necessary.
|
|
43
23
|
```
|
|
44
24
|
|
|
25
|
+
**3 Questions Before Any Pattern:**
|
|
26
|
+
1. What SPECIFIC problem does this pattern solve?
|
|
27
|
+
2. Is there a simpler solution?
|
|
28
|
+
3. Can we add this LATER when proven needed?
|
|
29
|
+
|
|
45
30
|
---
|
|
46
31
|
|
|
47
|
-
## Clean Architecture (
|
|
32
|
+
## Clean Architecture (Dependency Rule)
|
|
48
33
|
|
|
49
34
|
```
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
│ Use Cases / Commands / Queries / DTOs │
|
|
56
|
-
├───────────────────────────────────────────────┤
|
|
57
|
-
│ Domain Layer (Core) │
|
|
58
|
-
│ Entities / Value Objects / Domain Events │
|
|
59
|
-
│ Business Rules / Interfaces (Ports) │
|
|
60
|
-
├───────────────────────────────────────────────┤
|
|
61
|
-
│ Infrastructure Layer │
|
|
62
|
-
│ Database / External APIs / File System │
|
|
63
|
-
│ Message Queues / Email / Cache (Adapters) │
|
|
64
|
-
└───────────────────────────────────────────────┘
|
|
65
|
-
|
|
66
|
-
Dependency Rule: Dependencies point INWARD only.
|
|
67
|
-
- Infrastructure → Application → Domain
|
|
68
|
-
- Domain knows NOTHING about infrastructure
|
|
69
|
-
- Application defines interfaces (ports)
|
|
70
|
-
- Infrastructure implements them (adapters)
|
|
35
|
+
Presentation → Application → Domain ← Infrastructure
|
|
36
|
+
(Controllers) (Use Cases) (Entities) (DB, APIs)
|
|
37
|
+
|
|
38
|
+
Dependency Rule: arrows point INWARD. Domain knows NOTHING about infra.
|
|
39
|
+
Application defines interfaces (ports). Infrastructure implements them (adapters).
|
|
71
40
|
```
|
|
72
41
|
|
|
73
42
|
```typescript
|
|
74
|
-
// Domain
|
|
75
|
-
interface UserRepository {
|
|
76
|
-
findById(id: string): Promise<User | null>;
|
|
77
|
-
save(user: User): Promise<void>;
|
|
78
|
-
}
|
|
79
|
-
|
|
43
|
+
// Domain — pure business logic, zero external dependencies
|
|
44
|
+
interface UserRepository { findById(id: string): Promise<User | null>; }
|
|
80
45
|
class User {
|
|
81
|
-
constructor(
|
|
82
|
-
public readonly id: string,
|
|
83
|
-
public name: string,
|
|
84
|
-
public email: string,
|
|
85
|
-
private _role: UserRole,
|
|
86
|
-
) {}
|
|
87
|
-
|
|
88
46
|
promote(): void {
|
|
89
|
-
if (this._role === UserRole.ADMIN)
|
|
90
|
-
throw new DomainError("Already admin");
|
|
91
|
-
}
|
|
47
|
+
if (this._role === UserRole.ADMIN) throw new DomainError("Already admin");
|
|
92
48
|
this._role = UserRole.ADMIN;
|
|
93
49
|
}
|
|
94
50
|
}
|
|
95
51
|
|
|
96
|
-
// Application
|
|
52
|
+
// Application — orchestrates use cases
|
|
97
53
|
class PromoteUserUseCase {
|
|
98
|
-
constructor(
|
|
99
|
-
private userRepo: UserRepository,
|
|
100
|
-
private eventBus: EventBus,
|
|
101
|
-
) {}
|
|
102
|
-
|
|
103
54
|
async execute(userId: string): Promise<void> {
|
|
104
55
|
const user = await this.userRepo.findById(userId);
|
|
105
56
|
if (!user) throw new NotFoundError("User", userId);
|
|
106
|
-
|
|
107
|
-
user.promote(); // domain logic
|
|
57
|
+
user.promote();
|
|
108
58
|
await this.userRepo.save(user);
|
|
109
59
|
await this.eventBus.publish(new UserPromotedEvent(userId));
|
|
110
60
|
}
|
|
111
61
|
}
|
|
112
62
|
|
|
113
|
-
// Infrastructure — concrete implementations
|
|
63
|
+
// Infrastructure — concrete implementations of ports
|
|
114
64
|
class PostgresUserRepository implements UserRepository {
|
|
115
|
-
async findById(id: string)
|
|
116
|
-
const row = await db.query("SELECT * FROM users WHERE id = $1", [id]);
|
|
117
|
-
return row ? User.fromRow(row) : null;
|
|
118
|
-
}
|
|
65
|
+
async findById(id: string) { /* db.query(...) */ }
|
|
119
66
|
}
|
|
120
67
|
```
|
|
121
68
|
|
|
122
69
|
---
|
|
123
70
|
|
|
124
|
-
## CQRS
|
|
71
|
+
## CQRS
|
|
125
72
|
|
|
126
73
|
```
|
|
127
|
-
Commands (Write)
|
|
128
|
-
|
|
129
|
-
│ CreateUser │──→ Write DB ──→ │ UserListView │
|
|
130
|
-
│ UpdateOrder │ (normalized) │ OrderSummary │
|
|
131
|
-
│ DeletePost │ │ Dashboard │
|
|
132
|
-
└─────────────┘ └──────────────┘
|
|
133
|
-
↑
|
|
134
|
-
Read DB / Cache
|
|
135
|
-
(denormalized, optimized)
|
|
136
|
-
|
|
137
|
-
When to use CQRS:
|
|
138
|
-
✅ Read and write patterns are very different
|
|
139
|
-
✅ Read-heavy system (10:1+ read:write ratio)
|
|
140
|
-
✅ Need different optimization for reads vs writes
|
|
141
|
-
✅ Event sourcing
|
|
142
|
-
|
|
143
|
-
When NOT to use:
|
|
144
|
-
❌ Simple CRUD app
|
|
145
|
-
❌ Small team (< 3 developers)
|
|
146
|
-
❌ Read and write models are nearly identical
|
|
147
|
-
```
|
|
74
|
+
Commands (Write) → Normalized Write DB
|
|
75
|
+
Queries (Read) → Denormalized/Cached Read Model
|
|
148
76
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
class CreateOrderCommand {
|
|
152
|
-
constructor(
|
|
153
|
-
public readonly userId: string,
|
|
154
|
-
public readonly items: OrderItem[],
|
|
155
|
-
public readonly shippingAddress: Address,
|
|
156
|
-
) {}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Command Handler
|
|
160
|
-
class CreateOrderHandler {
|
|
161
|
-
constructor(private orderRepo: OrderRepository, private eventBus: EventBus) {}
|
|
162
|
-
|
|
163
|
-
async handle(cmd: CreateOrderCommand): Promise<string> {
|
|
164
|
-
const order = Order.create(cmd.userId, cmd.items, cmd.shippingAddress);
|
|
165
|
-
await this.orderRepo.save(order);
|
|
166
|
-
await this.eventBus.publish(new OrderCreatedEvent(order.id));
|
|
167
|
-
return order.id;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Query (reads from denormalized view)
|
|
172
|
-
class GetOrderSummaryQuery {
|
|
173
|
-
constructor(public readonly orderId: string) {}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
class GetOrderSummaryHandler {
|
|
177
|
-
constructor(private readDb: ReadOnlyDatabase) {}
|
|
178
|
-
|
|
179
|
-
async handle(query: GetOrderSummaryQuery): Promise<OrderSummaryView> {
|
|
180
|
-
return this.readDb.findOne("order_summaries", { id: query.orderId });
|
|
181
|
-
}
|
|
182
|
-
}
|
|
77
|
+
When to use: ✅ Read/write patterns diverge ✅ 10:1+ read:write ratio ✅ Event sourcing
|
|
78
|
+
When NOT to: ❌ Simple CRUD ❌ Team < 3 devs ❌ Read/write models are identical
|
|
183
79
|
```
|
|
184
80
|
|
|
185
81
|
---
|
|
@@ -187,145 +83,79 @@ class GetOrderSummaryHandler {
|
|
|
187
83
|
## Event-Driven Architecture
|
|
188
84
|
|
|
189
85
|
```
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
2. Integration Events → cross-service communication (via message queue)
|
|
195
|
-
3. Notification Events → fire-and-forget (logging, analytics)
|
|
196
|
-
|
|
197
|
-
Message brokers:
|
|
198
|
-
- Redis Streams / BullMQ → simple, good for single-service queues
|
|
199
|
-
- RabbitMQ → complex routing, exchanges, dead-letter queues
|
|
200
|
-
- Apache Kafka → high throughput, event log, replay capability
|
|
201
|
-
- AWS SQS/SNS → managed, serverless-friendly
|
|
202
|
-
```
|
|
86
|
+
Event Types:
|
|
87
|
+
Domain Events → "OrderPlaced" within a bounded context
|
|
88
|
+
Integration Events → Cross-service via message queue
|
|
89
|
+
Notification Events → Fire-and-forget (logging, analytics)
|
|
203
90
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
aggregateId: string;
|
|
210
|
-
occurredAt: Date;
|
|
211
|
-
data: Record<string, unknown>;
|
|
212
|
-
}
|
|
91
|
+
Broker Selection:
|
|
92
|
+
BullMQ / Redis Streams → Simple, single-service queues
|
|
93
|
+
RabbitMQ → Complex routing, dead-letter queues
|
|
94
|
+
Apache Kafka → High throughput, replay, event log
|
|
95
|
+
AWS SQS/SNS → Managed, serverless-friendly
|
|
213
96
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
97
|
+
Outbox Pattern (reliable publishing):
|
|
98
|
+
1. Save entity + event in ONE DB transaction
|
|
99
|
+
2. Background worker polls outbox → publishes to broker
|
|
100
|
+
3. Mark as published → guarantees at-least-once delivery
|
|
101
|
+
```
|
|
217
102
|
|
|
218
|
-
|
|
219
|
-
await this.emailService.send({
|
|
220
|
-
to: event.data.email as string,
|
|
221
|
-
template: "welcome",
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
}
|
|
103
|
+
---
|
|
225
104
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
105
|
+
## Anti-Patterns Reference
|
|
106
|
+
|
|
107
|
+
| Pattern | When it's an Anti-Pattern | Simpler Alternative |
|
|
108
|
+
|---------|--------------------------|---------------------|
|
|
109
|
+
| Microservices | Before team or scale justifies it | Modular monolith |
|
|
110
|
+
| Clean/Hexagonal | Over-abstraction for simple CRUD | Concrete first, interfaces later |
|
|
111
|
+
| Event Sourcing | No business requirement for audit/replay | Append-only audit log |
|
|
112
|
+
| CQRS | Simple data model, no read/write divergence | Single model |
|
|
113
|
+
| Repository | Simple CRUD, single database | ORM direct access |
|
|
232
114
|
|
|
233
115
|
---
|
|
234
116
|
|
|
235
117
|
## Architecture Decision Records (ADRs)
|
|
236
118
|
|
|
237
119
|
```markdown
|
|
238
|
-
|
|
120
|
+
## ADR-001: [Decision Title]
|
|
121
|
+
**Status:** Proposed | Accepted | Deprecated | Superseded by ADR-XXX
|
|
239
122
|
|
|
240
|
-
|
|
123
|
+
**Context:** [Problem + constraints: team, scale, timeline]
|
|
241
124
|
|
|
242
|
-
|
|
243
|
-
We need a relational database for our SaaS application with complex querying
|
|
244
|
-
requirements, multi-tenancy, and full-text search capabilities.
|
|
125
|
+
**Decision:** [What was chosen — be specific]
|
|
245
126
|
|
|
246
|
-
|
|
247
|
-
We will use PostgreSQL 16 with pgvector extension for AI features.
|
|
127
|
+
**Rationale:** [Why — tied to requirements]
|
|
248
128
|
|
|
249
|
-
|
|
250
|
-
### Positive
|
|
251
|
-
- Strong ecosystem, proven at scale (Instagram, Discord)
|
|
252
|
-
- JSONB support for flexible schema fields
|
|
253
|
-
- pgvector eliminates need for separate vector DB
|
|
129
|
+
**Trade-offs:** [What we consciously give up]
|
|
254
130
|
|
|
255
|
-
|
|
256
|
-
-
|
|
257
|
-
-
|
|
131
|
+
**Consequences:**
|
|
132
|
+
- Positive: [Benefits]
|
|
133
|
+
- Negative: [Costs/Risks]
|
|
134
|
+
- Mitigation: [How to address negatives]
|
|
258
135
|
|
|
259
|
-
|
|
260
|
-
- Team has limited PostgreSQL DBA experience → mitigated by managed hosting
|
|
261
|
-
|
|
262
|
-
## Alternatives Considered
|
|
263
|
-
| Database | Rejected Because |
|
|
264
|
-
|-------------|----------------------------------------|
|
|
265
|
-
| MySQL | Weaker JSON support, no pgvector |
|
|
266
|
-
| MongoDB | No strong consistency, no JOINs |
|
|
267
|
-
| PlanetScale | MySQL-based, no extensions |
|
|
136
|
+
**Revisit when:** [Trigger conditions]
|
|
268
137
|
```
|
|
269
138
|
|
|
139
|
+
ADR storage: `docs/architecture/adr-001-title.md`
|
|
140
|
+
|
|
270
141
|
---
|
|
271
142
|
|
|
272
143
|
## Scalability Patterns
|
|
273
144
|
|
|
274
145
|
```
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
Write scaling:
|
|
282
|
-
Queue writes → Partition/shard data → Event sourcing
|
|
283
|
-
|
|
284
|
-
Stateless services:
|
|
285
|
-
Sessions in Redis → JWT tokens → No server affinity
|
|
286
|
-
|
|
287
|
-
Database scaling:
|
|
288
|
-
Connection pooling → Read replicas → Partitioning → Sharding (last resort)
|
|
289
|
-
|
|
290
|
-
Caching strategy:
|
|
291
|
-
L1: In-memory (process)
|
|
292
|
-
L2: Redis/Memcached (shared)
|
|
293
|
-
L3: CDN (edge)
|
|
294
|
-
Cache invalidation > Cache expiration (when possible)
|
|
146
|
+
Read scaling: Redis cache → Read replicas → CDN for static assets
|
|
147
|
+
Write scaling: Queue writes → Partition data → Event sourcing
|
|
148
|
+
Stateless: Sessions in Redis → JWT → No server affinity
|
|
149
|
+
DB scaling: Connection pooling → Read replicas → Partitioning → Sharding (last resort)
|
|
150
|
+
Cache layers: L1: In-memory (process) L2: Redis (shared) L3: CDN (edge)
|
|
295
151
|
```
|
|
296
152
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
## 🤖 LLM-Specific Traps
|
|
300
|
-
|
|
301
|
-
1. **Premature Microservices:** Don't split into microservices until you have team/scale pressure. Start with a modular monolith.
|
|
302
|
-
2. **CQRS for Simple CRUD:** CQRS adds complexity. Only use when read/write patterns are fundamentally different.
|
|
303
|
-
3. **"Clean Architecture" Without Domain Logic:** If your "domain layer" is just DTOs, you don't need Clean Architecture.
|
|
304
|
-
4. **Event Sourcing as Default:** Event sourcing is complex. Only use for audit-heavy domains (finance, compliance).
|
|
305
|
-
5. **Shared Database Between Services:** Microservices with a shared database are a distributed monolith.
|
|
306
|
-
6. **Missing ADRs:** Every significant technical decision needs a documented ADR. "We just decided" is not acceptable.
|
|
307
|
-
7. **Synchronous Microservice Chains:** Service A → B → C → D is a distributed monolith with worse latency.
|
|
308
|
-
8. **Ignoring Conway's Law:** Architecture mirrors org structure. Don't fight it.
|
|
309
|
-
9. **"Hexagonal Architecture" Without Ports:** Just having layers isn't hexagonal. You need explicit port interfaces.
|
|
310
|
-
10. **Over-Abstracting Day One:** YAGNI. Build the simplest thing that works, refactor when patterns emerge.
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
## 🏛️ Tribunal Integration
|
|
315
|
-
|
|
316
|
-
**Slash command: `/tribunal-backend`**
|
|
317
|
-
|
|
318
|
-
### ✅ Pre-Flight Self-Audit
|
|
153
|
+
## Scale-to-Architecture Matrix
|
|
319
154
|
|
|
320
155
|
```
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
✅ Did I consider failure modes (what happens when service X is down)?
|
|
327
|
-
✅ Is there a caching strategy (L1/L2/L3)?
|
|
328
|
-
✅ Are cross-service calls async (events, not synchronous chains)?
|
|
329
|
-
✅ Did I document trade-offs, not just the chosen solution?
|
|
330
|
-
✅ Does the architecture match the team's actual skill set?
|
|
156
|
+
MVP SaaS Enterprise
|
|
157
|
+
Scale: <1K 1K–100K 100K+
|
|
158
|
+
Team: Solo 2–10 10+
|
|
159
|
+
Architecture: Simple Mono Modular Mono Distributed
|
|
160
|
+
Framework: Next.js API NestJS Microservices
|
|
331
161
|
```
|