* fix(library): close recipe editor follow-ups from the native editor slice
- After restored storage, Create text revision and Archive are disabled so
they cannot re-read an old numeric ID; only Reload Library remains.
- The storage-changed exit in Edit, revision and Add negative states that
Reload Library closes the dialog and discards the entries (the concept
has no discard confirmation, so the copy stays inline).
- When Save becomes disabled after an unconfirmed write or a conflict,
focus moves to the recovery action instead of falling to the body; the
archive confirmation does the same.
- A reuse toast only says the entered parent metadata was not applied when
the controller found it differs from the stored metadata.
- Prompt history opens on its first negative variant, as the concept does,
so the heading Send starts enabled.
- "1 linked image" is singular on cards, variant lanes and the embedded
gallery count.
* fix(library): treat a blank category as equal to a stored uncategorized one
A reuse that left the category blank sent "Uncategorized" and compared it
with the stored NULL, so the toast claimed the entered metadata was not
applied. Both sides now normalize blank and "Uncategorized" the same way
before comparing; a genuinely different category still discloses it.
* test(coverage): raise frontend coverage floors after editor follow-ups
* fix(library): singular counts for one item and honest discard copy
- One shared countOf/noun helper (web/js/workspace/plural.mjs) now words
linked images, saved negative variants (card chip and history count),
distinct recorded runs and the Images toolbar count in the singular for
exactly one; every other count keeps its existing wording.
- The restored-storage status says "Leaving this dialog discards your
entries." because Cancel, the close button and Escape discard the
draft too, not only Reload Library.
- The new helper gets its coverage floor; no other floor changes.
* fix(library): open every prompt history visit on its first negative
The concept resets to the first negative variant on every navigation to a
prompt (navigate: state.variant = 0) and selects another pair only right
after a save names it. The history no longer remembers a clicked variant
or an explicit All images choice across visits: the per-visit memory is
replaced by a one-shot saved selection that the next history mount (or the
same visit's reconciliation) consumes, and a verified pair outside the
loaded page is kept only for that saved selection. Within a visit, clicks
and All images behave as before.
* feat(history): add bounded chronological read projections (#209)
* fix(history): validate internal continuation positions (#209)
* feat(history): expose fenced history windows and run details (#209)
* fix(history): release retired projection connections (#209)
* feat(history): resolve reported outputs through current authorization (#209)
* fix(history): reject invalid inspection targets (#209)
* feat(history): add scoped history state and current-file adapter (#209)
* fix(history): preserve slideshow and clear stale reentry actions (#209)
* feat(history): render recorded executions and frozen run details (#209)
* fix(history): recover receipts and refresh capture evidence (#209)
* test(history): verify chronological history across restore and host modes (#209)
* fix(history): enforce chronological marker visual parity (#209)
* fix(history): resolve final chronological review findings
Address #209 recovery, bounded visit restoration, exact receipt availability, and portable regression coverage.
* test(history): repair Windows fixtures and review feedback
Address #209 and PR #227 native path, cleanup, media and review-comment expectations. Document Windows portability preflight without changing production behavior.
* ci: raise the viewerjs job budget for the larger browser suite
The cross-browser workflows suite grew from 396 to 496 tests on this
branch, which pushed the whole viewerjs job to about 25.5 minutes
against the 25 minute cap set in #181. Two exact-head runs on this
branch timed out without any test failing: run 39173019283 was killed
on test 474 of 496, and run 39175125474 printed "496 passed (12.8m)"
and was then cancelled during Playwright shutdown.
Raise only the job budget. Browser projects, workers and per-test
timeouts are unchanged. Splitting the browsers into parallel jobs is
tracked separately.