Skip to content

fix(concurrency): optimistic Node rebase can report transaction identity conflict #290

Description

@DecisionNerd

Observation

PR #289 ordinary CI run 30689965005 failed the existing Node concurrency parity test write-mode options validate and optimistic agents publish exactly once. One of two distinct optimistic writers returned GF_IDEMPOTENCY_CONFLICT from an expected rebase path.

The failure is outside #287's npm amendment scope, but it blocks that PR's required normal CI gate.

Acceptance criteria

  • A deterministic regression test reproduces the stale optimistic-attempt state that returns GF_IDEMPOTENCY_CONFLICT during a valid distinct-create rebase.
  • The optimistic rebase cleans or safely reuses only its own aborted staging state and both non-conflicting writes publish exactly once.
  • Conflicting operation-identity reuse still returns GF_IDEMPOTENCY_CONFLICT.
  • Focused storage/API/Node concurrency tests pass without retries, sleeps, skips, or weakened assertions.

Non-goals

Reopened current-head authority conflict (2026-09-10)

PR #1243, exact head 547ec4c98bbfdc6764ba642f9d71b28eeb73b34b, Test Suite run 34537860496, Node job 103073636722 reproduces the same public optimistic distinct-create failure: GF_IDEMPOTENCY_CONFLICT, with property mutation authority changed: expected=01a08d77-4994-73c3-adf0-603c6031afb3 current=2ca9f9b1-d38f-86e9-a48d-5e5328ad35cd. The remaining independent Bazel lane is still running; this is not a complete failure census yet.

The worker calls composite CreateNode without executing a query. Current main 5fc68e568893110cca97b0eb2c797d306b264e27 and the PR both use seal_property_windows in storage: CURRENT generation drift returns TransactionConflict, mapped to GF_IDEMPOTENCY_CONFLICT. The optimistic publisher retries only GF_WRITE_CONFLICT. Its existing concurrency test synchronizes after staging, later than this authority-capture/seal race. This is an additional verified boundary for the canonical public failure, independent of the PR's input-predicate rule; earlier staging-reuse repair evidence remains valid for its tested boundary.

Remaining acceptance

  • Deterministically force a competing publication between property authority capture and sealing; prove the stale authority is classified as a write conflict.
  • Exercise bounded optimistic rebase and prove distinct writes publish exactly once, including property values, immediate reads, reopen and same-operation retry.
  • Preserve genuine operation-identity mismatch as GF_IDEMPOTENCY_CONFLICT, and preserve current authentication, cancellation and recovery refusal.
  • Pass focused Rust/storage/API and rebuilt Node concurrency coverage and required exact-head CI without blind reruns, sleeps, skips or weakened assertions.

This existing canonical issue blocks #1241 / PR #1243 and epic #1194. No concurrency redesign or compatibility machinery is authorized. Any temporary fourth WIP change is limited to this verified shared CI blocker under the repository queue-repair exception; drain the queue after it merges.

Complete failure census: run 34537860496 is now terminal FAILURE. Authoritative Bazel, Python binding, macOS durability, Windows locks, native durability aggregate and all applicable quality/policy lanes passed. Node Binding is the sole test failure; CI Gate failed as its aggregate. Concurrency Matrix and Bazel Diagnostics were skipped by the existing workflow. No blind rerun was requested. The finite repair batch is this canonical authority-conflict issue; #1243 remains first downstream merge candidate after the repair lands.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions