content: CvRDT collaborative merge + 34 convergence tests (Phase 3 complete, 196/196)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 43s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 43s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,7 +19,7 @@ injected adapter, not core.
|
||||
|
||||
## Status (rolling)
|
||||
|
||||
`bash lib/content/conformance.sh` → **162/162** (Phase 1 complete + Phase 2: persist op log)
|
||||
`bash lib/content/conformance.sh` → **196/196** (Phases 1–3 complete: blocks, doc, render, api, persist op log, CRDT merge)
|
||||
|
||||
## Ground rules
|
||||
|
||||
@@ -67,8 +67,8 @@ lib/content/api.sx ── (content/edit) (content/render) (content/history) ─
|
||||
- [x] `(content/history doc)`, diff between versions
|
||||
|
||||
## Phase 3 — Collaborative merge (CRDT)
|
||||
- [ ] commutative/idempotent op merge
|
||||
- [ ] concurrent-edit tests (any order, double-apply → identical)
|
||||
- [x] commutative/idempotent op merge
|
||||
- [x] concurrent-edit tests (any order, double-apply → identical)
|
||||
|
||||
## Phase 4 — External sync + federation
|
||||
- [ ] Ghost/CMS sync via injected adapter (import/export)
|
||||
@@ -77,6 +77,18 @@ lib/content/api.sx ── (content/edit) (content/render) (content/history) ─
|
||||
|
||||
## Progress log
|
||||
|
||||
- 2026-06-07 — Phase 3 `crdt.sx` (**Phase 3 complete**): collaborative merge as
|
||||
a state-based CvRDT. Merge is a join (lub) on a semilattice → commutative,
|
||||
associative, idempotent by construction. Ordering = unique dense Logoot
|
||||
position keys (cell = (digit actor), lexicographic); presence = OR-tombstones
|
||||
(remove-wins); each field = an LWW-Register keyed by logical (ts, actor). Every
|
||||
op contributes a PARTIAL element and per-id state is their join, so
|
||||
update-/delete-before-insert are not lost. `crdt-materialize` bridges back to a
|
||||
Phase-1 `CtDoc` (sort live elements by pos → blocks). Tests prove: ops in any
|
||||
order converge, double-apply is a no-op, merge commutes/associates/is
|
||||
idempotent, concurrent inserts order deterministically, same-field LWW by
|
||||
(ts,actor), disjoint fields both survive, two divergent replicas converge both
|
||||
ways. 34 tests; suite 196/196.
|
||||
- 2026-06-07 — Phase 2 `store.sx` (**Phase 2 complete**): op log + versioning
|
||||
over the persist event stream. `content/commit!` appends an edit op as a
|
||||
persist event to the doc's stream (`content:<id>`); the log is the source of
|
||||
|
||||
Reference in New Issue
Block a user