feat: open sections through a replica-backed session for the app
The application edits through notebook::session. Section::open binds a
section file to a replica under a cache directory named by the document
identity and publishes in the background through a file remote (read_file,
commit_file and the new confirm_file_snapshot); save(space, before, after,
author) reports Queued, Unchanged or Stale, the last when the stored page no
longer matches the model the edit started from. The recovery contract is
queue(), conflicts(), remote_page(space), review(id, after) and
export_recovery(path).
The canvas editor gains CanvasEditor::page(), rebuilding the stored model
from its state so an unedited import round-trips exactly and an edited one
feeds the page writer; import retains only what it used to overwrite.
snowbound opens a page with --section FILE TITLE [--cache DIR], saves every
change through the session, shows saving, saved, conflict or offline in the
window title, reloads a page changed underneath the editor, and resolves a
conflict with ⌘⇧K (keep mine) or ⌘⇧T (take theirs).
tools/session_acceptance.py is the executable acceptance scenario: the
session_client example edits pages on the mounted Samba share across two
launches and a OneNote clone reopens the result; the first run passed on
four pages (evidence/m4/session-acceptance).
Assisted-by: claude-fable-5.1
cffb5ce4bcclover caruso committed on 9/13/2026, 12:00:32 AMparent7d2feb6