diff --git a/CHANGELOG.md b/CHANGELOG.md index 50ab8d2..95f34f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -282,7 +282,7 @@ Still absent, and deliberately so until something downstream demands them: dial ## 0.3.19 -- **fix**: `Mst` delete now prunes subtree nodes it empties. `deleteFromNode` recursed into a child and marked the parent dirty but never dropped the child when the delete emptied it; MST nodes are content-addressed, so the emptied node serialized as a real block and changed every ancestor CID. The tree therefore no longer equalled the tree that never contained the key — the equality commit-proof inversion depends on. `verifyCommitDiff` consequently returned `PrevDataMismatch` for valid second commits from a real PDS; any repo with two records whose keys differ in height hits it, since the lower key lives alone in a subtree. We only trimmed at the root; the TS reference and atmos both prune here (atmos cites indigo's `removeChild`/`IsEmpty` invariant). Found downstream in zlay via the atmoq relay-conformance corpus, where the `sync11/commit2-valid` control was being dropped. Post-delete roots now match atmos byte-for-byte over 25,000 deletes in atproto-bench; costs ~3% on a pure-delete microbenchmark. New coverage: a pure-MST prune test, a golden `@atproto/repo` partial-proof fixture through `verifyCommitDiff`, plus canonicality and lazy-stub guards ported from atmos. See `REPORT-mst-inversion-prevdata.md`. +- **fix**: `Mst` delete now prunes subtree nodes it empties. `deleteFromNode` recursed into a child and marked the parent dirty but never dropped the child when the delete emptied it; MST nodes are content-addressed, so the emptied node serialized as a real block and changed every ancestor CID. The tree therefore no longer equalled the tree that never contained the key — the equality commit-proof inversion depends on. `verifyCommitDiff` consequently returned `PrevDataMismatch` for valid second commits from a real PDS; any repo with two records whose keys differ in height hits it, since the lower key lives alone in a subtree. We only trimmed at the root; the TS reference and atmos both prune here (atmos cites indigo's `removeChild`/`IsEmpty` invariant). Found downstream in zlay via the atmoq relay-conformance corpus, where the `sync11/commit2-valid` control was being dropped. Post-delete roots now match atmos byte-for-byte over 25,000 deletes in atproto-bench; costs ~3% on a pure-delete microbenchmark. New coverage: a pure-MST prune test, a golden `@atproto/repo` partial-proof fixture through `verifyCommitDiff`, plus canonicality and lazy-stub guards ported from atmos. See `docs/mst-inversion-prevdata.md`. ## 0.3.18 diff --git a/README.md b/README.md index 1099d9e..0a5d211 100644 --- a/README.md +++ b/README.md @@ -312,31 +312,24 @@ const post = try zat.json.extractAt(FeedPost, allocator, value, .{"post"});
downstream projects — what's building on zat -### firehose consumers (Jetstream) +### protocol infrastructure | project | what it does | |---|---| -| [labelz](https://tangled.org/zzstoatzz.io/labelz) | AT Protocol labeler — keyword-matched, secp256k1-signed, served over XRPC. exists to pressure-test zat as an SDK ([live](https://labelz.fly.dev/health)) | -| [coral](https://tangled.org/zzstoatzz.io/coral) | named-entity recognition over the firehose ([live](https://coral.waow.tech)) | -| [pollz](https://tangled.org/zzstoatzz.io/pollz) | polls on AT Protocol ([live](https://pollz.waow.tech)) | -| [typeahead](https://tangled.org/zzstoatzz.io/typeahead) | community actor search ([live](https://typeahead.waow.tech)) | -| [find-bufo](https://tangled.org/zzstoatzz.io/find-bufo) | bsky bot that quote-posts matching bufo images for opt-in followers | +| [zds](https://tangled.org/zat.dev/zds) | AT Protocol PDS — repos, blobs, OAuth, passkeys, firehose, permissioned spaces ([live](https://pds.zat.dev/xrpc/_health)) | +| [zlay](https://tangled.org/zat.dev/zlay) | AT Protocol relay — crawls every PDS directly, verifies commit signatures, serves the merged event stream ([live](https://zlay.waow.tech/_health)) | +| [stream](https://tangled.org/zat.dev/stream) | Jetstream V2 service with the whole network archived behind it — 16.3M repos, sealed segments back to seq 1 ([live](https://stream.waow.tech)) | +| [jetstream](https://tangled.org/zat.dev/jetstream) | the zig SDK for Jetstream v2 services — subscribe, archive backfill, failover | -### CBOR / CAR / MST users +### applications | project | what it does | |---|---| -| [zlay](https://tangled.org/zzstoatzz.io/zlay) | AT Protocol relay — direct PDS crawl, signature validation, inline collection index ([live](https://zlay.waow.tech/_health)) | -| [atproto-bench](https://tangled.org/zzstoatzz.io/atproto-bench) | cross-SDK relay benchmarks (zig vs go vs rust vs python) | +| [weir](https://tangled.org/zzstoatzz.io/weir) | orchestration server whose database *is* an atproto repo — every run and state transition a record under signed commits, exportable as one CAR | +| [coral](https://tangled.org/zzstoatzz.io/coral) | named-entity recognition over the firehose ([live](https://coral.waow.tech)) | +| [pensieve](https://tangled.org/zzstoatzz.io/pensieve) | public memory search over a repo — semantic artifacts extracted from arbitrary record shapes | | [ken](https://tangled.org/zzstoatzz.io/ken) | semantic search over your atproto repo — vector index of records, search by meaning ([live](https://ken.waow.tech)) | -### identity + XRPC users - -| project | what it does | -|---|---| -| [music-atmosphere-feed](https://tangled.org/zzstoatzz.io/music-atmosphere-feed) | bsky feed generator for music links — JWT auth for personalized feed | -| [leaflet-search](https://tangled.org/zzstoatzz.io/leaflet-search) | search across leaflet, pckt, offprint, and other standard.site publishers | -
## benchmarks diff --git a/REPORT-mst-inversion-prevdata.md b/docs/mst-inversion-prevdata.md similarity index 100% rename from REPORT-mst-inversion-prevdata.md rename to docs/mst-inversion-prevdata.md