NEC-322: A canvas card deleted after its note was renamed while sync was stopped comes back on reconnect #315

Merged
nectenda-agent merged 6 commits from worktree-nec-322-a-canvas-card-deleted-after-its-note-was into main 2026-10-24 09:12:26 +01:00
Collaborator

Task: NEC-322 — https://projectron.nerchure.com/tasks/342

A canvas card deleted while sync was stopped, after its note was renamed, came back on reconnect (canvas hardness seed 1466510158, round 22): the rename reached the other vault first, its Obsidian rewrote the card's link, and the delete's snapshot, holding the old path, no longer matched. The canvas codec's settle now lets a tombstone follow a card's link as a delete and a rename's link update meet, in either order and in a restart's catch-up (StructuredSync hands settle what changed, and asks for the codec's map roots before loading). SAFE-A18 and sync-limitations updated, including the accepted ambiguity of a deliberate re-pointing. Verified: local gate, e2e mutation-checked in the container, seed replay (44 rounds) and a 60-minute canvas hardness run (seed 89155060, 270 rounds); manually tested by the user.

Spec: docs/changes/NEC-322-canvas-delete-after-offline-rename/spec.md

Changelog

A canvas card you delete while sync is stopped no longer comes back when you had also renamed the note it shows.

Task: NEC-322 — https://projectron.nerchure.com/tasks/342 A canvas card deleted while sync was stopped, after its note was renamed, came back on reconnect (canvas hardness seed 1466510158, round 22): the rename reached the other vault first, its Obsidian rewrote the card's link, and the delete's snapshot, holding the old path, no longer matched. The canvas codec's settle now lets a tombstone follow a card's link as a delete and a rename's link update meet, in either order and in a restart's catch-up (StructuredSync hands settle what changed, and asks for the codec's map roots before loading). SAFE-A18 and sync-limitations updated, including the accepted ambiguity of a deliberate re-pointing. Verified: local gate, e2e mutation-checked in the container, seed replay (44 rounds) and a 60-minute canvas hardness run (seed 89155060, 270 rounds); manually tested by the user. Spec: `docs/changes/NEC-322-canvas-delete-after-offline-rename/spec.md` ## Changelog A canvas card you delete while sync is stopped no longer comes back when you had also renamed the note it shows.
Task: NEC-322
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017YJuBL6Ntt4ve5BBagPPAb
Canvas hardness run, seed 1466510158, round 22: A renamed a note and
deleted a card showing it while sync was stopped. On reconnect the
rename reached B before A's board did; B's Obsidian rewrote the card's
link, and A's tombstone, holding the old path, no longer matched, so the
card came back in both vaults. The canvas codec now settles this after
every change: a card differing from a snapshot only in its link, from a
path gone here to one that exists, has the snapshot follow it (SAFE-A18).

Task: NEC-322
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017YJuBL6Ntt4ve5BBagPPAb
Review of the first version: run over every tombstone after every
change, forever, the rule buried a card brought back by a deliberate
re-pointing days later, once its old file went or its new one was
renamed, and buried such a card in a vault receiving the whole board
before its old file was on disk. StructuredSync now hands a codec's
settle what changed since the last one (collectRootChanges), and the
canvas rule acts only on a tombstone that arrived for a card the vault
held, or on a card whose link moved while it read as deleted.

Task: NEC-322
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017YJuBL6Ntt4ve5BBagPPAb
A vault offline across both a delete and a deliberate re-pointing meets
them together on return and keeps the card deleted for everyone, late.
Found by review of NEC-322; the accepted ambiguity, now written down.

Task: NEC-322
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017YJuBL6Ntt4ve5BBagPPAb
Review of NEC-322: StructuredSync made only its own roots maps before
loading a document, so a board's nodeFields and tombstones, first met in
the catch-up, were placeholders whose changes collectRootChanges cannot
report. A delete arriving as a vault started again never met the rename
it crossed. The canvas codec now names its map roots (mapRoots), asked
for when the document is made. SAFE-A18's "MUST NOT bury again" is
qualified by the late case sync-limitations already accepted.

Task: NEC-322
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tqcdhmk4cWL36YWBmL8vgw
Record NEC-322's second review in its spec
All checks were successful
Release note / release-note (pull_request) Successful in 17s
CI / build (pull_request) Successful in 5m33s
CI / e2e (pull_request) Successful in 13m12s
CI / promote (pull_request) Has been skipped
CI / build (push) Successful in 5m47s
CI / e2e (push) Successful in 12m58s
CI / promote (push) Successful in 32s
8304f81065
Task: NEC-322
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tqcdhmk4cWL36YWBmL8vgw
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Nectenda/nectenda!315
No description provided.