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,203 +1,154 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: local-first
|
|
3
|
-
description: Local-first software
|
|
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
|
-
# Local-First
|
|
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
|
-
## Output Format
|
|
160
|
-
|
|
161
|
-
When this skill produces or reviews code, structure your output as follows:
|
|
162
|
-
|
|
163
|
-
```
|
|
164
|
-
━━━ Local First Report ━━━━━━━━━━━━━━━━━━━━━━━━
|
|
165
|
-
Skill: Local First
|
|
166
|
-
Language: [detected language / framework]
|
|
167
|
-
Scope: [N files · N functions]
|
|
168
|
-
─────────────────────────────────────────────────
|
|
169
|
-
✅ Passed: [checks that passed, or "All clean"]
|
|
170
|
-
⚠️ Warnings: [non-blocking issues, or "None"]
|
|
171
|
-
❌ Blocked: [blocking issues requiring fix, or "None"]
|
|
172
|
-
─────────────────────────────────────────────────
|
|
173
|
-
VBC status: PENDING → VERIFIED
|
|
174
|
-
Evidence: [test output / lint pass / compile success]
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**VBC (Verification-Before-Completion) is mandatory.**
|
|
178
|
-
Do not mark status as VERIFIED until concrete terminal evidence is provided.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## 🏛️ Tribunal Integration (Anti-Hallucination)
|
|
184
|
-
|
|
185
|
-
**Slash command: `/tribunal-backend`**
|
|
186
|
-
**Active reviewers: `logic` · `security`**
|
|
187
|
-
|
|
188
|
-
### ❌ Forbidden AI Tropes in Local-First
|
|
189
|
-
|
|
190
|
-
1. **Treating CRDTs as magic** — CRDTs solve concurrent edits to shared state, not schema migrations or access control.
|
|
191
|
-
2. **Inventing CRDT libraries** — `crdt-js`, `conflict-free`, `local-sync` are not real packages. Yjs, Automerge, and Loro are the real libraries.
|
|
192
|
-
3. **Skipping conflict detection in LWW** — Last-Write-Wins silently drops data. Always make the conflict resolution strategy explicit and communicate it to the user.
|
|
193
|
-
4. **Local storage for everything** — `localStorage` is synchronous, has a 5MB limit, and is not available in workers. Use IndexedDB via Dexie or Origin Private File System.
|
|
194
|
-
|
|
195
|
-
### ✅ Pre-Flight Self-Audit
|
|
196
|
-
|
|
197
|
-
```
|
|
198
|
-
✅ Is the conflict resolution strategy explicit and documented?
|
|
199
|
-
✅ Are only real CRDT libraries used (Yjs, Automerge, Loro)?
|
|
200
|
-
✅ Is offline state persisted to IndexedDB, not localStorage?
|
|
201
|
-
✅ Is the sync queue replay idempotent (safe to process the same mutation twice)?
|
|
202
|
-
✅ Does the UI clearly communicate offline/syncing/synced state to the user?
|
|
203
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: local-first
|
|
3
|
+
description: Local-first software architecture mastery. CRDTs (Conflict-free Replicated Data Types), IndexedDB synchronization, sync engines (ElectricSQL, Replicache, PowerSync), offline-capable data fetching, optimistic UI, and SQLite in the browser (WASM). Use when building PWA offline capabilities, rapid UIs, or multiplayer collaborative tools.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
5
|
+
version: 2.0.0
|
|
6
|
+
last-updated: 2026-04-02
|
|
7
|
+
applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Local-First Architecture — Offline-capable Mastery
|
|
11
|
+
|
|
12
|
+
> The network is the bottleneck. The database should live on the user's device.
|
|
13
|
+
> Traditional SaaS is Cloud-First. The future of UX is Local-First.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Core Principles of Local-First
|
|
18
|
+
|
|
19
|
+
In a Cloud-First app (REST/GraphQL), the UI waits for the server.
|
|
20
|
+
In a Local-First app, the UI talks *only* to a local database. A background engine syncs that database to the cloud when online.
|
|
21
|
+
|
|
22
|
+
1. **Fast by default**: Zero network latency because reads/writes happen locally.
|
|
23
|
+
2. **Offline works flawlessly**: The app bounds to a local store (SQLite via WASM, IndexedDB).
|
|
24
|
+
3. **Multi-device Sync**: Conflict resolution is handled natively (usually via CRDTs or central conflict ledgers).
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 2. Sync Engines vs traditional fetching
|
|
29
|
+
|
|
30
|
+
Do not use React Query / SWR to build local-first. They are HTTP caching mechanisms.
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// ❌ CLOUD-FIRST (React Query / Fetch)
|
|
34
|
+
// Fails when offline. Subject to UI latency.
|
|
35
|
+
const { data, isLoading } = useQuery({
|
|
36
|
+
queryKey: ['todos'],
|
|
37
|
+
queryFn: () => fetch('/api/todos').then(res => res.json())
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
// ✅ LOCAL-FIRST (e.g. PowerSync / ElectricSQL / WatermelonDB)
|
|
41
|
+
// Resolves instantly. Data lives locally. Syncs silently in background.
|
|
42
|
+
import { useQuery } from '@powersync/react';
|
|
43
|
+
|
|
44
|
+
const { data, isLoading } = useQuery('SELECT * FROM todos ORDER BY created_at DESC');
|
|
45
|
+
|
|
46
|
+
// Writes are also local First
|
|
47
|
+
const addTodo = async (text: string) => {
|
|
48
|
+
// Written to the local SQLite WASM database instantly.
|
|
49
|
+
await localDb.execute('INSERT INTO todos (id, text) VALUES (uuid(), ?)', [text]);
|
|
50
|
+
// Background worker syncs to Postgres later.
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. Conflict Resolution (CRDTs)
|
|
57
|
+
|
|
58
|
+
When two users edit the exact same document offline and then reconnect, how is it resolved?
|
|
59
|
+
|
|
60
|
+
**Conflict-free Replicated Data Types (CRDTs)** automatically merge data without requiring a central server to decide the "winner."
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// Yjs - The leading CRDT library for collaborative text/state
|
|
64
|
+
import * as Y from 'yjs'
|
|
65
|
+
import { WebsocketProvider } from 'y-websocket'
|
|
66
|
+
|
|
67
|
+
const ydoc = new Y.Doc()
|
|
68
|
+
const provider = new WebsocketProvider('wss://sync.example.com', 'room-1', ydoc)
|
|
69
|
+
|
|
70
|
+
// Shared state array
|
|
71
|
+
const yarray = ydoc.getArray('todos')
|
|
72
|
+
|
|
73
|
+
// Observe changes (Fires locally and when peers sync)
|
|
74
|
+
yarray.observe(event => {
|
|
75
|
+
console.log("State updated natively without conflict:", yarray.toArray())
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
// Insert data (Instantly merges cleanly with remote peers)
|
|
79
|
+
yarray.insert(0, ['Buy milk'])
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 4. In-Browser Databases
|
|
85
|
+
|
|
86
|
+
Storing megabytes of relational data in `localStorage` will crash the browser.
|
|
87
|
+
|
|
88
|
+
| Technology | Use Case | Pros | Cons |
|
|
89
|
+
|:---|:---|:---|:---|
|
|
90
|
+
| **IndexedDB** | Key-Value | Native to browser | Hideous callback API, weak querying |
|
|
91
|
+
| **Dexie.js** | Key-Value | Wraps IndexedDB with clean Promises | Not relational |
|
|
92
|
+
| **SQLite WASM (OPFS)** | Relational | True SQL in browser | Setup complexity (Origin Private File System) |
|
|
93
|
+
| **RxDB** | NoSQL Offline | Reactive UI out-of-the-box | Requires learning RxJS/Observables |
|
|
94
|
+
| **WatermelonDB** | Relational | Built for React Native & Web | Requires native module setup on mobile |
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// Clean IndexedDB Wrapper Example (Dexie)
|
|
98
|
+
import Dexie, { type EntityTable } from 'dexie';
|
|
99
|
+
|
|
100
|
+
interface Friend {
|
|
101
|
+
id: number;
|
|
102
|
+
name: string;
|
|
103
|
+
age: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const db = new Dexie('FriendsDatabase') as Dexie & {
|
|
107
|
+
friends: EntityTable<Friend, 'id'>;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// Schema configuration
|
|
111
|
+
db.version(1).stores({
|
|
112
|
+
friends: '++id, name, age' // Primary key and indexed props
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Write to DB instantly
|
|
116
|
+
await db.friends.add({ name: 'Alice', age: 25 });
|
|
117
|
+
|
|
118
|
+
// Live query natively drives React state without network calls
|
|
119
|
+
import { useLiveQuery } from "dexie-react-hooks";
|
|
120
|
+
const friends = useLiveQuery(() => db.friends.where('age').above(21).toArray());
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 🤖 LLM-Specific Traps (Local-First)
|
|
126
|
+
|
|
127
|
+
1. **`localStorage` Abuse:** Using `localStorage` as a database. It is synchronous, blocking the main UI thread, and limited to 5MB. Use IndexedDB/SQLite WASM.
|
|
128
|
+
2. **Re-inventing Conflict Logic:** Writing manual "last-write-wins" logic using timestamps (`updatedAt`). In distributed systems, clock drift guarantees this will fail and overwrite data corruptly. Use CRDTs (Yjs/Automerge).
|
|
129
|
+
3. **Optimistic UI as Local-First:** Thinking React Query's `onMutate` rollback logic is local-first architecture. It is not. It is a UX trick masking Cloud-First latency.
|
|
130
|
+
4. **Offline Auth Blindness:** Trying to execute local queries while wrapped in an `AuthGuard` that requires a server-side JWT verification on boot. Auth states must be cached locally to allow offline boots.
|
|
131
|
+
5. **Schema Migration Chaos:** Updating cloud schemas without providing local migration scripts. If the local client SQLite DB schema differs from the Postgres cloud schema, the sync engine will crash silently.
|
|
132
|
+
6. **Background Sync Blocking:** Writing custom `setInterval` sync loops on the main JavaScript thread, causing UI stutter. Sync logic must run in a Web Worker (or Service Worker).
|
|
133
|
+
7. **Ignoring IndexedDB Quotas:** Browsers will unpredictably evict IndexedDB data if the user's disk gets full. Architect apps resolving local data as a cache of the cloud, not as the irrevocable source of truth.
|
|
134
|
+
8. **Heavy Client Boot Times:** Bootstrapping a massive 50MB SQLite WASM database onto the client payload, destroying First Contentful Paint. WASM blobs should be pre-fetched/lazy-loaded.
|
|
135
|
+
9. **Eventual Consistency Panic:** Developing UIs that throw errors if a foreign key relation hasn't synced yet. Local-first UIs must defensively handle partial data relationships seamlessly.
|
|
136
|
+
10. **WebSocket vs Local Priority:** Over-relying on WebSockets connected directly to the server. The UI should strictly read from the Local DB; the Local DB gets updated by the WebSocket.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 🏛️ Tribunal Integration
|
|
141
|
+
|
|
142
|
+
### ✅ Pre-Flight Self-Audit
|
|
143
|
+
```
|
|
144
|
+
✅ Is the UI strictly reading from a local DB instead of HTTP network calls?
|
|
145
|
+
✅ Are background sync tasks isolated in a Web Worker (or managed Sync Engine)?
|
|
146
|
+
✅ Is complex relational data stored in IndexedDB/SQLite (not `localStorage`)?
|
|
147
|
+
✅ Are conflicts resolved using CRDT structures rather than arbitrary timestamp comparisons?
|
|
148
|
+
✅ Have authentication states been cached locally to permit true offline app launches?
|
|
149
|
+
✅ Does the local database schema precisely mirror the required subset of the cloud database?
|
|
150
|
+
✅ Are writes executed locally first, instantly updating the UI?
|
|
151
|
+
✅ Have I utilized established Local-First sync engines (PowerSync, ElectricSQL, Yjs) instead of manual queuing?
|
|
152
|
+
✅ Is the UI built to degrade gracefully if sync relationships are temporarily shattered?
|
|
153
|
+
✅ Is the app's initial WASM/DB payload lazy-loaded to preserve fast initial page loads?
|
|
154
|
+
```
|