# feat: open sections through a replica-backed session for the app · clo/snowbound

[View on GitCafe](https://git.cafe/clo/snowbound/commit/cffb5ce4bca95f8c242b5513d981a708206cee41)

Repository: [clo/snowbound](https://git.cafe/clo/snowbound)

Visibility: public

Requested revision: cffb5ce4bca95f8c242b5513d981a708206cee41

Requested commit: cffb5ce4bca95f8c242b5513d981a708206cee41

Commit: cffb5ce4bca95f8c242b5513d981a708206cee41

Tree: cb09fcef5f6794e742e6945aec25c7e37da23252

Author: clover caruso

Committer: clover caruso

## Message

```
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

```

## Parents

- [7d2feb6f84ba766193b4041b9d6ee375a354e98e](https://git.cafe/clo/snowbound/commit/7d2feb6f84ba766193b4041b9d6ee375a354e98e?format=markdown)

[Source at this commit](https://git.cafe/clo/snowbound/tree/cffb5ce4bca95f8c242b5513d981a708206cee41?format=markdown)
