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,200 +1,331 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: architecture
|
|
3
|
-
description:
|
|
4
|
-
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
-
version:
|
|
6
|
-
last-updated: 2026-
|
|
7
|
-
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Architecture
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
1
|
+
---
|
|
2
|
+
name: architecture
|
|
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
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
+
version: 2.0.0
|
|
6
|
+
last-updated: 2026-04-01
|
|
7
|
+
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Architecture — System Design Mastery
|
|
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
|
+
## Architecture Selection
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
┌────────────────────────────────────────────────────────────────┐
|
|
21
|
+
│ What Architecture Do You Need? │
|
|
22
|
+
├────────────────────────────────────────────────────────────────┤
|
|
23
|
+
│ │
|
|
24
|
+
│ Team size? │
|
|
25
|
+
│ ├── 1-5 developers → Modular Monolith │
|
|
26
|
+
│ ├── 5-20 developers → Modular Monolith + Event Bus │
|
|
27
|
+
│ └── 20+ developers → Microservices (with platform team) │
|
|
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
|
+
└────────────────────────────────────────────────────────────────┘
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Clean Architecture (Layered)
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
┌───────────────────────────────────────────────┐
|
|
51
|
+
│ Presentation Layer │
|
|
52
|
+
│ Controllers / Minimal APIs / CLI / UI │
|
|
53
|
+
├───────────────────────────────────────────────┤
|
|
54
|
+
│ Application Layer │
|
|
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)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// Domain layer — pure business logic, zero dependencies
|
|
75
|
+
interface UserRepository {
|
|
76
|
+
findById(id: string): Promise<User | null>;
|
|
77
|
+
save(user: User): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
class User {
|
|
81
|
+
constructor(
|
|
82
|
+
public readonly id: string,
|
|
83
|
+
public name: string,
|
|
84
|
+
public email: string,
|
|
85
|
+
private _role: UserRole,
|
|
86
|
+
) {}
|
|
87
|
+
|
|
88
|
+
promote(): void {
|
|
89
|
+
if (this._role === UserRole.ADMIN) {
|
|
90
|
+
throw new DomainError("Already admin");
|
|
91
|
+
}
|
|
92
|
+
this._role = UserRole.ADMIN;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Application layer — orchestrates use cases
|
|
97
|
+
class PromoteUserUseCase {
|
|
98
|
+
constructor(
|
|
99
|
+
private userRepo: UserRepository,
|
|
100
|
+
private eventBus: EventBus,
|
|
101
|
+
) {}
|
|
102
|
+
|
|
103
|
+
async execute(userId: string): Promise<void> {
|
|
104
|
+
const user = await this.userRepo.findById(userId);
|
|
105
|
+
if (!user) throw new NotFoundError("User", userId);
|
|
106
|
+
|
|
107
|
+
user.promote(); // domain logic
|
|
108
|
+
await this.userRepo.save(user);
|
|
109
|
+
await this.eventBus.publish(new UserPromotedEvent(userId));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Infrastructure — concrete implementations
|
|
114
|
+
class PostgresUserRepository implements UserRepository {
|
|
115
|
+
async findById(id: string): Promise<User | null> {
|
|
116
|
+
const row = await db.query("SELECT * FROM users WHERE id = $1", [id]);
|
|
117
|
+
return row ? User.fromRow(row) : null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## CQRS (Command Query Responsibility Segregation)
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Commands (Write) Queries (Read)
|
|
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
|
+
```
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// Command
|
|
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
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Event-Driven Architecture
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
Producer → Event Bus → Consumer(s)
|
|
191
|
+
|
|
192
|
+
Event types:
|
|
193
|
+
1. Domain Events → "OrderPlaced", "UserRegistered" (within bounded context)
|
|
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
|
+
```
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
// Domain event
|
|
206
|
+
interface DomainEvent {
|
|
207
|
+
eventId: string;
|
|
208
|
+
eventType: string;
|
|
209
|
+
aggregateId: string;
|
|
210
|
+
occurredAt: Date;
|
|
211
|
+
data: Record<string, unknown>;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Event handler
|
|
215
|
+
class SendWelcomeEmailHandler {
|
|
216
|
+
constructor(private emailService: EmailService) {}
|
|
217
|
+
|
|
218
|
+
async handle(event: DomainEvent & { eventType: "user.registered" }) {
|
|
219
|
+
await this.emailService.send({
|
|
220
|
+
to: event.data.email as string,
|
|
221
|
+
template: "welcome",
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Outbox pattern (reliable event publishing)
|
|
227
|
+
// 1. Save entity + event in SAME db transaction
|
|
228
|
+
// 2. Background worker polls outbox table → publishes to event bus
|
|
229
|
+
// 3. Mark as published
|
|
230
|
+
// This guarantees at-least-once delivery without distributed transactions
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Architecture Decision Records (ADRs)
|
|
236
|
+
|
|
237
|
+
```markdown
|
|
238
|
+
# ADR-001: Use PostgreSQL as Primary Database
|
|
239
|
+
|
|
240
|
+
## Status: Accepted
|
|
241
|
+
|
|
242
|
+
## Context
|
|
243
|
+
We need a relational database for our SaaS application with complex querying
|
|
244
|
+
requirements, multi-tenancy, and full-text search capabilities.
|
|
245
|
+
|
|
246
|
+
## Decision
|
|
247
|
+
We will use PostgreSQL 16 with pgvector extension for AI features.
|
|
248
|
+
|
|
249
|
+
## Consequences
|
|
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
|
|
254
|
+
|
|
255
|
+
### Negative
|
|
256
|
+
- More operational complexity than managed options (Supabase mitigates this)
|
|
257
|
+
- Connection pooling required for serverless (PgBouncer)
|
|
258
|
+
|
|
259
|
+
### Risks
|
|
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 |
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Scalability Patterns
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
Vertical Scaling → Bigger machine (simple, limited)
|
|
276
|
+
Horizontal Scaling → More machines (complex, unlimited)
|
|
277
|
+
|
|
278
|
+
Read scaling:
|
|
279
|
+
Cache layer (Redis) → Read replicas → CDN for static assets
|
|
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)
|
|
295
|
+
```
|
|
296
|
+
|
|
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
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
✅ Did I document the architecture decision as an ADR?
|
|
322
|
+
✅ Is the architecture appropriate for team size and scale?
|
|
323
|
+
✅ Do dependencies point inward (domain has no infrastructure deps)?
|
|
324
|
+
✅ Did I start simple and avoid premature optimization?
|
|
325
|
+
✅ Is the system stateless (sessions in Redis/JWT)?
|
|
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?
|
|
331
|
+
```
|