Project notification files through native and WASM ClientViews
Problem
The terminal notification queue retained alerts after their authoritative files were removed.
Design
Project canonical .tasks/<task>/notifications/<id>.json files inside FileQueryView alongside models, goals, plans and command outcomes. Snapshot and follow use one parser/index; records are bound to the task folder and malformed files remain Invalid rows. File removal and selection retirement release their rows.
Native ClientViews and its followed WASM handle expose the same borrowed rows, source cursor and full-width sequence. Terminal output reads the current projection directly, including after a failed write. Harness NeedsApproval attention remains supported; GraphCoder's always-accept default is config, not a harness restriction.
Decisions
Files and live queries are authoritative. Terminal output has no pending-payload store or enqueue API: removal eliminates the only candidate, so the stale-alert queue cannot regrow behind the adapter. Presentation progress belongs to a per-consumer file/query cursor. File-query capacity exhaustion preserves the typed task-volume LimitExceeded error and leaves exact files/cursor unchanged.
Refreshed through a signed merge of main be7605e66, following the repository rule against rebasing pushed branches. Conflicts preserve both notification and main's task/command-output projections, public WASM methods, and both parity negative controls. Main's private FileValue construction is respected by the shared parser fixture. No synchronization, protocol, polling or extra subscription was added.
Deletions
Delete NotificationView, its latest map, pending queue, stream adapter, private limits and queue-only constructors. Terminal scenarios now exercise file replacement/removal. Approval attention and the protocol/mode/focus matrix remain. Against included main: +943/-859, net +84 lines across 149 files, including fixtures.
Tests
- Terminal: 11/11, 0.01 s; query: 16/16, 0.04 s; swarm/file fold: 29/29, 0.06 s.
- Notification properties/parser/limit controls: 9/9, 0.12 s; all 108 notification scenarios: 0.01 s.
- Followed native/WASM parity: 5/5, 0.14 s, including separate-reducer, omitted-model, omitted-notification and omitted-task-tools controls. Runner plus binding generation/startup: 22.44 s; focused WASM --no-run build: 3m05s.
- Windows GNU harness
--lib --testswith canonical native features: passed, 4m22s. Existing unrelated dead-code/missing-docs/ts-rs warnings remain. - Native --no-run after the fixture constructor migration: passed, 3.86 s. The initial cold compile found that fixture API incompatibility; it was fixed before qualification.
git diff --check, conflict-marker scan and removed-NotificationView caller grep passed. No new production synchronization.
Current signed head: caed44eeff7b070c15090c61ab40070ffe816ed7. Native log: 2026-10-17T232856217Z-1274129.log; Windows: 2026-10-17T232909711Z-1274821.log; WASM: 2026-10-17T233706145Z-1309848.log. All gates ran on bb1 through bs.ps1 as separate jobs.
Previous qualification at 3f17f9f3d: TS compilation/type contracts, 7 Bun tests, Chromium remote attach/reconnect and pinned-nightly ASAN for the parser/scenario oracles passed. Those package/browser/fuzz gates are historical, not rerun by this conflict-only refresh. The shrinking parser, file-churn, typed-limit and removal recovery properties and their negative controls are included in the refreshed native gates; the checked corpus retains the 129-file input.
Follow-ups
Claude owns production publication from refresh_command_task/goal transitions into canonical notification files, retirement of .ui/config/attention.json, renderer integration, and a per-consumer durable presentation cursor. Retain approval attention and file-removal behavior; do not reintroduce pending payload queues. No follow-up slice or PR is started here.