tribunal-kit 2.4.6 → 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 +139 -86
- package/.agent/agents/ai-code-reviewer.md +160 -90
- package/.agent/agents/backend-specialist.md +164 -127
- package/.agent/agents/code-archaeologist.md +115 -73
- package/.agent/agents/database-architect.md +130 -110
- package/.agent/agents/debugger.md +137 -97
- package/.agent/agents/dependency-reviewer.md +78 -30
- package/.agent/agents/devops-engineer.md +161 -118
- package/.agent/agents/documentation-writer.md +151 -87
- package/.agent/agents/explorer-agent.md +117 -99
- package/.agent/agents/frontend-reviewer.md +127 -47
- package/.agent/agents/frontend-specialist.md +169 -109
- package/.agent/agents/game-developer.md +28 -164
- package/.agent/agents/logic-reviewer.md +87 -49
- package/.agent/agents/mobile-developer.md +151 -103
- package/.agent/agents/mobile-reviewer.md +133 -50
- package/.agent/agents/orchestrator.md +121 -110
- package/.agent/agents/penetration-tester.md +103 -77
- package/.agent/agents/performance-optimizer.md +136 -92
- package/.agent/agents/performance-reviewer.md +139 -69
- package/.agent/agents/product-manager.md +104 -70
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +95 -95
- package/.agent/agents/qa-automation-engineer.md +174 -87
- package/.agent/agents/security-auditor.md +133 -129
- package/.agent/agents/seo-specialist.md +160 -99
- package/.agent/agents/sql-reviewer.md +132 -44
- package/.agent/agents/supervisor-agent.md +137 -109
- 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 +132 -53
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +143 -33
- 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/__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/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 +60 -100
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
- package/.agent/skills/api-patterns/SKILL.md +197 -257
- package/.agent/skills/api-security-auditor/SKILL.md +125 -57
- 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 +71 -98
- package/.agent/skills/architecture/SKILL.md +161 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
- package/.agent/skills/bash-linux/SKILL.md +71 -166
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +345 -127
- package/.agent/skills/building-native-ui/SKILL.md +125 -57
- package/.agent/skills/clean-code/SKILL.md +266 -149
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +73 -131
- package/.agent/skills/csharp-developer/SKILL.md +434 -73
- package/.agent/skills/database-design/SKILL.md +190 -275
- package/.agent/skills/deployment-procedures/SKILL.md +81 -158
- package/.agent/skills/devops-engineer/SKILL.md +255 -94
- package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +19 -63
- package/.agent/skills/edge-computing/SKILL.md +75 -165
- package/.agent/skills/extract-design-system/SKILL.md +84 -58
- package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +71 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
- package/.agent/skills/github-operations/SKILL.md +197 -272
- package/.agent/skills/gsap-expert/SKILL.md +194 -0
- package/.agent/skills/i18n-localization/SKILL.md +60 -172
- package/.agent/skills/intelligent-routing/SKILL.md +123 -103
- package/.agent/skills/lint-and-validate/SKILL.md +8 -52
- package/.agent/skills/llm-engineering/SKILL.md +281 -195
- package/.agent/skills/local-first/SKILL.md +76 -159
- package/.agent/skills/mcp-builder/SKILL.md +48 -188
- 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 +184 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
- package/.agent/skills/observability/SKILL.md +211 -203
- package/.agent/skills/parallel-agents/SKILL.md +53 -146
- package/.agent/skills/performance-profiling/SKILL.md +171 -151
- package/.agent/skills/plan-writing/SKILL.md +49 -153
- package/.agent/skills/platform-engineer/SKILL.md +57 -103
- package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
- package/.agent/skills/powershell-windows/SKILL.md +61 -179
- package/.agent/skills/python-patterns/SKILL.md +7 -35
- package/.agent/skills/python-pro/SKILL.md +273 -114
- package/.agent/skills/react-specialist/SKILL.md +227 -108
- package/.agent/skills/readme-builder/SKILL.md +15 -85
- package/.agent/skills/realtime-patterns/SKILL.md +216 -243
- package/.agent/skills/red-team-tactics/SKILL.md +10 -51
- package/.agent/skills/rust-pro/SKILL.md +525 -142
- package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
- package/.agent/skills/server-management/SKILL.md +110 -166
- package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
- package/.agent/skills/skill-creator/SKILL.md +18 -58
- package/.agent/skills/sql-pro/SKILL.md +543 -68
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
- package/.agent/skills/swiftui-expert/SKILL.md +124 -57
- package/.agent/skills/systematic-debugging/SKILL.md +49 -151
- package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
- package/.agent/skills/tdd-workflow/SKILL.md +63 -169
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +437 -130
- 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 +225 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
- package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
- package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
- package/.agent/skills/webapp-testing/SKILL.md +71 -196
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +96 -224
- package/.agent/workflows/audit.md +81 -122
- package/.agent/workflows/brainstorm.md +69 -105
- package/.agent/workflows/changelog.md +65 -97
- package/.agent/workflows/create.md +73 -88
- package/.agent/workflows/debug.md +80 -111
- package/.agent/workflows/deploy.md +119 -92
- package/.agent/workflows/enhance.md +80 -91
- package/.agent/workflows/fix.md +68 -97
- package/.agent/workflows/generate.md +165 -164
- package/.agent/workflows/migrate.md +106 -109
- package/.agent/workflows/orchestrate.md +103 -86
- package/.agent/workflows/performance-benchmarker.md +77 -268
- package/.agent/workflows/plan.md +120 -98
- package/.agent/workflows/preview.md +39 -96
- package/.agent/workflows/refactor.md +105 -97
- package/.agent/workflows/review-ai.md +63 -102
- package/.agent/workflows/review.md +71 -110
- package/.agent/workflows/session.md +53 -113
- package/.agent/workflows/status.md +42 -88
- package/.agent/workflows/strengthen-skills.md +90 -51
- package/.agent/workflows/swarm.md +114 -129
- package/.agent/workflows/test.md +125 -102
- package/.agent/workflows/tribunal-backend.md +60 -78
- package/.agent/workflows/tribunal-database.md +62 -100
- package/.agent/workflows/tribunal-frontend.md +62 -82
- package/.agent/workflows/tribunal-full.md +56 -100
- package/.agent/workflows/tribunal-mobile.md +65 -94
- package/.agent/workflows/tribunal-performance.md +62 -105
- package/.agent/workflows/ui-ux-pro-max.md +72 -121
- package/README.md +11 -15
- 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/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- 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/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
- 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
|
@@ -1,296 +1,269 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: realtime-patterns
|
|
3
|
-
description: Real-time
|
|
3
|
+
description: Real-time application mastery. WebSockets, Server-Sent Events (SSE), CRDTs for conflict-free collaboration, presence systems, optimistic updates, live cursors, multiplayer state sync, reconnection strategies, and real-time database patterns (Supabase Realtime, Firebase). Use when building chat, live collaboration, dashboards, or multiplayer features.
|
|
4
4
|
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
-
version:
|
|
6
|
-
last-updated: 2026-
|
|
5
|
+
version: 2.0.0
|
|
6
|
+
last-updated: 2026-04-01
|
|
7
7
|
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# Real-Time Patterns
|
|
11
|
-
|
|
12
|
-
> The hardest part of real-time systems is not the latency — it's the concurrent state.
|
|
13
|
-
> Two users editing the same document at the same millisecond must both win.
|
|
10
|
+
# Real-Time Patterns — Live Application Mastery
|
|
14
11
|
|
|
15
12
|
---
|
|
16
13
|
|
|
17
|
-
##
|
|
18
|
-
|
|
19
|
-
Choose the transport based on what the data flow looks like:
|
|
14
|
+
## Protocol Selection
|
|
20
15
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
16
|
+
```
|
|
17
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
18
|
+
│ When to Use What │
|
|
19
|
+
├─────────────────────────────────────────────────────────────┤
|
|
20
|
+
│ SSE (Server-Sent Events) │
|
|
21
|
+
│ ✅ Server → Client only (one-way) │
|
|
22
|
+
│ ✅ AI token streaming │
|
|
23
|
+
│ ✅ Live feeds, notifications, dashboards │
|
|
24
|
+
│ ✅ Auto-reconnection built in │
|
|
25
|
+
│ ✅ Works through HTTP proxies and CDNs │
|
|
26
|
+
│ │
|
|
27
|
+
│ WebSocket │
|
|
28
|
+
│ ✅ Bidirectional (client ↔ server) │
|
|
29
|
+
│ ✅ Chat, gaming, collaborative editing │
|
|
30
|
+
│ ✅ High-frequency updates (< 100ms intervals) │
|
|
31
|
+
│ ❌ Doesn't work through some proxies/CDNs │
|
|
32
|
+
│ ❌ No auto-reconnection (must implement) │
|
|
33
|
+
│ │
|
|
34
|
+
│ HTTP Polling │
|
|
35
|
+
│ ✅ Simplest implementation │
|
|
36
|
+
│ ✅ Works everywhere │
|
|
37
|
+
│ ❌ Latency (poll interval) │
|
|
38
|
+
│ ❌ Wasted requests when nothing changed │
|
|
39
|
+
│ │
|
|
40
|
+
│ WebTransport (emerging) │
|
|
41
|
+
│ ✅ UDP-based, lowest latency │
|
|
42
|
+
│ ✅ Multiplayer gaming, video streaming │
|
|
43
|
+
│ ❌ Limited browser support (2024+) │
|
|
44
|
+
└─────────────────────────────────────────────────────────────┘
|
|
45
|
+
|
|
46
|
+
❌ HALLUCINATION TRAP: Don't default to WebSocket for everything
|
|
47
|
+
AI streaming → SSE (one-way, auto-reconnect)
|
|
48
|
+
Notifications → SSE (one-way)
|
|
49
|
+
Chat → WebSocket (bidirectional)
|
|
50
|
+
Live dashboard → SSE (one-way)
|
|
51
|
+
Collaborative editing → WebSocket + CRDT
|
|
52
|
+
```
|
|
28
53
|
|
|
29
54
|
---
|
|
30
55
|
|
|
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
|
-
private authenticate() {
|
|
64
|
-
// ✅ Always authenticate AFTER connection — never trust URL params for auth
|
|
65
|
-
this.ws!.send(JSON.stringify({
|
|
66
|
-
type: 'auth',
|
|
67
|
-
token: getAccessToken(),
|
|
68
|
-
}));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
```
|
|
56
|
+
## Server-Sent Events (SSE)
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// Server (Node.js/Express)
|
|
60
|
+
app.get("/api/events", (req, res) => {
|
|
61
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
62
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
63
|
+
res.setHeader("Connection", "keep-alive");
|
|
64
|
+
res.setHeader("X-Accel-Buffering", "no"); // disable nginx buffering
|
|
65
|
+
|
|
66
|
+
// Send initial connection event
|
|
67
|
+
res.write(`data: ${JSON.stringify({ type: "connected" })}\n\n`);
|
|
68
|
+
|
|
69
|
+
// Heartbeat to keep connection alive
|
|
70
|
+
const heartbeat = setInterval(() => {
|
|
71
|
+
res.write(": heartbeat\n\n"); // comment line, ignored by client
|
|
72
|
+
}, 15000);
|
|
73
|
+
|
|
74
|
+
// Subscribe to events
|
|
75
|
+
const handler = (event: AppEvent) => {
|
|
76
|
+
res.write(`event: ${event.type}\n`);
|
|
77
|
+
res.write(`data: ${JSON.stringify(event.data)}\n`);
|
|
78
|
+
res.write(`id: ${event.id}\n\n`); // enables auto-resume
|
|
79
|
+
};
|
|
80
|
+
eventBus.subscribe(handler);
|
|
81
|
+
|
|
82
|
+
// Cleanup on disconnect
|
|
83
|
+
req.on("close", () => {
|
|
84
|
+
clearInterval(heartbeat);
|
|
85
|
+
eventBus.unsubscribe(handler);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
72
88
|
|
|
73
|
-
|
|
89
|
+
// Client
|
|
90
|
+
const eventSource = new EventSource("/api/events");
|
|
74
91
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
92
|
+
eventSource.addEventListener("notification", (e) => {
|
|
93
|
+
const data = JSON.parse(e.data);
|
|
94
|
+
showNotification(data);
|
|
95
|
+
});
|
|
80
96
|
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
ws.send(data);
|
|
88
|
-
}
|
|
97
|
+
// Auto-reconnection is built-in!
|
|
98
|
+
// The browser automatically reconnects with Last-Event-ID header
|
|
99
|
+
eventSource.onerror = () => {
|
|
100
|
+
console.log("Connection lost — auto-reconnecting...");
|
|
101
|
+
};
|
|
89
102
|
```
|
|
90
103
|
|
|
91
104
|
---
|
|
92
105
|
|
|
93
|
-
##
|
|
106
|
+
## WebSocket
|
|
94
107
|
|
|
95
|
-
|
|
108
|
+
```typescript
|
|
109
|
+
// Server (ws library)
|
|
110
|
+
import { WebSocketServer, WebSocket } from "ws";
|
|
96
111
|
|
|
97
|
-
|
|
112
|
+
const wss = new WebSocketServer({ server: httpServer, path: "/ws" });
|
|
98
113
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const { message } = c.req.query();
|
|
114
|
+
// Connection management
|
|
115
|
+
const clients = new Map<string, WebSocket>();
|
|
102
116
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
c.res.headers.set('Connection', 'keep-alive');
|
|
117
|
+
wss.on("connection", (ws, req) => {
|
|
118
|
+
const userId = authenticateFromHeaders(req);
|
|
119
|
+
clients.set(userId, ws);
|
|
107
120
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
121
|
+
ws.on("message", (raw) => {
|
|
122
|
+
try {
|
|
123
|
+
const message = JSON.parse(raw.toString());
|
|
124
|
+
handleMessage(userId, message);
|
|
125
|
+
} catch (e) {
|
|
126
|
+
ws.send(JSON.stringify({ error: "Invalid message format" }));
|
|
127
|
+
}
|
|
112
128
|
});
|
|
113
129
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
for await (const chunk of stream) {
|
|
118
|
-
const text = chunk.choices[0]?.delta?.content ?? '';
|
|
119
|
-
if (text) {
|
|
120
|
-
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ text })}\n\n`));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
controller.enqueue(encoder.encode('data: [DONE]\n\n'));
|
|
124
|
-
controller.close();
|
|
125
|
-
},
|
|
130
|
+
ws.on("close", () => {
|
|
131
|
+
clients.delete(userId);
|
|
132
|
+
broadcastPresence();
|
|
126
133
|
});
|
|
127
134
|
|
|
128
|
-
|
|
135
|
+
ws.on("pong", () => {
|
|
136
|
+
// Client is alive
|
|
137
|
+
});
|
|
129
138
|
});
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Client (React)
|
|
133
|
-
|
|
134
|
-
```tsx
|
|
135
|
-
function useAIStream(prompt: string) {
|
|
136
|
-
const [text, setText] = useState('');
|
|
137
|
-
const [done, setDone] = useState(false);
|
|
138
|
-
|
|
139
|
-
useEffect(() => {
|
|
140
|
-
const source = new EventSource(`/api/chat/stream?message=${encodeURIComponent(prompt)}`);
|
|
141
|
-
|
|
142
|
-
source.onmessage = (e) => {
|
|
143
|
-
if (e.data === '[DONE]') {
|
|
144
|
-
setDone(true);
|
|
145
|
-
source.close();
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const { text: chunk } = JSON.parse(e.data);
|
|
149
|
-
setText(prev => prev + chunk);
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
source.onerror = () => source.close();
|
|
153
|
-
|
|
154
|
-
return () => source.close(); // Cleanup on unmount
|
|
155
|
-
}, [prompt]);
|
|
156
139
|
|
|
157
|
-
|
|
140
|
+
// Heartbeat — detect dead connections
|
|
141
|
+
const interval = setInterval(() => {
|
|
142
|
+
wss.clients.forEach((ws) => {
|
|
143
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
144
|
+
ws.ping();
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}, 30000);
|
|
148
|
+
|
|
149
|
+
// Broadcast to room
|
|
150
|
+
function broadcastToRoom(roomId: string, message: unknown, excludeUser?: string) {
|
|
151
|
+
const roomMembers = getRoomMembers(roomId);
|
|
152
|
+
for (const memberId of roomMembers) {
|
|
153
|
+
if (memberId === excludeUser) continue;
|
|
154
|
+
const ws = clients.get(memberId);
|
|
155
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
156
|
+
ws.send(JSON.stringify(message));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
158
159
|
}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## CRDTs: Conflict-Free Collaboration
|
|
164
|
-
|
|
165
|
-
CRDTs (Conflict-free Replicated Data Types) guarantee that concurrent edits from multiple users always merge to the same result, regardless of order or network conditions.
|
|
166
|
-
|
|
167
|
-
### When to Use CRDTs vs Last-Write-Wins
|
|
168
160
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
Operational Transform (OT):
|
|
175
|
-
✅ Google Docs-style (centralized server required)
|
|
176
|
-
❌ Peer-to-peer, offline-first (server is the truth arbiter)
|
|
177
|
-
|
|
178
|
-
CRDTs:
|
|
179
|
-
✅ Collaborative text (Yjs), presence, shared lists
|
|
180
|
-
✅ Offline-first, peer-to-peer
|
|
181
|
-
✅ No central server required for convergence
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### Yjs — The Standard CRDT Library
|
|
185
|
-
|
|
186
|
-
```ts
|
|
187
|
-
import * as Y from 'yjs';
|
|
188
|
-
import { WebsocketProvider } from 'y-websocket';
|
|
189
|
-
|
|
190
|
-
// Create a shared document
|
|
191
|
-
const doc = new Y.Doc();
|
|
192
|
-
|
|
193
|
-
// Connect to sync server — providers handle conflict resolution
|
|
194
|
-
const provider = new WebsocketProvider('wss://your-server.com', 'room-id', doc);
|
|
195
|
-
|
|
196
|
-
// Y.Text — CRDT for collaborative text editing
|
|
197
|
-
const yText = doc.getText('document');
|
|
161
|
+
// Client with reconnection
|
|
162
|
+
class ReconnectingWebSocket {
|
|
163
|
+
private ws: WebSocket | null = null;
|
|
164
|
+
private retryCount = 0;
|
|
165
|
+
private maxRetries = 10;
|
|
198
166
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
167
|
+
connect(url: string) {
|
|
168
|
+
this.ws = new WebSocket(url);
|
|
169
|
+
this.ws.onopen = () => { this.retryCount = 0; };
|
|
170
|
+
this.ws.onclose = () => { this.reconnect(url); };
|
|
171
|
+
this.ws.onerror = () => { this.ws?.close(); };
|
|
172
|
+
}
|
|
203
173
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
174
|
+
private reconnect(url: string) {
|
|
175
|
+
if (this.retryCount >= this.maxRetries) return;
|
|
176
|
+
const delay = Math.min(1000 * 2 ** this.retryCount, 30000);
|
|
177
|
+
this.retryCount++;
|
|
178
|
+
setTimeout(() => this.connect(url), delay);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
207
181
|
```
|
|
208
182
|
|
|
209
183
|
---
|
|
210
184
|
|
|
211
|
-
##
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
//
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
185
|
+
## Optimistic Updates
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
// React pattern: update UI immediately, reconcile on server response
|
|
189
|
+
async function toggleLike(postId: string) {
|
|
190
|
+
// 1. Optimistic update (instant UI feedback)
|
|
191
|
+
setLiked((prev) => !prev);
|
|
192
|
+
setLikeCount((prev) => liked ? prev - 1 : prev + 1);
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
// 2. Server request
|
|
196
|
+
await api.post(`/posts/${postId}/like`);
|
|
197
|
+
} catch (error) {
|
|
198
|
+
// 3. Rollback on failure
|
|
199
|
+
setLiked((prev) => !prev);
|
|
200
|
+
setLikeCount((prev) => liked ? prev + 1 : prev - 1);
|
|
201
|
+
toast.error("Failed to update. Please try again.");
|
|
202
|
+
}
|
|
203
|
+
}
|
|
229
204
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
205
|
+
// With React Query / TanStack Query:
|
|
206
|
+
const likeMutation = useMutation({
|
|
207
|
+
mutationFn: (postId: string) => api.post(`/posts/${postId}/like`),
|
|
208
|
+
onMutate: async (postId) => {
|
|
209
|
+
await queryClient.cancelQueries({ queryKey: ["post", postId] });
|
|
210
|
+
const previous = queryClient.getQueryData(["post", postId]);
|
|
211
|
+
queryClient.setQueryData(["post", postId], (old: Post) => ({
|
|
212
|
+
...old,
|
|
213
|
+
liked: !old.liked,
|
|
214
|
+
likeCount: old.liked ? old.likeCount - 1 : old.likeCount + 1,
|
|
215
|
+
}));
|
|
216
|
+
return { previous };
|
|
217
|
+
},
|
|
218
|
+
onError: (err, postId, context) => {
|
|
219
|
+
queryClient.setQueryData(["post", postId], context?.previous);
|
|
220
|
+
},
|
|
221
|
+
onSettled: (data, err, postId) => {
|
|
222
|
+
queryClient.invalidateQueries({ queryKey: ["post", postId] });
|
|
223
|
+
},
|
|
234
224
|
});
|
|
235
225
|
```
|
|
236
226
|
|
|
237
227
|
---
|
|
238
228
|
|
|
239
|
-
##
|
|
229
|
+
## Presence System
|
|
240
230
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
| **PartyKit** | WebSocket-native, Durable Objects | Multiplayer apps, AI + realtime |
|
|
244
|
-
| **Liveblocks** | Managed CRDT + presence | Collaborative SaaS (Figma-style) |
|
|
245
|
-
| **Supabase Realtime** | PostgreSQL change streams | Postgres-centric apps |
|
|
246
|
-
| **ElectricSQL** | Local-first sync from Postgres | Offline-first apps |
|
|
247
|
-
| **Replicache** | Client-side mutations + sync | Highly interactive, offline-capable |
|
|
231
|
+
```typescript
|
|
232
|
+
// Track who's online, typing, viewing
|
|
248
233
|
|
|
249
|
-
|
|
234
|
+
interface PresenceState {
|
|
235
|
+
userId: string;
|
|
236
|
+
status: "online" | "away" | "offline";
|
|
237
|
+
cursor?: { x: number; y: number };
|
|
238
|
+
lastSeen: number;
|
|
239
|
+
}
|
|
250
240
|
|
|
251
|
-
|
|
241
|
+
// Server-side presence manager
|
|
242
|
+
class PresenceManager {
|
|
243
|
+
private presence = new Map<string, PresenceState>();
|
|
244
|
+
private readonly TIMEOUT_MS = 30_000;
|
|
245
|
+
|
|
246
|
+
update(userId: string, state: Partial<PresenceState>) {
|
|
247
|
+
this.presence.set(userId, {
|
|
248
|
+
...this.presence.get(userId),
|
|
249
|
+
userId,
|
|
250
|
+
status: "online",
|
|
251
|
+
lastSeen: Date.now(),
|
|
252
|
+
...state,
|
|
253
|
+
} as PresenceState);
|
|
254
|
+
}
|
|
252
255
|
|
|
253
|
-
|
|
256
|
+
getActive(): PresenceState[] {
|
|
257
|
+
const now = Date.now();
|
|
258
|
+
return [...this.presence.values()].filter(
|
|
259
|
+
(p) => now - p.lastSeen < this.TIMEOUT_MS,
|
|
260
|
+
);
|
|
261
|
+
}
|
|
254
262
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
Scope: [N files · N functions]
|
|
260
|
-
─────────────────────────────────────────────────
|
|
261
|
-
✅ Passed: [checks that passed, or "All clean"]
|
|
262
|
-
⚠️ Warnings: [non-blocking issues, or "None"]
|
|
263
|
-
❌ Blocked: [blocking issues requiring fix, or "None"]
|
|
264
|
-
─────────────────────────────────────────────────
|
|
265
|
-
VBC status: PENDING → VERIFIED
|
|
266
|
-
Evidence: [test output / lint pass / compile success]
|
|
263
|
+
remove(userId: string) {
|
|
264
|
+
this.presence.delete(userId);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
267
|
```
|
|
268
268
|
|
|
269
|
-
**VBC (Verification-Before-Completion) is mandatory.**
|
|
270
|
-
Do not mark status as VERIFIED until concrete terminal evidence is provided.
|
|
271
|
-
|
|
272
|
-
|
|
273
269
|
---
|
|
274
|
-
|
|
275
|
-
## 🏛️ Tribunal Integration (Anti-Hallucination)
|
|
276
|
-
|
|
277
|
-
**Slash command: `/tribunal-backend`**
|
|
278
|
-
**Active reviewers: `logic` · `security` · `performance`**
|
|
279
|
-
|
|
280
|
-
### ❌ Forbidden AI Tropes in Real-Time Engineering
|
|
281
|
-
|
|
282
|
-
1. **Auth in URL params** — `ws://server.com?token=abc123` — tokens in URLs appear in logs and browser history. Authenticate via first message after handshake.
|
|
283
|
-
2. **No reconnect logic** — all WebSocket connections will drop. No reconnect = broken app on any network hiccup.
|
|
284
|
-
3. **Unbounded broadcast** — `wss.clients.forEach(ws => ws.send(data))` with no grouping = O(n) for every event.
|
|
285
|
-
4. **Polling instead of streaming** — `setInterval(() => fetch('/api/ai-status'), 500)` for AI responses = wasteful; use SSE.
|
|
286
|
-
5. **No backpressure handling** — sending data faster than the client can process = WebSocket buffer OOM.
|
|
287
|
-
|
|
288
|
-
### ✅ Pre-Flight Self-Audit
|
|
289
|
-
|
|
290
|
-
```
|
|
291
|
-
✅ Are WebSocket connections authenticated via first message, not URL params?
|
|
292
|
-
✅ Is there exponential backoff reconnect logic on unexpected disconnect?
|
|
293
|
-
✅ Are broadcasts scoped to rooms/channels — not sent to all connected clients?
|
|
294
|
-
✅ Is backpressure handled (bufferedAmount check before send)?
|
|
295
|
-
✅ Is SSE used for one-directional AI streaming instead of WebSocket?
|
|
296
|
-
```
|
|
@@ -9,8 +9,8 @@ applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
|
9
9
|
|
|
10
10
|
# Red Team & Penetration Testing Principles
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
A red team engagement is a controlled attack.
|
|
13
|
+
The goal is to find what a real attacker would find — before they do.
|
|
14
14
|
|
|
15
15
|
⚠️ **These techniques are for authorized security testing only. Unauthorized use is illegal.**
|
|
16
16
|
|
|
@@ -80,14 +80,14 @@ Getting data out without triggering alerts:
|
|
|
80
80
|
|
|
81
81
|
## Common Vulnerability Targets
|
|
82
82
|
|
|
83
|
-
|
|
|
83
|
+
|Target|What to Test|
|
|
84
84
|
|---|---|
|
|
85
|
-
|
|
|
86
|
-
|
|
|
87
|
-
|
|
|
88
|
-
|
|
|
89
|
-
|
|
|
90
|
-
|
|
|
85
|
+
|Web applications|OWASP Top 10, auth bypass, IDOR, SSRF|
|
|
86
|
+
|APIs|Object-level authorization, mass assignment, rate limiting|
|
|
87
|
+
|Authentication|Brute force protection, token entropy, password reset flow|
|
|
88
|
+
|Secrets|Exposed env files, git history, CI/CD environment variables|
|
|
89
|
+
|Third-party integrations|Webhook validation, OAuth redirect URI validation|
|
|
90
|
+
|Infrastructure|Open S3 buckets, exposed admin ports, default credentials|
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
@@ -127,7 +127,7 @@ When testing detection capabilities:
|
|
|
127
127
|
[Chronological story of the full attack path from initial access to objective]
|
|
128
128
|
|
|
129
129
|
## Remediation Priority
|
|
130
|
-
|
|
|
130
|
+
|Finding|Severity|Fix By|
|
|
131
131
|
|---|---|---|
|
|
132
132
|
```
|
|
133
133
|
|
|
@@ -157,45 +157,4 @@ Pre-Flight: ✅ All checks passed
|
|
|
157
157
|
or ❌ [blocking item that must be resolved first]
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
|
|
161
|
-
|
|
162
160
|
---
|
|
163
|
-
|
|
164
|
-
## 🤖 LLM-Specific Traps
|
|
165
|
-
|
|
166
|
-
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
167
|
-
|
|
168
|
-
1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
|
|
169
|
-
2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
|
|
170
|
-
3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
|
|
171
|
-
4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
172
|
-
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## 🏛️ Tribunal Integration (Anti-Hallucination)
|
|
177
|
-
|
|
178
|
-
**Slash command: `/review` or `/tribunal-full`**
|
|
179
|
-
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
180
|
-
|
|
181
|
-
### ❌ Forbidden AI Tropes
|
|
182
|
-
|
|
183
|
-
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
184
|
-
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
185
|
-
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
186
|
-
|
|
187
|
-
### ✅ Pre-Flight Self-Audit
|
|
188
|
-
|
|
189
|
-
Review these questions before confirming output:
|
|
190
|
-
```
|
|
191
|
-
✅ Did I rely ONLY on real, verified tools and methods?
|
|
192
|
-
✅ Is this solution appropriately scoped to the user's constraints?
|
|
193
|
-
✅ Did I handle potential failure modes and edge cases?
|
|
194
|
-
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
198
|
-
|
|
199
|
-
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
200
|
-
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
201
|
-
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|