diff --git a/docs/e2e.md b/docs/e2e.md index 4b8b086..40accae 100644 --- a/docs/e2e.md +++ b/docs/e2e.md @@ -64,6 +64,30 @@ Before the run, 2.0.28 and 2.0.32 were started side by side with the same flags Found in this run and left for the interface pass: every chapter reads "Untitled, in progress" because Folio creates sessions with the title "Untitled", which keeps the press from naming them as far as this run shows (a session created without a title was named "Explaining src/shout.ts functionality" by the same press); a reply that follows the ink on a chapter's first page takes the drop cap ("I" set apart from "'ll start"); runs of footnote marks read as one number ("12", "34567"); ink lines are justified with wide gaps; and form text shows Markdown backticks. +## macOS, after the interface fixes + +Run on 2026-10-20 on an Apple-silicon Mac from `main` at `3c217ad` (PR #3 merged). `npm ci && npm run fetch-press && npm run tauri build -- --bundles app` built `Folio.app` 0.2.0; its sidecar `Contents/MacOS/opencode-cli` reports `opencode v2.0.32` and is byte-identical (SHA-256 `8825dddf0c89…`) to `src-tauri/binaries/opencode-cli-aarch64-apple-darwin`, which `fetch-press` took from `/Applications/OpenCode.app`. The packaged app launched from `/Applications` and spawned `Folio.app/Contents/MacOS/opencode-cli serve --stdio --hostname 127.0.0.1 --port 0`; quitting it left no `folio` or `opencode-cli` process from the bundle. The packaged window could not be driven or captured in this run (screen control of the app was not granted), so every step below was run in the dev app at http://127.0.0.1:47321 (Playwright Chromium, 1280×840) against that same 2.0.32 binary, which the dev host picks from `src-tauri/binaries/`. Model: the press's default, OpenCode Zen `big-pickle`; the free tier answered from this Mac without a key. + +The scratch repository was `greeter` (`src/greet.ts`, `src/shout.ts`, `src/index.ts`, `package.json`, `README.md`; one commit). Screenshots are kept with this record under [`docs/e2e/2026-10-20/`](e2e/2026-10-20/). + +| # | Step | Expected | Observed | Screenshot | Verdict | +|---|------|----------|----------|------------|---------| +| 29 | Title page | Detects the press, names the model | "The press is ready. Using opencode 2.0.32 · OpenCode Zen, big-pickle." | `01-title.jpg` | Pass | +| 30 | Open a folder | The book opens on Chapter I with the note and the quill | `greeter` opened on "Chapter I · Untitled, in progress" with the first-page note and the quill hint "return twice to send · or turn the page" | `02-first-chapter.jpg` | Pass | +| 31 | First prompt streams | "Add a farewell(name) function next to greet in src/greet.ts and explain briefly."; no earlier line moves | A recorder sampled the page every 250 ms through the turn (135 samples, 6 versions of the reply): zero changes to any reply line but the last. Footnotes "Looked for \*\*/greet.ts.", "Read src/greet.ts.", "Edited src/greet.ts, 4 lines added. See Plate I →" and the slip "Plate I faces this page — open it"; `src/greet.ts` gained `farewell` on disk | `03a-stream-sent.jpg`, `03b-stream-mid.jpg`, `03c-stream-done.jpg` | Pass | +| 32 | Chapter title | The press names the chapter instead of "Untitled" | Within about three seconds of the prompt the running head and title bar read "Chapter I · Add farewell function to greet.ts". A second chapter, made by turning past the end, read "Untitled, in progress" until its first prompt and then "Add return comment to greet". After a reload and reopening the folder, Contents listed both titles | `03a-stream-sent.jpg`, `15-new-chapter.jpg`, `16-ask-shown.jpg`, `20-contents-after-reload.jpg` | Pass | +| 33 | Footnote marks | Runs of marks read as marks | The ink line's marks read "1–3" and "1,2", and later ones "4–8", "12", "13" as single numbers | `03c-stream-done.jpg`, `16-ask-shown.jpg` | Pass | +| 34 | Plate and Accept | The real patch; Accept settles it | Plate I "src/greet.ts · +4 −0" with the four added lines; Accept set it to "Set in the repository." with only Fold back left | `04-plate.jpg`, `05-accepted.jpg` | Pass | +| 35 | Edit two files, reject one | Two plates; Reject restores that file only and tells the press | "Add a whisper(text) function to src/shout.ts … and call it from src/index.ts." gave Plates II (`shout.ts`) and III (`index.ts`, "+2 −1"). Reject on Plate III read "Restoring the file…" at the first 100 ms sample and "Reverted." by 300 ms, with the banner "The file was restored."; `git diff --stat` showed only `greet.ts` and `shout.ts` changed | `06-two-files.jpg`, `07a-plate-iii.jpg`, `07b-rejected.jpg` | Pass | +| 36 | Reject while the press is still writing | Reject during the turn restores the file and the plate settles | The prompt asked for a comment at the top of `src/shout.ts` and then a 400-word explanation. Plate IV was opened from its footnote 6.2 s in and rejected at 6.8 s while the reply was still streaming: "Reverted." 170 ms later and "The file was restored."; the turn went on streaming for about 30 s and the plate still read "Reverted." when it ended. The comment was gone from disk and the earlier `whisper` stayed | `08a-midwrite-plate.jpg`, `08b-midwrite-rejected.jpg` | Pass | +| 37 | Reject in flight across the end of a turn | The plate does not stick at "Restoring the file…" | An in-page script opened Plate VI the moment its footnote link appeared (4.26 s) and clicked Reject 24 ms later, with `/folio/write` held for 4 s by a Playwright route. "Restoring the file…" showed until the write returned, then "Reverted."; the model had written "Done" and its turn had ended during the held write. No stuck plate | `10-reject-midwrite-race.jpg` | Pass | +| 38 | Reject before the prompt answer returns | Reject on a plate whose turn still has its `local-…` name | To reach the known race, the `/prompt` answer was held for 7 s (the press answered in 56 ms) and `/folio/write` for 4 s. Plate VII was opened at 5.38 s and Reject clicked 22 ms later, while its turn still had the local name. No write was requested: the banner read "This plate cannot be set back on its own." and the plate stayed open with Accept, Revise and Reject, the comment still on disk. Reject again after the answer returned gave "Reverted." and restored the file. So the stuck "Restoring the file…" did not appear; an early Reject is refused instead, with a sentence that does not say to try again. Without the held answer the stream names the turn before any plate appears, so this was not seen in rows 36 and 37 | `11-reject-race-held-prompt.jpg`, `12-reject-retry.jpg` | Pass (refused, not stuck; wording noted) | +| 39 | Ask before the press writes | The ask shows the patch; the file waits; Allow once applies it | The menu item toggled to "Asking before writes" (the menu stayed open after the click). On the new Chapter II the quill hint read "the press will ask before it writes", and "Add a one-line comment above greet …" stopped at "May I edit src/greet.ts? Allow once · No" at the page foot and over Plate I with the proposed line. `src/greet.ts` was unchanged on disk until Allow once; then it had the comment and the footnote read "Edited src/greet.ts, 1 line added." The setting was still on after a reload | `14-ask-on.jpg`, `16-ask-shown.jpg`, `17-allowed.jpg` | Pass | +| 40 | Ask, then No | The press is told and the file stays | No on a second ask: footnote "The edit to src/greet.ts was declined."; the model replied that the file was unchanged; it was | `19-ask-declined.jpg` | Pass | +| 41 | Drop cap on a reply that follows ink | The cap is whole | The reply after an ink line on a chapter's first page takes the drop cap, and its lower part is cut off. The cap (`.drop`, 54 px, 42 px line height) sits in the first line (`line justify prose beside with-drop`, `overflow: hidden`), which is one line tall: on Chapter II the cap spanned 249–291 px and its line 247–276 px, so the bottom 15 px of the "A" were clipped and it read as a small triangle; after a reload Chapter I's reply "I added…" showed an "I" cut to its top half, which reads as "T" (cap 214–256 px, line 212–241 px). The first-page note's "T" in row 30 was not measured; it reads as a T | `17-allowed.jpg`, `21-dropcap-after-reload.jpg`, `21b-dropcap-after-reload-crop.jpg` | Fail | + +Found in this run and left for the interface pass: the drop cap in row 41; the toggle in the menu leaves the menu open (row 39); and "This plate cannot be set back on its own." for a plate whose turn is not named yet (row 38) reads as final, though Reject works a moment later. Not tested here: the packaged window itself (rows 17, 18 and 21 to 22 cover it on 2.0.28), the margin note, the question form and a window resize. + ## Notes - Defect fixes routed into this run: footnote paths from the book's root (`3ad63c6`), room at the page foot diff --git a/docs/e2e/2026-10-20/01-title.jpg b/docs/e2e/2026-10-20/01-title.jpg new file mode 100644 index 0000000..311039e Binary files /dev/null and b/docs/e2e/2026-10-20/01-title.jpg differ diff --git a/docs/e2e/2026-10-20/02-first-chapter.jpg b/docs/e2e/2026-10-20/02-first-chapter.jpg new file mode 100644 index 0000000..68cb741 Binary files /dev/null and b/docs/e2e/2026-10-20/02-first-chapter.jpg differ diff --git a/docs/e2e/2026-10-20/03a-stream-sent.jpg b/docs/e2e/2026-10-20/03a-stream-sent.jpg new file mode 100644 index 0000000..97a6d74 Binary files /dev/null and b/docs/e2e/2026-10-20/03a-stream-sent.jpg differ diff --git a/docs/e2e/2026-10-20/03b-stream-mid.jpg b/docs/e2e/2026-10-20/03b-stream-mid.jpg new file mode 100644 index 0000000..9114181 Binary files /dev/null and b/docs/e2e/2026-10-20/03b-stream-mid.jpg differ diff --git a/docs/e2e/2026-10-20/03c-stream-done.jpg b/docs/e2e/2026-10-20/03c-stream-done.jpg new file mode 100644 index 0000000..be10da2 Binary files /dev/null and b/docs/e2e/2026-10-20/03c-stream-done.jpg differ diff --git a/docs/e2e/2026-10-20/04-plate.jpg b/docs/e2e/2026-10-20/04-plate.jpg new file mode 100644 index 0000000..f653325 Binary files /dev/null and b/docs/e2e/2026-10-20/04-plate.jpg differ diff --git a/docs/e2e/2026-10-20/05-accepted.jpg b/docs/e2e/2026-10-20/05-accepted.jpg new file mode 100644 index 0000000..02aa5f8 Binary files /dev/null and b/docs/e2e/2026-10-20/05-accepted.jpg differ diff --git a/docs/e2e/2026-10-20/06-two-files.jpg b/docs/e2e/2026-10-20/06-two-files.jpg new file mode 100644 index 0000000..cf7c79a Binary files /dev/null and b/docs/e2e/2026-10-20/06-two-files.jpg differ diff --git a/docs/e2e/2026-10-20/07a-plate-iii.jpg b/docs/e2e/2026-10-20/07a-plate-iii.jpg new file mode 100644 index 0000000..4701542 Binary files /dev/null and b/docs/e2e/2026-10-20/07a-plate-iii.jpg differ diff --git a/docs/e2e/2026-10-20/07b-rejected.jpg b/docs/e2e/2026-10-20/07b-rejected.jpg new file mode 100644 index 0000000..5e8718a Binary files /dev/null and b/docs/e2e/2026-10-20/07b-rejected.jpg differ diff --git a/docs/e2e/2026-10-20/08a-midwrite-plate.jpg b/docs/e2e/2026-10-20/08a-midwrite-plate.jpg new file mode 100644 index 0000000..67e5520 Binary files /dev/null and b/docs/e2e/2026-10-20/08a-midwrite-plate.jpg differ diff --git a/docs/e2e/2026-10-20/08b-midwrite-rejected.jpg b/docs/e2e/2026-10-20/08b-midwrite-rejected.jpg new file mode 100644 index 0000000..50f8245 Binary files /dev/null and b/docs/e2e/2026-10-20/08b-midwrite-rejected.jpg differ diff --git a/docs/e2e/2026-10-20/10-reject-midwrite-race.jpg b/docs/e2e/2026-10-20/10-reject-midwrite-race.jpg new file mode 100644 index 0000000..113a9ac Binary files /dev/null and b/docs/e2e/2026-10-20/10-reject-midwrite-race.jpg differ diff --git a/docs/e2e/2026-10-20/11-reject-race-held-prompt.jpg b/docs/e2e/2026-10-20/11-reject-race-held-prompt.jpg new file mode 100644 index 0000000..290aefc Binary files /dev/null and b/docs/e2e/2026-10-20/11-reject-race-held-prompt.jpg differ diff --git a/docs/e2e/2026-10-20/12-reject-retry.jpg b/docs/e2e/2026-10-20/12-reject-retry.jpg new file mode 100644 index 0000000..1b64020 Binary files /dev/null and b/docs/e2e/2026-10-20/12-reject-retry.jpg differ diff --git a/docs/e2e/2026-10-20/14-ask-on.jpg b/docs/e2e/2026-10-20/14-ask-on.jpg new file mode 100644 index 0000000..0d67809 Binary files /dev/null and b/docs/e2e/2026-10-20/14-ask-on.jpg differ diff --git a/docs/e2e/2026-10-20/15-new-chapter.jpg b/docs/e2e/2026-10-20/15-new-chapter.jpg new file mode 100644 index 0000000..d760edb Binary files /dev/null and b/docs/e2e/2026-10-20/15-new-chapter.jpg differ diff --git a/docs/e2e/2026-10-20/16-ask-shown.jpg b/docs/e2e/2026-10-20/16-ask-shown.jpg new file mode 100644 index 0000000..b99b407 Binary files /dev/null and b/docs/e2e/2026-10-20/16-ask-shown.jpg differ diff --git a/docs/e2e/2026-10-20/17-allowed.jpg b/docs/e2e/2026-10-20/17-allowed.jpg new file mode 100644 index 0000000..db6b112 Binary files /dev/null and b/docs/e2e/2026-10-20/17-allowed.jpg differ diff --git a/docs/e2e/2026-10-20/19-ask-declined.jpg b/docs/e2e/2026-10-20/19-ask-declined.jpg new file mode 100644 index 0000000..a3bff95 Binary files /dev/null and b/docs/e2e/2026-10-20/19-ask-declined.jpg differ diff --git a/docs/e2e/2026-10-20/20-contents-after-reload.jpg b/docs/e2e/2026-10-20/20-contents-after-reload.jpg new file mode 100644 index 0000000..953f2c9 Binary files /dev/null and b/docs/e2e/2026-10-20/20-contents-after-reload.jpg differ diff --git a/docs/e2e/2026-10-20/21-dropcap-after-reload.jpg b/docs/e2e/2026-10-20/21-dropcap-after-reload.jpg new file mode 100644 index 0000000..dc55884 Binary files /dev/null and b/docs/e2e/2026-10-20/21-dropcap-after-reload.jpg differ diff --git a/docs/e2e/2026-10-20/21b-dropcap-after-reload-crop.jpg b/docs/e2e/2026-10-20/21b-dropcap-after-reload-crop.jpg new file mode 100644 index 0000000..c00223a Binary files /dev/null and b/docs/e2e/2026-10-20/21b-dropcap-after-reload-crop.jpg differ