mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-09 08:04:45 +00:00
strfry's `sync --dir` is bidirectional (its source: doUp = both||up, doDown = both||down), but geode's catch-up was down-only. Add the up half so `dir=up`/`dir=both` reconcile-and-push matches `strfry sync --dir both`. runCatchUpUp reconciles the local set against the upstream (negentropyReconcileIds) and publishes the events we hold that the upstream lacks (the reconcile's `have` ids). Symmetric to the down catch-up: same one `dir`, live up-session starts at `now` when the up catch-up covers history. Reliability: client.publish's outbox is best-effort under a bulk burst (each publish also churns a reconnect — measured ~1-2% dropped per pass), so the push runs as a reconcile→push convergence loop. Each round re-reconciles — the reconcile IS the delivery check against the upstream — and re-pushes only the stragglers until the have-diff is empty. Test observed 3000 → 69 → 2 → 0 across 3 rounds, lossless. Test: MirrorNegentropyCatchUpTest.negentropyCatchUpPushesUp pushes 3000 local events to an empty (no-verify) sink and asserts all 3000 land. The four existing mirror tests still pass (up catch-up needs a store + negentropyBackfill, both off by default). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EZeWww5TJnzBZKPoc6mvU