P7-08 — Existing notifications and operations
Status: separate UTC compatibility repair validated locally; recent/count presentation remains in progress after its 49-case GREEN candidate. Final UI/native/publication acceptance is pending. This checkpoint migrates existing notification and operation interfaces under the approved handoff and implementation plan. It preserves the existing stores, routes, permissions and operation lifecycle.
Entry and publication qualification
P7-07 local acceptance and its Documents interface report establish the preceding bounded work. Documents code is committed locally as 5a67ec3d3d5dc27298814b0a3f46540cb54ea3a3; publication documentation is committed as 84350b71a67400cd62730e46bf05f06176bcd733. Neither local commit is evidence of publication.
Two actual normal development pushes fail because the configured Git host cannot be reached on port 443. The latest attempt runs 2026-10-16 16:31:50.187856–16:32:11.434629 UTC, exit 128, retained under .artifacts/phase7/p7-07/ui-publication-attempt-2/. The earlier verified development remote at 8e4db12 is historical, not current live identity. Local main remains 27657f31131cd95d42f0e1290853ec9c9b3959a4; this work does not push it. P7-07 publication remains blocked.
Independent P7-08 contract review, baseline checks and bounded safe work can proceed locally. The remote-access failure does not waive normal publication: each completed boundary still requires commit, push and fresh HEAD/remote verification. P7-12 cannot accept unpublished slices. After the 20:52 UTC resumption, a fetch at 20:53:25–20:53:46 also exits 128 for the same connection failure; no new remote identity or execution during the usage pause is inferred.
Two bounded presentation boundaries
| Boundary | Existing owners and intended preservation |
|---|---|
| Recent popover and shell unread count | NotificationsPopover, notifications.ts, App and AppShell; preserve recent-list limit 10, explicit read/dismiss, existing destination links, menu focus and bounded unread-count refresh |
| Operations page | Existing /operations page and operation/notification stores; preserve list limits 50, current operation IDs, server-provided cancel/retry admission, notification read/dismiss and existing polling/recovery behavior |
Implement and validate the recent-popover/shell boundary before the separate Operations presentation boundary. Record the independently proven UTC compatibility repair in its own commit before presentation commits; this does not replace or reorder the two UI boundaries. Reuse the shared page/feedback/theme/i18n foundations. This scope adds no full /notifications application route, notification producer, result-data contract, scheduled-interview fact or task-completion feature. Existing /api/notifications remains its API owner. A meaningful full notification page or new enabled producer requires separate evidence; F20 recovery remains a prerequisite before new producers are enabled.
Read and dismiss affect notifications, not completion of the underlying work. Opening a notification uses its existing supported destination; no new result URL is fabricated. Cancel requests and Retry retain their server identities and eligibility rules, and cannot silently start duplicate work. Mail/provider/model capabilities remain within their existing qualifications.
Recorded frontend baseline and RED
All times below are UTC on 2026-10-16. Exact commands/reports remain under .artifacts/phase7/current/unit/; source observations remain under .artifacts/phase7/p7-08/.
| Observation | Actual result and source boundary |
|---|---|
| Existing affected consumers | 12 cases / 3 suites PASS, 16:23:56.405875–16:24:02.029592, p708-entry-20261016T162356Z: six popover, three Operations and three shell cases; no pending/todo cases |
| Entry source observation | entry-pre/source.json captures 19 finite inputs before the baseline; entry-after-observation.json, observed 16:28:31.095687, confirms all 19 unchanged after the baseline and before test edits. It does not infer identity across later test work |
| First recent/count RED | 11 pass / 14 fail of 25, 16:30:14.666388–16:30:25.644000, p708-recent-red-20261016T163014Z; ordinary rendered-DOM/action failures, not compilation failure, with zero pending/todo cases. Nine inputs in recent-red-pre/source.json and recent-red-post.json match |
| Expanded focus/GET RED | 12 pass / 17 fail of 29, 16:35:03.956545–16:35:15.226833; four new ordinary focus/GET cases add one passing and three failing observations. The 13 captured frontend inputs match. The broader 18-input snapshot includes a separate backend DTO edit after this command ended; do not claim all 18 were held |
| First presentation candidate | 48/6 PASS, 16:38:36.709407–16:38:50.647886; affected popover, shell, Operations, navigation, quick-command and i18n cases, zero failed/pending/todo. All 18 candidate inputs are held before/after; subsequent additional GET/Retry focus coverage remains pending |
| GET/Retry focus RED | 20 pass / 1 fail of 21, 20:53:41.526191–20:53:48.271873; the new ordinary popover case observes meaningful focus loss to BODY after GET recovery. All 18 captured inputs match before/after |
| Latest presentation candidate | 49/6 PASS, 20:54:23.214108–20:54:37.797995; the added focus case and existing affected suites pass, zero failed/pending/todo. All 18 inputs in retry-focus-green-pre/post are held; actual native/visual evidence remains pending |
The first RED adds 13 ordinary cases: ten popover and three shell cases. An existing shell count assertion is also strengthened; its failure does not represent an extra test. Four later focus/GET cases and the final Retry-focus case bring the candidate's additions to 18. The small recovery correction remembers the initiating Retry focus, waits for loading completion and preserves its original target while using the stable fallback. Retain every RED; a focused GREEN is not final interface acceptance.
The first candidate's app/browser TypeScript, lint and production build pass between 16:38:46 and 16:39:49 UTC, with observed build identity 33Og4QvWi-VvlxXRjUnvY. Old command/log receipts remain under .artifacts/phase7/current/ui/attempts/; that full static export was not separately copied. These are historical candidate gates, not native/visual or later-source acceptance.
Latest lint 20:54:33.381477–20:55:00.917580, app TypeScript 20:55:00.919594–20:55:14.103408, browser TypeScript 20:55:14.105415–20:55:20.863722 and build 20:55:20.865736–20:55:28.793130 all exit 0. Current build identity is -A-T31QuUMNqWVSxMqUu7. Frozen-source candidate checks do not close actual HTTP, native journeys, screenshots or final presentation acceptance.
Findings and bounded repair requirements
| Observed source or regression finding | Required bounded behavior |
|---|---|
| Popover write protection uses React busy state alone | Reserve the operation synchronously before awaiting; repeated activation must not issue duplicate writes or competing Open actions |
| Open awaits a read action whose failure is caught, then closes/navigates anyway | Preserve the visible notice/error and current context on failure; navigate only after the required action succeeds |
| Action failures share a list-loading error/Retry presentation that hides rows | Keep known notices and distinguish action recovery from GET recovery; Retry must not replay a committed mutation |
| Popover load depends on the translation callback and dates use the browser default locale | Language changes translate/reformat current data without another list read or lost state; use explicit English/Bokmål presentation |
| Shell count starts at 0 and maps read failure to 0 | Distinguish known positive count, explicit known zero and unknown/unavailable count; do not announce a fabricated zero |
| Shell interval/event reads have no ordering guard | A stale completion cannot overwrite the latest count or publish after unmount/account change; prove bounded single-flight/recovery behavior |
The notification trigger keeps its accessible name “Notifications” / “Varsler”. Count availability belongs in a localized aria-describedby description: known 3, known 0 and absent/unknown are distinct states. Preserve keyboard activation, close/focus restoration and the existing navigation/dirty guards. Latest candidate regressions include the GET/Retry focus repair; actual native evidence is still required.
Operations inspection records additional review targets: polling and list reads depend on translation callbacks; busy protection is state-only; two resources share a load/error path; task/status/failure values are displayed from raw identifiers. These are source findings to validate in the second boundary, not claims that an Operations migration or repair has executed.
Separate UTC repair and native evidence plan
The UTC repair report and portable results record ordinary 3 pass / 1 fail RED, then 4/4 GREEN and 73/73 related consumers. Seven DTO projections now label stored UTC ticks without conversion, data writes or schema/auth/queue changes. This proves real SQLite plus direct-controller Web JSON serialization, not hosted HTTP; actual Program/cookie transport evidence remains pending. The repair is separate from presentation acceptance.
The guarded operation-only helper passes 29 self-checks, 20:55:29.159474–20:55:29.645478, using only its own temporary directory; its captured source remains held. This is not native/hosted evidence: actual CLI/schema execution and an existing cancel transition producing a notification remain pending. The Career seeder stays unchanged. Do not enable an operation handler, AI/model/provider worker or external grant to manufacture fixture content. Setup and actual domain-transition evidence must remain distinguishable from presentation fixtures.
Required native evidence includes real local-cookie read/dismiss/unread/reload and owner isolation, known/unknown count recovery, existing result/context links, failure/Retry/cancel, disconnect/reconnect recovery and no duplicate starts. Exercise keyboard/focus, bounded scroll containers, long English/Bokmål text and both themes across finite mobile/tablet/desktop samples. Record exact routes and writes, preserve every axe incomplete context and inspect actual images before drawing visual conclusions. No native, visual, axe or human acceptance is claimed at this entry checkpoint.
Preservation, counts and remaining work
All 57 preservation groups remain 56 PARTIAL / C11 DEFERRED; preservation and debt remain binding. Keep 33 current routes, comprising the original 32 plus Documents. Existing canonical Career Profile data, CV overrides/revisions, frozen packages, attachment bytes and provider/tenant boundaries remain protected. Notification read/dismiss must not alter those resource owners.
Entry inventory is frontend 755/95, browser 312, backend 1,053 from P7-07. The one new UTC Fact derives backend 1,054; 18 new frontend cases with no new suites derive 773/95. The earlier 772/95 candidate count precedes the final Retry-focus case. These are inventories, not fresh integrated pass counts or final whole-checkpoint counts. Browser inventory stays 312 until native additions are executed and reconciled. Preserve all ordinary failures; no skip or expected-failure marker may conceal one. P7-12 owns the fresh integrated suite; its last full backend baseline remains 1,033.
Complete UTC repair hygiene and its separate commit, finish recent/count regressions and native/visual evidence, then validate the distinct Operations boundary. Each completed logical repair needs automated evidence, preservation reconciliation, hygiene, commit and normal push, with manual/native qualifications recorded honestly. Publication remains an actual network blocker; do not claim current synchronization from old refs.
Human screen-reader, real zoom, physical touch/software keyboard, production font/photo/print, actual MariaDB/provider execution and existing reliability debt remain qualified. P5-13 stays withheld with zero model qualification calls; followMode stays deferred. Production ingress, backup/restore, schema/configuration and tested rollback remain open release gates. P7-08 acceptance: PENDING. Production: NO-GO; main not pushed. Phase 8: no implementation.