You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
SPA: audit the other load-more/filter screens for the async races hardened in #467 #469
PR #467 (stock lot paging/filter) went through 11 codex review rounds, every finding a real interleaving of optimistic inputs, offset paging, and unticketed async settles. The stock panel now follows an intent-ordering discipline: a monotonic ticket per load claimed at user-intent time, checked after EVERY await (success and catch paths), ownership rules for shared loading flags, an applied-snapshot for optimistic inputs (commit on land, rollback on failure), write-result reconciliation against pre-mutation reads, and invalidation at every wholesale-replace or collapse.
The pattern #467 started from — HistoryPage, AuditPage, and the other limit/offset + from/to screens — predates that discipline: their loads are unticketed, so the same stale-settle/mixed-window/late-failure races exist there (e.g. two quick filter changes racing, a late rejection painting an error over a healthy view, load-more mid-filter mixing windows).
Sweep those screens against the checklist above; StockPage.tsx and its 56-test suite in StockPage.test.tsx are the reference implementation. Vitest can reproduce each race with deferred-promise mocks (see the 'codex round N' tests).
Activity
fix(web): preserve the loaded window after a write; restore History's…
test(web): pin the post-write walk's dedupe (#469)
fix(web): a failed write reissues the read its claim invalidated (#469)
fix(web): account-scale money, extension-safe failures, post-commit r…
fix(web): never denominate money at a guessed scale (#469)
fix(web): the freshest currency authority wins, not the boot snapshot (…
fix(web): a superseded REJECTED write re-reads the newest filter too (#…
fix(web): blank a list while its replacement is in flight (#469)
fix(web): a write must not cancel the blanking a filter change raised (…
fix(web): report a failed conflict reload instead of claiming success (…
fix(web): page by server rows, not by rows that survived dedupe (#469)
fix(web): issue the conflict reload once, not twice (#469)
fix(web): the last duplicate conflict reload, on Expenses (#469)
fix(web): show no month total rather than a guessed zero (#469)
refactor(web): stop promising a reload the screen cannot vouch for (#469
fix(web): name the failure that actually happened in the rebind (#469)
refactor(web): one paged-list discipline for every filtered screen (#469
fix(web): render a sales mutation error inside the dialog that raised…
fix(web): give every dialog screen its own error slot (#479) (#491)