NEC-316: A canvas view's own image refit, read in before a write, overwrites a peer's resize #312

Merged
nectenda-agent merged 7 commits from worktree-nec-316-a-canvas-views-own-image-refit-read-in-b into main 2026-10-21 09:47:57 +01:00
Collaborator

Task: NEC-316 — https://projectron.nerchure.com/tasks/336

When a canvas or base view's save and a change from another vault it had not yet shown both changed the same field, the save's value went over the other vault's, silently and with no copy anywhere. Canvas hardness seed 11590143 left an image card one vault's width and the other's height, after Obsidian's own refit was saved before a peer's resize was written. Now the other vault's change stands where both changed a key, the rest of the save is merged key by key, and the save is kept in .nectenda-backups with a notice (SAFE-A48, SAFE-A30's rule carried to every read-in). The copy is owed before any write replaces the file. A clashed save is not agreed, so a quit before its copy makes the next connect keep it. A view whose scene clashes is not bound until the write reloads it. Presentation-only keys stay copy-free (SAFE-A22). Also: refused canvas views log card geometry, every other hardness image card is square, and the hardness check lets through a refit's backup. Gate green; about 65 minutes of canvas hardness over four seeds. One seed failed in a way main also fails, filed as NEC-322. The refit itself is still inferred: the seed did not reproduce on replay.

Spec: docs/changes/NEC-316-canvas-refit-read-in-clash/spec.md

Changelog

When a canvas or base was changed in the same place here and in another vault at once, the other vault's change used to be overwritten silently; now it is kept, and your version is saved in .nectenda-backups with a notice.

Task: NEC-316 — https://projectron.nerchure.com/tasks/336 When a canvas or base view's save and a change from another vault it had not yet shown both changed the same field, the save's value went over the other vault's, silently and with no copy anywhere. Canvas hardness seed 11590143 left an image card one vault's width and the other's height, after Obsidian's own refit was saved before a peer's resize was written. Now the other vault's change stands where both changed a key, the rest of the save is merged key by key, and the save is kept in .nectenda-backups with a notice (SAFE-A48, SAFE-A30's rule carried to every read-in). The copy is owed before any write replaces the file. A clashed save is not agreed, so a quit before its copy makes the next connect keep it. A view whose scene clashes is not bound until the write reloads it. Presentation-only keys stay copy-free (SAFE-A22). Also: refused canvas views log card geometry, every other hardness image card is square, and the hardness check lets through a refit's backup. Gate green; about 65 minutes of canvas hardness over four seeds. One seed failed in a way main also fails, filed as NEC-322. The refit itself is still inferred: the seed did not reproduce on replay. Spec: `docs/changes/NEC-316-canvas-refit-read-in-clash/spec.md` ## Changelog When a canvas or base was changed in the same place here and in another vault at once, the other vault's change used to be overwritten silently; now it is kept, and your version is saved in .nectenda-backups with a notice.
A view refused as showing neither its file nor its document named only
the fields it differed in, so whether it held a size Obsidian fitted to an
image or one somebody chose could only be inferred (NEC-316). Numbers
only, at most five cards. With NEC-316's spec.

Task: NEC-316
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hgTnYB8vdyU6XVmxFqMqS
A save read in within a session was applied as it was, against a base its
document had moved on from. Where it changed a key the remote change had
also changed, its value went over the remote one as an edit made after
seeing it, so the other vault kept no copy either. A canvas view Obsidian
had refitted to its image, asked to save before a peer's resize was
written, left the card one vault's width and the other's height, with no
copy anywhere (canvas hardness seed 11590143).

Now, where both changed a key, the document stands and the rest of the
save is merged key by key, as at a connect (SAFE-A30). The save is kept in
.nectenda-backups with a notice, in the vault whose value lost. The copy
is owed before any write replaces the file, which does not go ahead while
it cannot be made (SAFE-A48).

Task: NEC-316
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hgTnYB8vdyU6XVmxFqMqS
Added at 260x160 for a 1x1 image, every image card was refitted on each
reload, so a refit was the only shape they were tested in (NEC-316). By a
count rather than a draw, so a seed's other choices stay what they were.

Task: NEC-316
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hgTnYB8vdyU6XVmxFqMqS
Task: NEC-316
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hgTnYB8vdyU6XVmxFqMqS
Review of the first version found the clashed save agreed as it was read
in: if its copy failed and Obsidian then quit, the next connect read the
file as behind and wrote it over with no copy. It is now left unagreed,
so a connect reads it as an edit and keeps it (SAFE-A30). Without the
agreement a binding read the view's scene against the older base and went
over the document again, so a view whose scene clashes is not bound until
the write reloads it.

A clash only on presentation-only keys takes no copy (SAFE-A22), a copy
that cannot be made is said once, and the limitation entry now names the
commuting width-against-height case and the false clash against a view that
loaded our write late.

Task: NEC-316
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hgTnYB8vdyU6XVmxFqMqS
A view's refit of an image card that lost a clash with a resize made
elsewhere is kept as a backup now (SAFE-A48), in any round, and the check
for a stray copy would have failed on it. A board backup that differs from
the board only by an image card held square, with no card's content
different, is said in the trace and let through.

Task: NEC-316
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hgTnYB8vdyU6XVmxFqMqS
Record NEC-316's hardness hour and what it could not confirm
All checks were successful
Release note / release-note (pull_request) Successful in 21s
CI / build (pull_request) Successful in 5m44s
CI / e2e (pull_request) Successful in 12m33s
CI / promote (pull_request) Has been skipped
CI / build (push) Successful in 5m47s
CI / e2e (push) Successful in 12m16s
CI / promote (push) Successful in 32s
194c0a6fd9
Task: NEC-316
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hgTnYB8vdyU6XVmxFqMqS
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!312
No description provided.