From 23a7b36d0d20ef1f809db0b5d69f1416021afb91 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 16 Oct 2026 20:58:18 +0200 Subject: notes: write and commit failures are reported, not assumed A review of the branch found four ways the page could report success for work that never happened, all reachable in ordinary use. Writes: setText is asynchronous unless blockWrites, and its saved()/saveFailed() do not fire for every write (a second setText to the same path loses the signal, which stranded the callback), so a save was reported before it landed and a failed db.json or body write was never seen. Both views now block and carry the outcome, so writeDb and writeBody know the result when they return; a failed create therefore leaves no index entry. The create path also loads the body before the index, so a failed body write cannot leave an entry with no text. Commits: the sync chain swallowed every commit failure with '|| true', so a failing pre-commit hook or a signing failure pushed an unchanged HEAD and reported success. It now stages, commits only when something is staged, and lets 'set -e' fail the chain, with stderr folded in for the whole chain rather than just the push. Duplicate notes: the 'awaiting commit' state lived only in a 3 second timer, so a slower second click re-entered create() and appended a second note. It is now a page property that outlives the timer, and the button follows it. Preview: the shared Switch writes checked itself, dropping the binding, so the switch stopped following page.preview; resynced on change, the way StatusRow.qml does. Also validates a note's file name as digits before read, write or rm, and clears the index error once the index reads again. --- docs/superpowers/specs/2026-10-16-notes-design.md | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'docs/superpowers/specs/2026-10-16-notes-design.md') diff --git a/docs/superpowers/specs/2026-10-16-notes-design.md b/docs/superpowers/specs/2026-10-16-notes-design.md index a9f5420..53b9d2e 100644 --- a/docs/superpowers/specs/2026-10-16-notes-design.md +++ b/docs/superpowers/specs/2026-10-16-notes-design.md @@ -120,6 +120,10 @@ and writing it back would delete every title, so the write instead reports git to resolve. `Notes.valid` is the check; `Notes.parse` stays tolerant for display, returning an empty store for the same input. +A write that fails is reported, not assumed to have landed: both writes block +(`blockWrites`), because `setText` is asynchronous otherwise, and a failure +that nobody observes reports a save that never happened. + - **Create**: the first click pulls first (see Git), then re-reads `db.json` so the append is based on what the pull brought in, not on what was read before it; `notes.sh` reads the id after its own pull for the same reason. -- cgit v1.2.3