v1.1 WP-C: browser release coverage

Drives in a real browser the reader workflows v1 proved only through the API
or the component suite, including an export that leaves the browser as a
file. Final run: 91 checks (the 38 existing M11 checks plus 53 new), 0 failed,
0 skipped, on the production build over trusted-LAN HTTPS.

- tools/m11_browser.py: scenarios for Retry and takes, Save Point create /
  restore / Redo, state correction (accepted, and a refused correction with
  its reason), narration length reaching each turn's prompt, failed
  generation (an unserved model blocked up front; a listed model that cannot
  narrate failing in the open) and recovery, and export download from the
  library and from campaign settings, imported into a fresh application.
  Rows are tagged M11 / WP-C and counted separately; --only for development.
  The M11 checks now wait on conditions instead of sleeping.
- tools/m11_webdriver.py: Firefox download preferences, a $HOME-only
  download folder, a download wait that ignores partial, empty, pre-existing
  and still-growing files, centred real clicks, tabs, and condition waits.
- tests/test_v11_c_browser_helpers.py: the download wait, prefs and $HOME
  guard, without a browser.
- frontend: a correction the story refused was presented as "Generation
  failed" with a Retry offer and a typed-input claim. It is now "That
  correction was not applied", not retryable, with the reason kept
  (errors.js, FailureNotice.jsx; 3 regression tests).
- DEVELOPMENT.md: the harness command, download profile and $HOME rule,
  what counts as a finished download, and the no-sleep rule.
- docs: V1.1-PLAN, VERSION v4.4, planning README,
  reports/v1.1/V1.1-WP-C-REPORT.md.

Open for the owner: "Correct" on an Important Facts row is always refused
(K1), and a partly refused correction is not reachable from the reader UI.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VvegagkhuCZoFPdv4M1egY
This commit is contained in:
JesseMarkowitz
2026-09-15 18:29:45 -04:00
co-authored by Claude Opus 5
parent 0c1ba836ba
commit 59b5ebc2d8
11 changed files with 1711 additions and 157 deletions
+38 -3
View File
@@ -408,9 +408,17 @@ AIDND_TEST_ENDPOINT=... AIDND_TEST_MODEL=... AIDND_TEST_EMBED_MODEL=... \
# What that campaign is worth on a machine that has never seen it (I01-I07).
.venv/bin/python -m tools.m11_recovery --bundle "$HOME/m11-evidence/m01/bundle.json" --out "$HOME/m11-evidence/m01"
# The browser release regression and the accessibility measurements. Needs
# `frontend/dist` built and geckodriver on PATH.
.venv/bin/python -m tools.m11_browser --out "$HOME/m11-evidence/browser"
# The browser release regression and the accessibility measurements: M11's 38
# checks plus v1.1 WP-C's reader workflows (Retry, Save Points, state correction,
# narration length, failed generation, export download). Needs `frontend/dist`
# built, geckodriver on PATH, and --out under $HOME (the downloads land inside
# it). Release evidence needs the narrator over trusted-LAN HTTPS.
AIDND_TEST_ENDPOINT=https://... AIDND_TEST_MODEL=qwen2.5:3b-instruct \
.venv/bin/python -m tools.m11_browser --out "$HOME/v11-evidence/wp-c/browser"
# Without a narrator (a partial smoke run, not evidence), or one scenario while
# developing (--only takes: shell, history, markdown, hidden, context, csp, a11y,
# retry, savepoint, state, length, failure, export).
.venv/bin/python -m tools.m11_browser --out "$HOME/v11-evidence/wp-c/smoke" --no-narrator
# A container with no network at all: the offline run and the packaging path.
.venv/bin/python -m tools.m11_offline --out "$HOME/m11-evidence/offline"
@@ -499,6 +507,33 @@ It exists so browser evidence needs no Selenium in the dependency surface, and
it documents the one environment quirk that matters here: a snap Firefox will
not open a file the driver names under `/tmp`, but will under `$HOME`.
**Downloads in the browser harness (v1.1 WP-C).** The export checks click the
real Export controls and wait for the file on disk, so the browser has to save
without asking. `m11_webdriver.firefox_download_prefs` gives the WebDriver
session a profile that does that:
- `browser.download.folderList` 2, `browser.download.dir` the run's
`downloads/` folder, `browser.download.useDownloadDir` true;
- no "always ask", and `application/json` saved to disk.
It works on the snap Firefox this machine has (155.0.1, geckodriver 0.37.1), and
no separate Firefox is needed. The same sandbox rule applies as for opening
files: the download folder must be under `$HOME`, and the harness refuses one
that is not.
A download counts as finished only when all of these hold at once
(`m11_webdriver.wait_for_download`):
- a new name has appeared;
- no `*.part` file is left;
- the file is more than zero bytes;
- its size is the same across consecutive polls.
The toast that says "Campaign exported." is not evidence.
**Waiting.** Nothing in the harness sleeps before an assertion. Every wait is on
something the page, the browser or the filesystem shows. A condition that
already holds before the action it waits for does not count as waiting for that
action; the harness defects found in M8, M11 and WP-C were all of that shape.
## Backing up, and getting a campaign back
There are two recovery tools and they answer different questions. Using the