Replaces wasteful 30s polling with event-driven design: - No polling - worker sleeps until woken by SignalReplication() - Replication triggers immediately on write operations - Perfect for low-change vaults (could be days without writes) Changes: - edition/replication.go: Event-driven worker with channel signaling - edition/edition.go: Add SignalReplication var - edition/community.go: No-op SignalReplication stub - edition/commercial.go: Wire up signalReplication Architecture: 1. Write handler marks entry dirty (replication_dirty = 1) 2. Calls edition.SignalReplication() (non-blocking) 3. Worker wakes, batches ALL dirty entries 4. POSTs to backup POP 5. Clears dirty flags on success 6. Worker sleeps until next signal Retry logic: - Exponential backoff: 1s, 5s, 25s, 125s... - Max 5 retries, then operator alert - Dirty entries persist in DB until replicated Resource efficiency: - CPU: Only wakes on actual writes (not 2,880x/day polling) - Network: Only sends when data changes - For 10 writes/day: ~288x fewer wakeups than polling Documentation: - SPEC-replication-async.md: Full event-driven design spec |
||
|---|---|---|
| clavis | ||
| clavitor.ai | ||
| design-system | ||
| docs | ||
| marketing | ||
| operations | ||
| .DS_Store | ||
| ._.DS_Store | ||
| CLAUDE.md | ||