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.
Files changed (250) hide show
  1. package/.agent/ARCHITECTURE.md +99 -99
  2. package/.agent/GEMINI.md +52 -52
  3. package/.agent/agents/accessibility-reviewer.md +139 -86
  4. package/.agent/agents/ai-code-reviewer.md +160 -90
  5. package/.agent/agents/backend-specialist.md +164 -127
  6. package/.agent/agents/code-archaeologist.md +115 -73
  7. package/.agent/agents/database-architect.md +130 -110
  8. package/.agent/agents/debugger.md +137 -97
  9. package/.agent/agents/dependency-reviewer.md +78 -30
  10. package/.agent/agents/devops-engineer.md +161 -118
  11. package/.agent/agents/documentation-writer.md +151 -87
  12. package/.agent/agents/explorer-agent.md +117 -99
  13. package/.agent/agents/frontend-reviewer.md +127 -47
  14. package/.agent/agents/frontend-specialist.md +169 -109
  15. package/.agent/agents/game-developer.md +28 -164
  16. package/.agent/agents/logic-reviewer.md +87 -49
  17. package/.agent/agents/mobile-developer.md +151 -103
  18. package/.agent/agents/mobile-reviewer.md +133 -50
  19. package/.agent/agents/orchestrator.md +121 -110
  20. package/.agent/agents/penetration-tester.md +103 -77
  21. package/.agent/agents/performance-optimizer.md +136 -92
  22. package/.agent/agents/performance-reviewer.md +139 -69
  23. package/.agent/agents/product-manager.md +104 -70
  24. package/.agent/agents/product-owner.md +6 -25
  25. package/.agent/agents/project-planner.md +95 -95
  26. package/.agent/agents/qa-automation-engineer.md +174 -87
  27. package/.agent/agents/security-auditor.md +133 -129
  28. package/.agent/agents/seo-specialist.md +160 -99
  29. package/.agent/agents/sql-reviewer.md +132 -44
  30. package/.agent/agents/supervisor-agent.md +137 -109
  31. package/.agent/agents/swarm-worker-contracts.md +17 -17
  32. package/.agent/agents/swarm-worker-registry.md +46 -46
  33. package/.agent/agents/test-coverage-reviewer.md +132 -53
  34. package/.agent/agents/test-engineer.md +0 -21
  35. package/.agent/agents/type-safety-reviewer.md +143 -33
  36. package/.agent/patterns/generator.md +9 -9
  37. package/.agent/patterns/inversion.md +12 -12
  38. package/.agent/patterns/pipeline.md +9 -9
  39. package/.agent/patterns/reviewer.md +13 -13
  40. package/.agent/patterns/tool-wrapper.md +9 -9
  41. package/.agent/rules/GEMINI.md +63 -63
  42. package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
  43. package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
  44. package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
  45. package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
  46. package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
  47. package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
  48. package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
  49. package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
  50. package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
  51. package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
  52. package/.agent/scripts/compress_skills.py +167 -0
  53. package/.agent/scripts/consolidate_skills.py +173 -0
  54. package/.agent/scripts/deep_compress.py +202 -0
  55. package/.agent/scripts/minify_context.py +80 -0
  56. package/.agent/scripts/security_scan.py +1 -1
  57. package/.agent/scripts/strip_tribunal.py +41 -0
  58. package/.agent/skills/agent-organizer/SKILL.md +60 -100
  59. package/.agent/skills/agentic-patterns/SKILL.md +0 -70
  60. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
  61. package/.agent/skills/api-patterns/SKILL.md +197 -257
  62. package/.agent/skills/api-security-auditor/SKILL.md +125 -57
  63. package/.agent/skills/app-builder/SKILL.md +326 -50
  64. package/.agent/skills/app-builder/templates/SKILL.md +13 -15
  65. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
  66. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
  67. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
  68. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
  69. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
  70. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
  71. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
  72. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
  73. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
  74. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
  75. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
  76. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
  77. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
  78. package/.agent/skills/appflow-wireframe/SKILL.md +71 -98
  79. package/.agent/skills/architecture/SKILL.md +161 -200
  80. package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
  81. package/.agent/skills/bash-linux/SKILL.md +71 -166
  82. package/.agent/skills/behavioral-modes/SKILL.md +8 -69
  83. package/.agent/skills/brainstorming/SKILL.md +345 -127
  84. package/.agent/skills/building-native-ui/SKILL.md +125 -57
  85. package/.agent/skills/clean-code/SKILL.md +266 -149
  86. package/.agent/skills/code-review-checklist/SKILL.md +0 -62
  87. package/.agent/skills/config-validator/SKILL.md +73 -131
  88. package/.agent/skills/csharp-developer/SKILL.md +434 -73
  89. package/.agent/skills/database-design/SKILL.md +190 -275
  90. package/.agent/skills/deployment-procedures/SKILL.md +81 -158
  91. package/.agent/skills/devops-engineer/SKILL.md +255 -94
  92. package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
  93. package/.agent/skills/doc.md +5 -5
  94. package/.agent/skills/documentation-templates/SKILL.md +19 -63
  95. package/.agent/skills/edge-computing/SKILL.md +75 -165
  96. package/.agent/skills/extract-design-system/SKILL.md +84 -58
  97. package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
  98. package/.agent/skills/frontend-design/SKILL.md +151 -499
  99. package/.agent/skills/game-design-expert/SKILL.md +71 -0
  100. package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
  101. package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
  102. package/.agent/skills/github-operations/SKILL.md +197 -272
  103. package/.agent/skills/gsap-expert/SKILL.md +194 -0
  104. package/.agent/skills/i18n-localization/SKILL.md +60 -172
  105. package/.agent/skills/intelligent-routing/SKILL.md +123 -103
  106. package/.agent/skills/lint-and-validate/SKILL.md +8 -52
  107. package/.agent/skills/llm-engineering/SKILL.md +281 -195
  108. package/.agent/skills/local-first/SKILL.md +76 -159
  109. package/.agent/skills/mcp-builder/SKILL.md +48 -188
  110. package/.agent/skills/mobile-design/SKILL.md +213 -219
  111. package/.agent/skills/motion-engineering/SKILL.md +184 -0
  112. package/.agent/skills/nextjs-react-expert/SKILL.md +184 -203
  113. package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
  114. package/.agent/skills/observability/SKILL.md +211 -203
  115. package/.agent/skills/parallel-agents/SKILL.md +53 -146
  116. package/.agent/skills/performance-profiling/SKILL.md +171 -151
  117. package/.agent/skills/plan-writing/SKILL.md +49 -153
  118. package/.agent/skills/platform-engineer/SKILL.md +57 -103
  119. package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
  120. package/.agent/skills/powershell-windows/SKILL.md +61 -179
  121. package/.agent/skills/python-patterns/SKILL.md +7 -35
  122. package/.agent/skills/python-pro/SKILL.md +273 -114
  123. package/.agent/skills/react-specialist/SKILL.md +227 -108
  124. package/.agent/skills/readme-builder/SKILL.md +15 -85
  125. package/.agent/skills/realtime-patterns/SKILL.md +216 -243
  126. package/.agent/skills/red-team-tactics/SKILL.md +10 -51
  127. package/.agent/skills/rust-pro/SKILL.md +525 -142
  128. package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
  129. package/.agent/skills/server-management/SKILL.md +110 -166
  130. package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
  131. package/.agent/skills/skill-creator/SKILL.md +18 -58
  132. package/.agent/skills/sql-pro/SKILL.md +543 -68
  133. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
  134. package/.agent/skills/swiftui-expert/SKILL.md +124 -57
  135. package/.agent/skills/systematic-debugging/SKILL.md +49 -151
  136. package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
  137. package/.agent/skills/tdd-workflow/SKILL.md +63 -169
  138. package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
  139. package/.agent/skills/testing-patterns/SKILL.md +437 -130
  140. package/.agent/skills/trend-researcher/SKILL.md +30 -71
  141. package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
  142. package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
  143. package/.agent/skills/vue-expert/SKILL.md +225 -119
  144. package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
  145. package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
  146. package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
  147. package/.agent/skills/webapp-testing/SKILL.md +71 -196
  148. package/.agent/skills/whimsy-injector/SKILL.md +58 -132
  149. package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
  150. package/.agent/workflows/api-tester.md +96 -224
  151. package/.agent/workflows/audit.md +81 -122
  152. package/.agent/workflows/brainstorm.md +69 -105
  153. package/.agent/workflows/changelog.md +65 -97
  154. package/.agent/workflows/create.md +73 -88
  155. package/.agent/workflows/debug.md +80 -111
  156. package/.agent/workflows/deploy.md +119 -92
  157. package/.agent/workflows/enhance.md +80 -91
  158. package/.agent/workflows/fix.md +68 -97
  159. package/.agent/workflows/generate.md +165 -164
  160. package/.agent/workflows/migrate.md +106 -109
  161. package/.agent/workflows/orchestrate.md +103 -86
  162. package/.agent/workflows/performance-benchmarker.md +77 -268
  163. package/.agent/workflows/plan.md +120 -98
  164. package/.agent/workflows/preview.md +39 -96
  165. package/.agent/workflows/refactor.md +105 -97
  166. package/.agent/workflows/review-ai.md +63 -102
  167. package/.agent/workflows/review.md +71 -110
  168. package/.agent/workflows/session.md +53 -113
  169. package/.agent/workflows/status.md +42 -88
  170. package/.agent/workflows/strengthen-skills.md +90 -51
  171. package/.agent/workflows/swarm.md +114 -129
  172. package/.agent/workflows/test.md +125 -102
  173. package/.agent/workflows/tribunal-backend.md +60 -78
  174. package/.agent/workflows/tribunal-database.md +62 -100
  175. package/.agent/workflows/tribunal-frontend.md +62 -82
  176. package/.agent/workflows/tribunal-full.md +56 -100
  177. package/.agent/workflows/tribunal-mobile.md +65 -94
  178. package/.agent/workflows/tribunal-performance.md +62 -105
  179. package/.agent/workflows/ui-ux-pro-max.md +72 -121
  180. package/README.md +11 -15
  181. package/package.json +1 -1
  182. package/.agent/skills/api-patterns/api-style.md +0 -42
  183. package/.agent/skills/api-patterns/auth.md +0 -24
  184. package/.agent/skills/api-patterns/documentation.md +0 -26
  185. package/.agent/skills/api-patterns/graphql.md +0 -41
  186. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  187. package/.agent/skills/api-patterns/response.md +0 -37
  188. package/.agent/skills/api-patterns/rest.md +0 -40
  189. package/.agent/skills/api-patterns/security-testing.md +0 -122
  190. package/.agent/skills/api-patterns/trpc.md +0 -41
  191. package/.agent/skills/api-patterns/versioning.md +0 -22
  192. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  193. package/.agent/skills/app-builder/feature-building.md +0 -53
  194. package/.agent/skills/app-builder/project-detection.md +0 -34
  195. package/.agent/skills/app-builder/scaffolding.md +0 -118
  196. package/.agent/skills/app-builder/tech-stack.md +0 -40
  197. package/.agent/skills/architecture/context-discovery.md +0 -43
  198. package/.agent/skills/architecture/examples.md +0 -94
  199. package/.agent/skills/architecture/pattern-selection.md +0 -68
  200. package/.agent/skills/architecture/patterns-reference.md +0 -50
  201. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  202. package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
  203. package/.agent/skills/database-design/database-selection.md +0 -43
  204. package/.agent/skills/database-design/indexing.md +0 -39
  205. package/.agent/skills/database-design/migrations.md +0 -48
  206. package/.agent/skills/database-design/optimization.md +0 -36
  207. package/.agent/skills/database-design/orm-selection.md +0 -30
  208. package/.agent/skills/database-design/schema-design.md +0 -56
  209. package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
  210. package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
  211. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  212. package/.agent/skills/frontend-design/color-system.md +0 -329
  213. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  214. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  215. package/.agent/skills/frontend-design/typography-system.md +0 -363
  216. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  217. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  218. package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
  219. package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
  220. package/.agent/skills/game-development/SKILL.md +0 -236
  221. package/.agent/skills/game-development/game-art/SKILL.md +0 -185
  222. package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
  223. package/.agent/skills/game-development/game-design/SKILL.md +0 -129
  224. package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
  225. package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
  226. package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
  227. package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
  228. package/.agent/skills/game-development/web-games/SKILL.md +0 -150
  229. package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
  230. package/.agent/skills/mobile-design/decision-trees.md +0 -516
  231. package/.agent/skills/mobile-design/mobile-backend.md +0 -491
  232. package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
  233. package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
  234. package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
  235. package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
  236. package/.agent/skills/mobile-design/mobile-performance.md +0 -767
  237. package/.agent/skills/mobile-design/mobile-testing.md +0 -356
  238. package/.agent/skills/mobile-design/mobile-typography.md +0 -433
  239. package/.agent/skills/mobile-design/platform-android.md +0 -666
  240. package/.agent/skills/mobile-design/platform-ios.md +0 -561
  241. package/.agent/skills/mobile-design/touch-psychology.md +0 -537
  242. package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
  243. package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
  244. package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
  245. package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
  246. package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
  247. package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
  248. package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
  249. package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
  250. package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
@@ -1,296 +1,269 @@
1
1
  ---
2
2
  name: realtime-patterns
3
- description: Real-time and collaborative application patterns. WebSockets, Server-Sent Events for AI streaming, CRDTs for conflict-free collaboration, presence, and sync engines. Use when building live collaboration, AI streaming UIs, live dashboards, or multiplayer features.
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: 1.0.0
6
- last-updated: 2026-03-12
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
- ## Transport Selection
18
-
19
- Choose the transport based on what the data flow looks like:
14
+ ## Protocol Selection
20
15
 
21
- | Transport | Direction | Best For | Avoid When |
22
- |---|---|---|---|
23
- | **WebSocket** | Bidirectional | Chat, multiplayer, collaboration | Simple server push |
24
- | **SSE (Server-Sent Events)** | Server → client only | AI streaming, dashboards, notifications | Client needs to send data |
25
- | **WebRTC** | Peer-to-peer | Video/audio, P2P file transfer | Server coordination needed |
26
- | **HTTP Polling** | Client pull | Low-frequency updates, fallback | > 1 update per second |
27
- | **HTTP Streaming** | Server → client | Large response streaming, AI output | Need bidirectionality |
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
- ## WebSocket Patterns
32
-
33
- ### Connection Lifecycle
34
-
35
- ```ts
36
- class WebSocketManager {
37
- private ws: WebSocket | null = null;
38
- private reconnectDelay = 1000;
39
- private maxReconnectDelay = 30000;
40
-
41
- connect(url: string) {
42
- this.ws = new WebSocket(url);
43
-
44
- this.ws.onopen = () => {
45
- this.reconnectDelay = 1000; // Reset on successful connect
46
- this.authenticate();
47
- };
48
-
49
- this.ws.onclose = (event) => {
50
- if (!event.wasClean) {
51
- // Exponential backoff reconnect — never hammer the server
52
- setTimeout(() => this.connect(url), this.reconnectDelay);
53
- this.reconnectDelay = Math.min(this.reconnectDelay * 2, this.maxReconnectDelay);
54
- }
55
- };
56
-
57
- this.ws.onerror = (err) => {
58
- console.error('WebSocket error:', err);
59
- // onclose fires after onerror — let it handle reconnect
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
- ### Backpressure
89
+ // Client
90
+ const eventSource = new EventSource("/api/events");
74
91
 
75
- ```ts
76
- // Unbounded send — crashes if network is slow
77
- for (const item of hugeArray) {
78
- ws.send(JSON.stringify(item)); // Buffers infinitely if slow
79
- }
92
+ eventSource.addEventListener("notification", (e) => {
93
+ const data = JSON.parse(e.data);
94
+ showNotification(data);
95
+ });
80
96
 
81
- // Check bufferedAmount before sending
82
- function sendWhenReady(ws: WebSocket, data: string) {
83
- if (ws.bufferedAmount > 65536) { // 64KB threshold
84
- setTimeout(() => sendWhenReady(ws, data), 50);
85
- return;
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
- ## SSE for AI Streaming
106
+ ## WebSocket
94
107
 
95
- The right transport for one-directional AI text streaming:
108
+ ```typescript
109
+ // Server (ws library)
110
+ import { WebSocketServer, WebSocket } from "ws";
96
111
 
97
- ### Server (Node.js / Hono)
112
+ const wss = new WebSocketServer({ server: httpServer, path: "/ws" });
98
113
 
99
- ```ts
100
- app.get('/api/chat/stream', async (c) => {
101
- const { message } = c.req.query();
114
+ // Connection management
115
+ const clients = new Map<string, WebSocket>();
102
116
 
103
- // Set SSE headers
104
- c.res.headers.set('Content-Type', 'text/event-stream');
105
- c.res.headers.set('Cache-Control', 'no-cache');
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
- const stream = await openai.chat.completions.create({
109
- model: 'gpt-4o',
110
- messages: [{ role: 'user', content: message }],
111
- stream: true,
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
- const encoder = new TextEncoder();
115
- const readable = new ReadableStream({
116
- async start(controller) {
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
- return new Response(readable);
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
- return { text, done };
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
- Last-Write-Wins (LWW):
171
- Settings, preferences, single-value fields
172
- Text editing — loses concurrent edits
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
- // Bind to a rich text editor (Tiptap, ProseMirror, CodeMirror)
200
- const editor = new Editor({
201
- extensions: [Collaboration.configure({ document: doc })],
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
- // Y.Map CRDT for key-value shared state
205
- const awareness = new Y.Map();
206
- awareness.set('cursor', { userId, position });
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
- ## Presence Patterns
212
-
213
- Presence = "who is online and what are they doing":
214
-
215
- ```ts
216
- // Server: track presence via WebSocket lifecycle
217
- const presence = new Map<string, { userId: string; cursor: Position }>();
218
-
219
- wss.on('connection', (ws, req) => {
220
- const userId = authenticate(req);
221
-
222
- ws.on('message', (data) => {
223
- const msg = JSON.parse(data.toString());
224
- if (msg.type === 'cursor') {
225
- presence.set(userId, { userId, cursor: msg.position });
226
- broadcast({ type: 'presence', users: [...presence.values()] });
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
- ws.on('close', () => {
231
- presence.delete(userId);
232
- broadcast({ type: 'presence', users: [...presence.values()] });
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
- ## Sync Engine Selection
229
+ ## Presence System
240
230
 
241
- | Engine | Model | Best For |
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
- ## Output Format
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
- When this skill produces or reviews code, structure your output as follows:
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
- ━━━ Realtime Patterns Report ━━━━━━━━━━━━━━━━━━━━━━━━
257
- Skill: Realtime Patterns
258
- Language: [detected language / framework]
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
- > A red team engagement is a controlled attack.
13
- > The goal is to find what a real attacker would find — before they do.
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
- | Target | What to Test |
83
+ |Target|What to Test|
84
84
  |---|---|
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 |
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
- | Finding | Severity | Fix By |
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.