Skip to content

id: build: durable multiplayer note checkpoints and merges #3819

Open

Description

@dezren39

Parent: #2048 (ID Zettelkasten design). Phase 3 — depends on #3814 (stable note identity/revision graph) and Drew's explicit answer to Q2 on #2048 (shared-write authority).

Bridge the existing live ProseMirror session to durable note revisions. Key sessions by stable note ID rather than filename; keep live steps/cursors as transient transport; on save/checkpoint publish a signed immutable revision with the current note ID and parent head(s). A stale/offline edit must not overwrite another writer: retain concurrent heads and require an explicit merge revision. Do not make one web process's in-memory collaboration state the replicated source of truth.

Gate: before implementing any shared-write authorization, re-read #2048 Q2. Use the selected policy; if Drew has not answered, park without changing authorization behavior. Do not infer write permission from friendly-name resolution or the reader's writer-set projection. No cross-store resolver work (that remains #2259).

Acceptance:

  • Reopening a note by stable ID recovers its latest known revision and history across server restart/replica sync.
  • A normal live session can checkpoint to a signed revision; ephemeral steps/cursors are not emitted as permanent events.
  • Concurrent/offline sessions create separate heads; an explicit merge names its parents; no last-writer-wins data loss.
  • The chosen group/write policy is tested at the boundary and is separate from viewer-specific visibility.
  • Existing filename-based document editing remains compatible during migration; tests cover old and new paths.

Activity

  1. added
    priority/highImportant and time-sensitive
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    on Nov 1, 2026
  2. developing-today commented on Nov 1, 2026

    @developing-today
    Contributor
  3. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    agent-note:v1 — queued, parent #2048 phase 3; queue task 5826, dedupe repo-health:v1:fix:developing-today/code:issue:3819. Resume only after #3814 lands and Drew answers shared-write authority Q2 on #2048; then persist signed checkpoints and explicit concurrent merges. Filed by repo-worker-code, OpenChamber scheduled lane, 2026-11-01T16:54Z.

  4. added
    work/assignedQueue worker lifecycle state
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 1, 2026
  5. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked — claimed early; both start gates in the packet are unmet

  6. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked

  7. 45 remaining items

  8. added
    status/blockedQueue or user escalation state
    user/escalatedQueue or user escalation state
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 3, 2026
  9. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1 — state: blocked (task 5826, OpenChamber scheduled lane)

    • Agent: repo-worker-code; lane: 9aca43b4-5439-4939-9f71-323f5d32521b; origin=openchamber-scheduled-lane.
    • Gate update: id: build: stable note identity and revision graph #3814 is CLOSED; Drew's Q2 ruling #6599898441 allows write-grant members to append attributed revisions. The prior parent design PR design(id): #2048 Zettelkasten layer #3885 is MERGED and untouched.
    • New blocker: Q3 (who may read shared notes) remains unanswered in id: design: Zettelkasten layer — multiplayer docs/wiki on ID #2048, latest design summary #6561462943. Options are group Read grant, per-note ACL, or public-by-default; the design says keep multiplayer sharing disabled until the read policy is decided and enforced. This is an owner/product decision, so I have escalated it rather than inferring a policy.
    • Current-main implementation evidence at f8e356f: permits anonymous/display-only WebSocket identities and accepts steps without a role check; does not link these client IDs to member signing keys. signs with the server node key; records no group. does not enforce a Write grant on event application. has an open sync gate, and reads blobs without group authorization. A route-only check would not protect replicated events or blob visibility.
    • Disposition: blocked as ; no source changes. Resume after Drew decides the reader policy and the member-key signing/authorization design is settled. The clean pushed branch/worktree are preserved: , .
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1 — state: blocked (task 5826, OpenChamber scheduled lane; evidence correction)

    • Agent: repo-worker-code; lane: 9aca43b4-5439-4939-9f71-323f5d32521b; origin=openchamber-scheduled-lane.
    • Gate update: id: build: stable note identity and revision graph #3814 is CLOSED; Drew's Q2 ruling #6599898441 allows write-grant members to append attributed revisions. Parent design PR design(id): #2048 Zettelkasten layer #3885 is MERGED and untouched.
    • New blocker: Q3 (who may read shared notes) remains unanswered in id: design: Zettelkasten layer — multiplayer docs/wiki on ID #2048, latest design summary #6561462943. Options are group Read grant, per-note ACL, or public-by-default; the design says keep multiplayer sharing disabled until the read policy is decided and enforced. This is an owner/product decision, so it is escalated rather than inferred.
    • Current-main evidence at f8e356f: pkgs/id/src/web/collab.rs:792-855,1083-1118 permits anonymous/display-only WebSocket identities and accepts steps without a role check; pkgs/id/src/web/identity.rs:140-175,280-363,540-545 does not link these client IDs to member signing keys. pkgs/id/src/local_events.rs:212-229,699-731 signs with the server node key; local_events.rs:704-726 records no group. pkgs/id/src/event_store/resolve.rs:382-399 does not enforce a Write grant on event application. pkgs/id/src/event_sync.rs:24-27,72-75 has an open sync gate, and pkgs/id/src/web/routes.rs:727-781 reads blobs without group authorization. A route-only check would not protect replicated events or blob visibility.
    • Disposition: blocked as escalated-to-user; no source changes. Resume after Drew decides the reader policy and the member-key signing/authorization design is settled. The clean pushed branch/worktree are preserved: queue/5826-3819-durable-notes, /home/user/git/fleet/5826.
  11. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1 — gate update (triage task 6823)

  12. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    Gate update: Q3 read-authority is DECIDED — this issue's read-policy gate is cleared (2026-11-04)

    Drew's ruling on design #2048 question Q3 (main chat, 2026-11-04 ~10:32 CST), verbatim:

    "default read but able to choose any number of groups or users. default public unless user or server config different defaults"

    What this means for this phase: read access defaults to public read; the owner can scope/grant read to any number of groups or users (arbitrary ACL, not a single fixed group); the public default yields to a user's own default or the server config default. Default resolution order: object setting → user default → server config default → public. Enforce and test this read policy at the event/blob gates per this issue's acceptance criteria.

    Full ruling comment: #5535 (comment) (also cross-referenced on design issue #2048). Note this settles Q3 (read) only; Q2 shared-write authority was already ruled on 2026-11-03.

  13. developing-today commented on Nov 7, 2026

    @developing-today
    Contributor

    🤖 Agent note · gate cleared — unblocked (label repair)

  14. added and removed
    status/blockedQueue or user escalation state
    user/escalatedQueue or user escalation state
    queue/blockedQueue or user escalation state
    on Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-inskind/enhancementpriority/highImportant and time-sensitivequeue/queuedHas a queued task in the Supabase agent queuestatus/needs-triageNot yet triaged; needs a first look

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions