Skip to content

fix(deps): update module github.com/go-crdt/crdt to v0.36.0 - #15

Merged
tannevaled merged 1 commit into
mainfrom
renovate/deps
Aug 30, 2026
Merged

fix(deps): update module github.com/go-crdt/crdt to v0.36.0#15
tannevaled merged 1 commit into
mainfrom
renovate/deps

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
github.com/go-crdt/crdt v0.35.0v0.36.0 age confidence

Release Notes

go-crdt/crdt (github.com/go-crdt/crdt)

v0.36.0

Compare Source

Map.Collect asked for a version every replica had delivered. That is not
what a tombstone needs, and two replicas that had applied the same operations
ended up holding different documents.

What was wrong

A version says which operations everybody holds. It says nothing about the
clocks of the operations still in flight — a site that has seen nothing writes
at clock one
, however far along everyone else is.

So: site 3 writes k, site 2 deletes k, neither having seen the other. Both
are at clock 1 and the tie goes to the higher site, so the write beats the
deletion. The deletion reaches everybody, which makes it collectable by the rule
as stated. The write is still on its way.

  • The replica that kept the tombstone compares the write against it, the
    write wins, and the key comes back.
  • The replica that collected has nothing left to compare against, refuses
    the write, and the key stays gone.
the replica that collected      : held=false value=""
the one that kept the tombstone : held=true  value="v"

Same operations. Different documents. This is the shape of the fault that
withdrew the text and list collection in v0.35.0, in the one collection that was
kept.

Breaking

Map.Collect, Composite.Collect and structured.Diagram.Collect take a
clock floor as well: a promise that no operation with a clock at or under it
can still arrive. A tombstone goes when its own clock is at or under that floor
— everything still to come is then strictly later, and a write strictly later
beats it, brings the key back, and wants no comparison. What needed the
tombstone was a write at or below its clock.

A replica cannot work the floor out alone: it does not know who is out
there, and the site whose write is on its way is exactly the one it has never
heard from. Map.LastClocks, Map.Clock and Composite.Clocks are what it
offers whoever can promise one. CompositeClocks carries one floor per part,
because each map has a clock of its own.

go-crdt/collab v0.34.0 computes such a floor: participants acknowledge their
clocks as well as their version.

Also

  • Composite.Apply reports what a map part refuses instead of dropping it.
    The comment said a part's Apply could not fail once the batch had validated;
    that stopped being true when Map.Collect introduced ErrStranded, which is
    about the state of this replica rather than the batch. Dropping it meant the
    operation was refused, the caller was told the batch had been applied, and
    everything that site sent afterwards waited for a predecessor that never
    arrived — 63 thrown away in one chaos run, one replica left holding 1 555
    operations back for good
    .

  • The clock a map remembers collecting under is the floor it was asked with,
    not the highest it happened to drop. What a replica drops depends on what it
    was holding, so remembering that put replica-relative state in a snapshot that
    promises to be canonical: two replicas with the same 782 keys, the same 160
    tombstones, and different bytes.

  • The structured chaos collects, which is how all of this was found — every
    replica reaches its composite, the floor is the meet over all of them, and
    they all collect with the same version so their bytes stay comparable. Twenty
    seeds, eighty-six collections, seventeen thousand records given back, every
    type still agreeing at the end.

  • The floors are fuzzed and have a lane of their own.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate CLI.

@tannevaled
tannevaled merged commit 0ed404a into main Aug 30, 2026
1 check passed
@tannevaled
tannevaled deleted the renovate/deps branch August 30, 2026 14:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant