Files

P7-08 — Existing notifications and operations

Status: both presentation boundaries implemented CONDITIONAL GO. UTC repair and the recent popover/shell slice are published; Operations final staged hygiene, commit and normal push remain 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 second 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/. Publication is blocked at that observation; cached 8e4db12 is not current live identity. These failures remain in the publication chronology.

Independent P7-08 contract review and bounded safe work proceed while publication is blocked. After the 20:52 UTC resumption, a fetch at 20:53:25–20:53:46 again exits128; no execution during the pause is inferred. A later normal push 21:00:51.343381–21:00:53.589287 succeeds. At 21:01:11.788733, HEAD/origin/direct development all equal 9dfea1226f57ba12b944e05e0e83fb2fea846131, publishing Documents 5a67ec3, publication documentation 84350b7 and the separate UTC repair. Local/origin/live main remain 27657f31131cd95d42f0e1290853ec9c9b3959a4. Immutable receipt .artifacts/phase7/p7-08/utc-push-receipt.json, SHA256 12f339239dfb6ef458d31ca6918555e4eb4ce35bc5dacfa3acd33cd34ebffd65, records known presentation WIP: synchronized refs do not mean a clean checkout or publication of that WIP. Each later completed slice still requires its own normal push; P7-12 cannot accept unpublished work.

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
Retry-focus 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; native/visual evidence is pending at this observation

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.

The Retry-focus candidate's 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, with build identity -A-T31QuUMNqWVSxMqUu7. These historical gates 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. Candidate regressions include the GET/Retry focus repair; the later final native evidence is recorded below.

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. The Operations report records the separate regressions, bounded changes and final conditional acceptance.

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 label stored UTC ticks without conversion, data writes or schema/auth/queue changes. This gate proves real SQLite/direct-controller Web JSON. Later actual Program/cookie native cases additionally observe available operation/notification UTC fields over HTTP; null hosted fields do not establish all-seven-field coverage. The published repair remains 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. It is then used by actual native setup for an inert queued operation; existing real cancel/retry/read/dismiss endpoints own the persisted transitions. No handler, provider/model worker or external grant is enabled, and the Career seeder stays unchanged. Actual terminal notices have no result link; controlled internal-link/long-message GET projections are labelled presentation evidence, not new producer capabilities.

Required native evidence includes real local-cookie read/dismiss/unread/reload and owner isolation, known/unknown count recovery, existing context links, failure/Retry/cancel, reconnect recovery and no duplicate starts. Preserve keyboard/focus, bounded scrolling, long English/Bokmål text and both themes across finite sizes. Exact routes/writes, every axe incomplete context and actual image review remain required. The initial entry claimed no native evidence; the finite final run is recorded below and supplies no human or production acceptance.

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. One new UTC Fact derives backend 1,054; 18 new frontend cases with no new suites derive 773/95, and six new native cases derive browser 318. Earlier 772/95 precedes the final Retry-focus case. These are inventories, not fresh integrated counts: last full frontend 573/89, backend 1,033 and sidecar 49 remain inherited. Preserve all ordinary failures without skip/expected-failure masking. P7-12 owns fresh integrated regression.

UTC repair and recent-slice hygiene/commit/publication are complete. Operations final runtime/visual evidence is complete within its qualifications; staged hygiene, commit and its own verified normal publication remain. Earlier pushes do not publish later presentation WIP.

Recent popover and shell — final finite evidence

Recent-slice report and portable recent results record final 49 cases / six suites PASS, 21:06:55.374107–21:07:11.749777 UTC, and six native cases PASS, 21:07:45.451559–21:08:28.257520, with no skipped/unexpected/flaky native result or retry. Lint, app/browser TypeScript and build all pass 21:06:41.264525–21:07:45.444153; final build is lIzSurm9WwMhPbE11MvC9. Earlier candidate results remain chronological evidence, not substitutes for this run.

Final consumers independently pass Documents 8/8, 21:08:28.263615–21:09:23.407862; CV frame 4/4, 21:09:23.415937–21:10:54.533727; ordinary P2-D01 1/1, 21:10:54.543299–21:11:08.177981. Consumer capsule recent-final-consumers/results.json SHA256 is d651e02c416023bccb84ab00d6cfe1222865819899f14417577f946667a1632c. All 21 captured sources hold 21:06:33.992833→21:11:29.899599; API/test DLLs remain unchanged.

All 16 final notification PNGs are actually reviewed, eight by root and eight by peer. The 14 enabled axe/target-size scans record 0 violations / 102 incomplete nodes, retained for contextual/manual qualification. Preliminary hygiene passes at 21:12:44 UTC: 22 documents, 538 local links, all 57 groups and 33 routes. Staged hygiene, commit and normal push are still pending at that observation and are subsequently completed as recorded below. Real local API transitions and controlled projections remain distinguished; no all-seven-date hosted, human screen-reader, physical-device or production qualification follows. First presentation slice: implemented CONDITIONAL GO. Whole P7-08 remains ongoing.

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 implemented scope: CONDITIONAL GO, pending Operations staged hygiene and publication. Production: NO-GO; main not pushed. Phase 8: no implementation.

Recent-notification presentation is committed and normally pushed as 40cfe04df51654c5ab9a073c13c8d67e0d90dcae. Direct refs verified 2026-10-16 21:15:02.899052 UTC prove clean HEAD = origin = live development and unchanged local/origin/live main (27657f31131cd95d42f0e1290853ec9c9b3959a4). Receipt .artifacts/phase7/p7-08/recent-push-receipt.json supersedes the earlier pending-publication observations for that first presentation boundary. No production or Phase 8 action follows.

Operations — separate boundary and final finite evidence

The Operations report and portable entry establish a fresh 3 cases / 1 suite PASS baseline at 21:15:20.042688–21:15:23.807296 UTC, with all 21 entry inputs held. The ordinary Operations RED then records 3 pass / 17 fail of 20, 21:17:55.099112–21:18:04.281849, with those 21 inputs held. Further ordinary REDs retain the unknown/prototype metadata mapping failure and paired-read abort failure, each 19 pass / 1 fail of 20. None is hidden with pending, skip or expected-failure markers.

The first candidate records 73/6 affected cases plus a disjoint 3/1 shell-navigation consumer, totaling 76/7; the 73 already include ten sidebar-navigation cases. Four gates pass and build U-xpRaXrf8JBPqE2QoR9B passes native Operations 5/5, notifications 6/6 and ordinary P2-D01 1/1, without retry/skip/flaky results. The retained capsule is .artifacts/phase7/p7-08/operations-candidate-verified/results.json, SHA256 734d0fecbeac66f977ced1aaf9d1ccc1d444d8d00637d49becac60ea01ebb370. Its 12 Operations axe scans record 0 violations / 3 incomplete nodes; 14 notification scans record 0 / 102. Its 31 retained images are not claimed as an actual visual review. These results precede the later peer corrections.

The focused native RED against the prior published export fails before its poll/cancellation race assertions because the new named activity region is absent. Root actually observes simultaneous error/false-empty presentation in its failure PNG. Peer review later demonstrates an operation article using its identifier as an accessible name and focus lost when an accepted poll removes the active control: 19 pass / 2 fail of 21, 21:27:51.031680–21:27:59.380417. The bounded corrections use a human task name plus a separate data-ID, and a heading fallback only after removed focus falls to BODY, preserving surviving or deliberately moved focus.

Peer runtime repairs pass 74/6, 21:28:36.894486–21:28:51.898001, plus separate navigation 3/1, 21:29:39.234703–21:29:44.379120: 77/7 affected cases. The following batch passes lint but fails app TypeScript 21:29:56–21:30:10 on one unsupported test-only ByRoleOptions.exact option. It supplies no passing peer-build/native evidence. All 25 frozen inputs remain held through 2026-10-17 01:55:29.881309 UTC, with no execution inferred during the pause. The resumed fetch succeeds with HEAD/origin still at published 40cfe04 and main unchanged. The narrow correction removes only that unsupported option, preserving strict name/data-ID/API assertions and production code.

Fresh 2026-10-17 UTC evidence in the portable Operations results records 77/7 PASS, 01:56:05.783220–01:56:21.237302. Lint, app/browser TypeScript and build all pass 01:56:15.965185–01:57:09.154781, with build YBJ6UzKUv_ZeDjZzgO3Gh. Native Operations 5/5 passes 01:57:09.159317–01:58:02.566772; notifications 6/6 pass 01:58:02.572799–01:58:42.574608; ordinary P2-D01 1/1 passes 01:58:42.582126–01:58:55.731272. All 12 native cases have zero skip/unexpected/flaky results and retries. All 25 inputs match 01:56:05.282845→01:59:10.798235, and API/test DLLs remain unchanged. Final manifests and raw capsule hashes are retained in the linked report.

All 14 final Operations PNGs are actually reviewed by root/peer, plus root's final P2-D01 image: 15 of 31 final images reviewed. The 16 notification-consumer images are retained without a fresh review claim. Operations axe records 12 scans, 0 violations / 3 incomplete occurrences (two short badge-text and one overlapping-background language-button contrast context); notification consumers independently record 14 scans, 0 / 102, all retained and qualified. These finite checks establish no human screen-reader, physical-device, precise incomplete-contrast or production acceptance. The preliminary static-check receipt passes at 02:02:20.371383 UTC: 23 documents, 566 local links, 57 groups, 33 routes and four secret/whitespace commands exiting 0. Final staged hygiene/canonical comparison, commit and verified normal push remain pending.

The 21 Operations cases add 18 over its three-case baseline without a new suite, deriving frontend 791/95 from 773/95. Five new browser cases derive 323 from 318; backend remains 1,054. These are inventories, not fresh integrated counts or proof of publication; full frontend 573/89, backend 1,033 and sidecar 49 remain inherited until P7-12. All 57 preservation statuses and 33 routes remain unchanged. Both P7-08 presentation boundaries: implemented CONDITIONAL GO, with Operations staged hygiene/commit/publication pending. Settings remains the next approved checkpoint, and Phase 8 remains separate.

P7-08 publication and P7-09 entry

Operations c5176e3251 is normally pushed and directly verified 2026-10-17T02:03:53.815275UTC: clean HEAD=origin=live development, local/origin/live main27657f3 unchanged. Both P7-08 UI boundaries remain implemented CONDITIONAL GO and published; manual/provider/output/release conditions remain. Earlier pending-publication text is superseded by this exact receipt in Operations results. P7-09 follows its approved two boundaries; a separately bounded OAuth sender repair first protects its two existing callback consumers. Fresh entry23/3 frontend and40 unchanged-binary backend cases pass;791/95,323,1054 remain derived inventories, not full-suite passes. No production or Phase8 action.