fix(auth): bind mailbox callbacks to pending popup

This commit is contained in:
cesnimda
2026-10-17 10:27:45 +02:00
parent c5176e3251
commit dac29278db
19 changed files with 1403 additions and 38 deletions
@@ -0,0 +1,41 @@
# P7-09 — OAuth callback sender repair
This independently bounded prerequisite protects both existing OAuth-message consumers before [Connections presentation](README.md). It changes client callback admission only; existing provider credentials, server state exchange, owner checks and routes remain authoritative.
## Confirmed contract and finding
`EmailProviderConnections` handles Gmail/Microsoft in `/settings/connected-accounts`; `Correspondence` handles Gmail in Job → Timeline. Both currently accept matching payload discriminators without checking `MessageEvent.origin` or its source window. A forged success can cause status reads/toasts and, in correspondence, candidate reads. The existing three Connections and six correspondence-import cases do not exercise popup correlation.
The expected callback origin comes from **the authenticated connect response's `redirect_uri`**, which the controllers build from `App:PublicBaseUrl`. It is not necessarily the Axios API origin or the Google/Microsoft authorization host. Documented development uses public/UI `localhost:3000` and API `localhost:5202`; production proxies `/api` on the public origin. Native UI3300/API5302 with default public origin3000 does not qualify real OAuth.
## Bounded repair and evidence requirements
Validate the callback HTTP(S) origin, absence of URL credentials and exact provider callback path. Bind each pending provider flow to the actual returned popup window, origin and provider discriminator. Accept only supported terminal `connected` / `error` payloads and a valid optional message; consume once before toast/read effects. Ignore unsolicited/wrong-origin/wrong-window/null-source/malformed/duplicate/disposed callbacks. Keep pending correlation through locale changes, invalidate stale job context and late unmounted connect responses, and prevent overlapping starts against a reused named popup.
The callback posts its message and immediately closes; receiving it must **not** require `popup.closed === false`. Preserve existing popup names/features, backend one-use owner-bound state and its 15-minute expiry. No frontend nonce, server protocol change, new route or provider activation belongs here.
Add ordinary rendered-caller REDs before the fix, preserving all nine existing consumer cases. Prove valid Gmail/Microsoft/error paths, strict sender/payload/duplicate rejection, canonical-origin compatibility, blocked popup, disposal/job context and current-language feedback. Real local child-window fixtures can verify browser origin/source behavior, but controlled connect URLs/HTML/messages are **client-guard evidence**, not a real provider connection. Canonical status must remain server-owned; no grant or connected status is fabricated.
## Executed repair history
The fresh entry is frontend **23/3** and unchanged-binary backend **40/40 PASS**, as recorded by the checkpoint. The first ordinary caller regression run is **23 passing / 12 failing**, followed by **35/3 PASS** after the sender repair. No missing helper, compilation failure, skip or expected failure is used as security regression proof. The helper validates the authenticated response's callback URL and both callers bind messages to the pending provider, callback origin and captured popup proxy. Terminal messages consume that pending attempt once; disposal and changed job context invalidate it.
| Attempt | Actual result and disposition |
|---|---|
| First browser TypeScript gate | Three required-window-property cast errors; fixed only the fixture's window type intersection. No build or native execution occurred in that failed batch. Raw capsule `.artifacts/phase7/p7-09/oauth-browser-types-failed/results.json` |
| First built native attempt | **2 PASS / 1 FAIL**: the initial Microsoft failure alert locator also selected Next's empty route announcer. Corrected only the locator; actual HTTP500 and all sender assertions retained. Raw capsule `.artifacts/phase7/p7-09/oauth-native-attempt1/results.json` |
| Corrected native attempt | **2 PASS / 1 FAIL**: held connect GET, actual account-language PUT204 to Bokmål, then blocked popup still produced the starting English fallback. This is a demonstrated product defect. Raw capsule `.artifacts/phase7/p7-09/oauth-native-startup-red/results.json` |
These native attempts used build **`7a02hqPN6YYeJA93z8hZP`**. Their two passing cases prove actual local child-window origin/proxy isolation and stale-job callback rejection; the third failed before completing its remaining assertions. No three-case acceptance is inferred from those attempts.
## Final bounded result
The startup-language reproducer is **35 PASS / 4 FAIL**, followed by **39/3 PASS** with a current-translation reference used only after delayed startup resolution/rejection. Fresh parent **39/3 PASS**, app/browser TypeScript, lint and production build all pass. Final build **`j_uwah2_BImymFemE3cLg`** executes sender **3/3**, existing Application sections **5/5** and ordinary **P2-D01 1/1**, with zero skips, expected failures or flaky outcomes. The independent read-only review found no actionable introduced defect. The [portable result](evidence/oauth-results.json) identifies every raw command, failed attempt and frozen source/runtime capsule.
All **23** finite inputs match between **02:20:39.070048** and **08:24:50.986374 UTC**. Final commands executed **02:20–02:23 UTC**; the later collection resumed after the conversation interruption and is not a new runtime run. API/test DLL hashes match the existing backend40-case entry; no backend rebuild or test addition is inferred.
Seven of76 retained final PNGs were actually displayed and reviewed, covering Connections and representative EN/NB/light/dark/mobile/768px consumers. The P2-D01 image catches an existing dialog transition; its successful archive/readback test is not a settled visual or PDF fidelity claim. Eight consumer axe scans retain **0 violations / 89 incompletes**: eight short badges,15 overlapped form backgrounds,20 partly obscured labels and46 `aria-label` attributes on roleless spans. Full contexts remain raw; the46 span diagnostics are carried to the responsible P7-11 owners. No new sender axe scan or human/device/zoom acceptance is claimed.
The **16 new ordinary frontend cases / zero suites** derive **807/95**; three new browser cases derive **326**; backend stays **1054**. These are inventories, not fresh integrated passes. All57 groups stay56 PARTIAL/C11 DEFERRED and33 routes remain. Final [staged hygiene](evidence/oauth-static-checks.json) **PASS** at08:27:17 UTC: secret and all whitespace gates,25 docs/583 links,57 groups/33 routes. Normal commit/publication follows this gate. Bounded repair: **CONDITIONAL GO**; both P7-09 presentation boundaries remain pending.
Actual OAuth grants, provider interoperability and production qualification remain open. Local callback HTML and connect URLs are explicitly controlled client-guard fixtures, and canonical server status remains disconnected. No mailbox, inference, send or grant is contacted. P5-13/worker/model withholding and production **NO-GO** remain unchanged.
+34
View File
@@ -0,0 +1,34 @@
# P7-09 — Settings, Connections and data lifecycle
Follow the exact [Phase 6 handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries) and [implementation plan](../../IMPLEMENTATION_PLAN.md). P7-08 is implemented **CONDITIONAL GO** and normally pushed as **`c5176e3251c869e13284b994b59b2f7aa9220eb1`**. Direct verification at **2026-10-17T02:03:53.815275 UTC** proves clean HEAD = origin = live development; local/origin/live main remains **`27657f31131cd95d42f0e1290853ec9c9b3959a4`**. The exact receipt is `.artifacts/phase7/p7-08/operations-push-receipt.json`.
## Approved boundaries and preservation
| Boundary | Existing owners / required preservation |
|---|---|
| Preferences and Connections | Existing Settings tabs/mobile selector/panel associations, parent Rules draft session, local theme/table preferences, account language owner, notification preference, Profile/security links and mailbox-provider owners |
| Data/privacy/plan/backup | Existing independent General subcards, privacy, usage/entitlement, import/export and backup/deletion owners; preserve formats, counts, recent-auth and server availability/admission |
An independently reviewable [OAuth sender repair](OAUTH_SENDER.md) precedes presentation because two live callback listeners accept uncorrelated messages. It hardens the existing client handshake; it does not add a phase, provider, backend protocol, grant or route. Preferences/Connections presentation follows its verified publication, then data/privacy/plan/backup. Do not redo accepted Settings navigation, Rules ownership or P7-01 security presentation.
Keep Rules' six fields, saved baseline, validation, submitted-snapshot acknowledgement, internal-tab draft retention and explicit discard. Notification preferences are a separate one-boolean account save scope; in-app reminders and email delivery remain distinct. Preserve local preferences versus server-owned settings, dirty retry/discard behavior, explicit writes and account/session disposal.
No billing, deletion, restore, provider sync/send/grant, worker/model or other withheld capability is activated. Actual provider interoperation and destructive operations retain separate evidence/authority requirements.
## Fresh entry evidence
Fresh frontend **23 cases / 3 suites PASS**, **2026-10-17 02:05:04.985979–02:05:19.337394 UTC**, `p709-entry-20261017T020504Z`: Settings14, Connections3 and job-correspondence Gmail import6. The contemporaneous 15-input snapshot `.artifacts/phase7/p7-09/entry/source.json` and `post.json` prove held bytes matching committed c5176e3 canonical source; its capture is not represented as occurring before the command started.
Fresh unchanged-binary backend **40/40 PASS**, **02:05:30.082119–02:05:33.187997 UTC**, `p709-oauth-entry-20261017T020530Z`, covers ExternalOrigin/Gmail/Microsoft controller cases using `--no-build`. This is finite existing server-contract evidence, not new tests, a Release rebuild, real OAuth or production acceptance. The [portable entry](evidence/entry.json) records raw reports, commands and source/runtime identities.
Entry inventories are **frontend 791/95, browser 323, backend 1,054**, derived from completed bounded additions. Latest whole frontend573/89, backend1,033 and sidecar49 remain inherited until P7-12. Do not substitute affected subsets for an integrated run.
## Findings to validate in the presentation boundaries
Notification reads depend on locale callbacks and can replace an unsaved choice; failed initial reads lack GET recovery, state-only saves permit duplicates, and late acknowledgements replace newer edits. Provider status failures currently resemble disconnection. Privacy/data lifecycle owners require truthful read/retry/pending states and disposal checks; partial import must report completed writes honestly without inventing transactions or resume semantics. These are bounded source findings, not completed repairs.
All **57 groups remain 56 PARTIAL / C11 DEFERRED**, with **33 current routes**. RD11 language, RD12 notification and RD13 Rules failures remain independently diagnosed; successful reruns do not close them. F20/RD21, other reliability/scaling debt, human screen-reader, physical touch/software keyboard, real zoom and production fonts/photos/print remain qualified. P5-13 is withheld; followMode is deferred. Production remains **NO-GO**, main is unchanged and Phase 8 implementation has not started.
The [separate sender repair](OAUTH_SENDER.md) now has final39/3, four type/lint/build gates and nine ordinary browser cases passing, including P2-D01. [Finite results](evidence/oauth-results.json) retain the actual REDs,39/3 final source, three new client-guard cases and all qualifications. Derived inventories become807/95 frontend and326 browser; backend1054 unchanged. Sender repair final hygiene/publication remain pending; preferences/Connections then data/privacy/plan/backup are still the two approved presentation boundaries.
**P7-09 acceptance: PENDING.** Each repair/presentation boundary needs meaningful regression, applicable native/visual evidence, preservation reconciliation, hygiene, commit and normal push/direct verification.
@@ -0,0 +1,173 @@
{
"schemaVersion": 1,
"checkpoint": "P7-09",
"recordedUtc": "2026-10-17T02:09:53.301530+00:00",
"precedingPush": {
"command": [
"rtk",
"proxy",
"git",
"push",
"origin",
"HEAD:refs/heads/codex/ui-redesign-phase4"
],
"startedUtc": "2026-10-17T02:03:51.750936+00:00",
"finishedUtc": "2026-10-17T02:03:53.590804+00:00",
"exitCode": 0,
"head": "c5176e3251c869e13284b994b59b2f7aa9220eb1",
"log": ".artifacts/phase7/p7-08/operations-push-receipt.log",
"logSha256": "a8093fb40b1c0f99606eb05af96104e9ff31abc16b35b7d45e7c020e583c8687",
"observedUtc": "2026-10-17T02:03:53.815275+00:00",
"originDevelopment": "c5176e3251c869e13284b994b59b2f7aa9220eb1",
"liveDevelopment": "c5176e3251c869e13284b994b59b2f7aa9220eb1",
"main": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"originMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"liveMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"pendingPaths": [],
"workingTreeClean": true,
"raw": {
"path": ".artifacts/phase7/p7-08/operations-push-receipt.json",
"bytes": 861,
"sha256": "83ba5d7a669cb47a4b3f71534dc3bbe4db1ea68269db0f911cb0756512b4380c"
}
},
"baseline": {
"frontend": {
"command": {
"command": [
"rtk",
"proxy",
"npm.cmd",
"test",
"--",
"--runInBand",
"--watchAll=false",
"--json",
"--outputFile=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\unit\\p709-entry-20261017T020504Z.json",
"src/settings-view.test.tsx",
"src/email-provider-connections.test.tsx",
"src/correspondence-gmail-import.test.tsx"
],
"startedUtc": "2026-10-17T02:05:04.985979+00:00",
"finishedUtc": "2026-10-17T02:05:19.337394+00:00",
"exitCode": 0,
"counts": {
"numPassedTests": 23,
"numFailedTests": 0,
"numPendingTests": 0,
"numTodoTests": 0,
"numPassedTestSuites": 3,
"numFailedTestSuites": 0
}
},
"commandRaw": {
"path": ".artifacts/phase7/current/unit/p709-entry-20261017T020504Z-command.json",
"bytes": 728,
"sha256": "33aa459a2df3574e78bebd6ca36b038b9254a6d203930f127fea8c05da23d45f"
},
"reportRaw": {
"path": ".artifacts/phase7/current/unit/p709-entry-20261017T020504Z.json",
"bytes": 10729,
"sha256": "f524e1b154f765096310b42cc41b66613bcf68b6b528ddcb37504e1916b2bd78"
},
"logRaw": {
"path": ".artifacts/phase7/current/unit/p709-entry-20261017T020504Z.log",
"bytes": 713,
"sha256": "7f26609c1249778f41871893c7314e840889abb5eb4da65af8bfba9ca6d5da33"
},
"cases": 23,
"suites": 3
},
"backend": {
"command": {
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.dotnet/dotnet.exe",
"test",
"JobTrackerApi.Tests/JobTrackerApi.Tests.csproj",
"--configuration",
"Release",
"--no-build",
"--filter",
"FullyQualifiedName~ExternalOriginTests|FullyQualifiedName~GmailControllerTests|FullyQualifiedName~MicrosoftGraphControllerTests",
"--logger",
"trx;LogFileName=career.trx",
"--results-directory",
"E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\backend-career\\p709-oauth-entry-20261017T020530Z"
],
"startedUtc": "2026-10-17T02:05:30.082119+00:00",
"finishedUtc": "2026-10-17T02:05:33.187997+00:00",
"exitCode": 0,
"logSha256": "639ed43cebf142ef313dbac8d9748626c9a8e73d5f818a89138082f7b81c5980",
"counts": {
"total": 40,
"passed": 40,
"failed": 0,
"notExecuted": 0
},
"resultSha256": "babae621336afcefd2f33c893700094c2b4f5abae93599086111d7ba41555fcc"
},
"commandRaw": {
"path": ".artifacts/phase7/current/backend-career/p709-oauth-entry-20261017T020530Z/command.json",
"bytes": 980,
"sha256": "8488d6faab3ffd334122f768e3f89d314f96355380a57fa56f43ec70da655109"
},
"trx": {
"path": ".artifacts/phase7/current/backend-career/p709-oauth-entry-20261017T020530Z/career.trx",
"bytes": 57162,
"sha256": "babae621336afcefd2f33c893700094c2b4f5abae93599086111d7ba41555fcc"
},
"log": {
"path": ".artifacts/phase7/current/backend-career/p709-oauth-entry-20261017T020530Z/career.log",
"bytes": 613,
"sha256": "639ed43cebf142ef313dbac8d9748626c9a8e73d5f818a89138082f7b81c5980"
},
"cases": 40,
"newTests": 0,
"qualification": "Existing --no-build server-contract cases; unchanged Release DLLs, no fresh build/provider grants/production acceptance."
}
},
"sources": {
"snapshot": {
"path": ".artifacts/phase7/p7-09/entry/source.json",
"bytes": 4208,
"sha256": "adee9cbaf18b6577527357c4c82d0e15b8afb0c38e2024a9c055d335b584782e"
},
"post": {
"path": ".artifacts/phase7/p7-09/entry/post.json",
"bytes": 508,
"sha256": "b421d6e0c710f92b11e660b9a86a5663a0f8821b42c4cb7e2c859c2c8bd5e1a6"
},
"inputs": 15,
"held": true,
"canonicalMatchesCommit": "c5176e3251c869e13284b994b59b2f7aa9220eb1",
"qualification": "Contemporaneous capture after command start, not represented as pre-run; all15 match c517 committed bytes and remain held through post observation."
},
"boundaries": [
"Preferences/Connections",
"Data/privacy/plan/backup"
],
"independentPrerequisite": "OAuth callback sender compatibility/security repair in two live consumers",
"inventory": {
"frontend": "791/95",
"browser": 323,
"backend": 1054,
"lastWhole": {
"frontend": "573/89",
"backend": 1033,
"sidecar": 49
}
},
"preservation": {
"groups": 57,
"partial": 56,
"deferred": "C11",
"routes": 33
},
"decisions": {
"p709": "PENDING",
"production": "NO-GO",
"phase8": "NOT_STARTED"
}
}
@@ -0,0 +1,463 @@
{
"schemaVersion": 1,
"checkpoint": "P7-09",
"slice": "Independent OAuth sender repair",
"recordedUtc": "2026-10-17T08:26:39.793290+00:00",
"decision": "Bounded client repair CONDITIONAL GO; final staged hygiene PASS, normal publication pending",
"entry": {
"path": "docs/redesign/phase-7/p7-09/evidence/entry.json",
"bytes": 6161,
"sha256": "1e8f696ca154d04fc041d162402e805b07b18942389d4333770a828b0e9ba473",
"hashPolicy": "Exact raw bytes"
},
"final": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/results.json",
"bytes": 142930,
"sha256": "4eb2a2ca1f56ecaa6e288b8f18beeac973e1fede85eb79def8ba24c508c275c3",
"hashPolicy": "Exact raw bytes"
},
"buildId": "j_uwah2_BImymFemE3cLg",
"source": {
"before": {
"path": ".artifacts/phase7/p7-09/oauth-final-pre3/source.json",
"bytes": 6363,
"sha256": "4593a1ef652f33b0db150b006ef53d942c067ecf8a015fbe1188ab37dc43edce",
"hashPolicy": "Exact raw bytes"
},
"after": {
"path": ".artifacts/phase7/p7-09/oauth-final-post3/source.json",
"bytes": 6363,
"sha256": "8fe2c1c7fd16da4195aa47a4691de4cb45f53d48bbd71a282991976f33b4ab9e",
"hashPolicy": "Exact raw bytes"
},
"beforeUtc": "2026-10-17T02:20:39.070048+00:00",
"afterUtc": "2026-10-17T08:24:50.986374+00:00",
"inputs": 23,
"held": true,
"records": [
{
"path": "job-tracker-ui/src/components/SettingsView.tsx",
"bytes": 14211,
"sha256": "4e70a46d93160a89b223b06676143e3776e6d32a5de590ae0548799d9995920d",
"canonicalLfSha256": "39092de5b95cc39b635a2e7c7d9440d155f233522e84f15860bb4fcd913d47bb"
},
{
"path": "job-tracker-ui/src/settings-view.test.tsx",
"bytes": 15052,
"sha256": "bfb454de00e11059b42a7249d84b680a371f4e4c4d9ebfe6e56832c43ba3397d",
"canonicalLfSha256": "fc625ac490246aa80874532b174fe4ca52258d0916decdb607db9178d7c040d0"
},
{
"path": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
"bytes": 11261,
"sha256": "32c8c95304948c4b5ba4bba953480f31d648e1c9ae2c22485656935ae91aeb7f",
"canonicalLfSha256": "fd1043648695cd66e3eef6202c2f8ebea07aa4769a8b1af21e414a06bd258a9e"
},
{
"path": "job-tracker-ui/src/email-provider-connections.test.tsx",
"bytes": 14449,
"sha256": "b695955e638c89945a56afcba14ec1b2fc8f98c5220aa168d5554d54608b4802",
"canonicalLfSha256": "0c887815db98f5fe750a2489bf4a951c5684ec8a254cd5be3284229f58b8f471"
},
{
"path": "job-tracker-ui/src/components/Correspondence.tsx",
"bytes": 42569,
"sha256": "f42e7e549c9060f9d4f84111fc5d430eac353832c9cd6f6a56fa14b20c013251",
"canonicalLfSha256": "45f0b6b442676e62e8644b57863d595936d43608841d4fadaafa936d5606036a"
},
{
"path": "job-tracker-ui/src/correspondence-gmail-import.test.tsx",
"bytes": 26424,
"sha256": "eb1a3172c528df0f9876785e4ef4ae25220227c0801d247f76a61bd779c54653",
"canonicalLfSha256": "f59abb397a716951399c64dfa6fbaeba3c63aaddd60e45eed7cdd5caf590a1e8"
},
{
"path": "job-tracker-ui/src/views/ConnectedAccountsPage.tsx",
"bytes": 961,
"sha256": "1609c20b9dd1450a885b33cd1236fff734b3e1bdb35f279da5231393ff6f4340",
"canonicalLfSha256": "fa52f2c950e3b8938401b390b761d069f504975694967f3c1d774a47020fd40e"
},
{
"path": "job-tracker-ui/src/i18n/translations.ts",
"bytes": 328864,
"sha256": "39b41e7b6ecec3ad2cd73f1f8037d6fc5ddc10f3a2093388f7e1983e0a8cae0b",
"canonicalLfSha256": "39b41e7b6ecec3ad2cd73f1f8037d6fc5ddc10f3a2093388f7e1983e0a8cae0b"
},
{
"path": "job-tracker-ui/src/api.ts",
"bytes": 4948,
"sha256": "bec8dc665fef61f3c88938e9a61dda786a16008d6af9bc7688bdd615e7ba337c",
"canonicalLfSha256": "f75ac7be07a743396843ddad5fd3371e2d5fd3d9c5d933e09e26fae2159f2378"
},
{
"path": "job-tracker-ui/src/auth.ts",
"bytes": 4822,
"sha256": "0282a19bf34a915d6c4cd3bb32c041103206b1741b737e8a5e7b3f083a839acb",
"canonicalLfSha256": "1cbdd59f73c5a961613b2569679f96630cded407974876a4ca8abccf28780b0e"
},
{
"path": "job-tracker-ui/src/sessionBoundary.ts",
"bytes": 2248,
"sha256": "09edca77c98294818d2ad0c409ce595f1b6ca0c1f60419fc1078b70f96f5b7b9",
"canonicalLfSha256": "09edca77c98294818d2ad0c409ce595f1b6ca0c1f60419fc1078b70f96f5b7b9"
},
{
"path": "JobTrackerApi/Controllers/GmailController.cs",
"bytes": 51060,
"sha256": "05df8fea68b8c1d3a6b4a17bcd7c4b281b01a86fabf4c853eb495820ee3f4d2a",
"canonicalLfSha256": "24eb6093d8067b2fe59b15ceb024f2a368d92ef615abb5c4455b830b914fbcb5"
},
{
"path": "JobTrackerApi/Controllers/MicrosoftGraphController.cs",
"bytes": 5394,
"sha256": "b386c2e7413fd78ec252b01480e9163acafac24474b48c797e64fc34f660b6f0",
"canonicalLfSha256": "232176a4e265cc2c261f08b02aa38719661171cf3859768c097eea4a56be898c"
},
{
"path": "JobTrackerApi.Tests/ExternalOriginTests.cs",
"bytes": 5698,
"sha256": "ff91757dd21da47708371ac7aa29bc6acc0ad4f9e1e0124a6ed5374c981be434",
"canonicalLfSha256": "f619dc7989cba2d492ae317bbc9acd7724317cb9203c8833fdb4a1086ff83189"
},
{
"path": "JobTrackerApi/Controllers/NotificationSettingsController.cs",
"bytes": 1481,
"sha256": "f668e19c344f506d577dc2b8ec6be19439cef2bea2ad098680e57075456f0299",
"canonicalLfSha256": "101130256b15432e41a32312f67bfa2f147c556e996869fced036cba92ad9517"
},
{
"path": "job-tracker-ui/src/emailOAuth.ts",
"bytes": 1769,
"sha256": "dfd0f0ac46d295a2c5a0b9a6bb6bfffcceef6b6871cec7c92c429418cdbce8a9",
"canonicalLfSha256": "dfd0f0ac46d295a2c5a0b9a6bb6bfffcceef6b6871cec7c92c429418cdbce8a9"
},
{
"path": "job-tracker-ui/e2e/phase7-oauth-sender.spec.ts",
"bytes": 26234,
"sha256": "ae3600200122855ca7daf2bbf10c26f0eddc5600502b5d697fb6bdfd95b590c1",
"canonicalLfSha256": "ae3600200122855ca7daf2bbf10c26f0eddc5600502b5d697fb6bdfd95b590c1"
},
{
"path": "JobTrackerApi.Tests/GmailControllerTests.cs",
"bytes": 46879,
"sha256": "69ab904ad8f62cb57309d2038651ea1c5301070c5a6b76d2dda4150ca75e86e8",
"canonicalLfSha256": "6d552871f5c8b84948671b976f28b3190f0fb9c56fc0345c5ea9d10fe85d3740"
},
{
"path": "JobTrackerApi.Tests/MicrosoftGraphControllerTests.cs",
"bytes": 6880,
"sha256": "0847a7b630cc5cf52a9eb1196d8c5e7aeb7d7b37b7bf327131ef2e6f32ecde57",
"canonicalLfSha256": "fca5fb45a51516801236e437fddd8a84fc0906e2de685d1656134612a1a390e0"
},
{
"path": "job-tracker-ui/src/i18n/I18nProvider.tsx",
"bytes": 3184,
"sha256": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113",
"canonicalLfSha256": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113"
},
{
"path": "job-tracker-ui/src/toast.tsx",
"bytes": 3425,
"sha256": "83ff8de595c459b9fc403ff1ff9cd91bbdfaad9b85df197418aedbb9b26f5770",
"canonicalLfSha256": "0c4d9df47526d5d9a9eddd397872138bb54bc7d736db74dc082056e33fe50d25"
},
{
"path": "job-tracker-ui/playwright.config.ts",
"bytes": 2669,
"sha256": "01840494c782b2cc3c4c639dd2978a98ffa685b656e6a61fe4c503aeac6798f3",
"canonicalLfSha256": "bcf1dc87bd573f251ab3030088801fa5966907c86fdb90c701003c180ed969d3"
},
{
"path": ".artifacts/phase7/current/run-ui.py",
"bytes": 7248,
"sha256": "6a42b35eb10c27e09a4e24fdfb214c2c5d6e9e48644bc99e17a8f2dc422767d1",
"canonicalLfSha256": "6a42b35eb10c27e09a4e24fdfb214c2c5d6e9e48644bc99e17a8f2dc422767d1"
}
],
"qualification": "Endpoint snapshots and frozen-owner confirmation; final runs occurred 02:20-02:23 UTC. Collection resumed at08:24 UTC after the conversation interruption; this is not a new runtime execution."
},
"backend": {
"existingEntryCases": 40,
"binariesUnchanged": [
{
"path": "JobTrackerApi/bin/Release/net9.0/JobTrackerApi.dll",
"bytes": 4063744,
"sha256": "e1d2c1bfc7ba4d9816d5d7b80503e79d2a647ad0ae2f4777e2703508fd32681c",
"hashPolicy": "Exact raw bytes"
},
{
"path": "JobTrackerApi.Tests/bin/Release/net9.0/JobTrackerApi.Tests.dll",
"bytes": 1997312,
"sha256": "425d098903732802b5b304072c6f2e2f4479d74a56cf292d8c152544592dd99a",
"hashPolicy": "Exact raw bytes"
}
],
"qualification": "Existing no-build contract subset at checkpoint entry; no new backend test/build/schema/protocol or integrated backend run."
},
"regression": {
"frontend": 39,
"suites": 3,
"nativeNew": 3,
"nativeConsumers": 6,
"skipped": 0,
"expectedFailures": 0,
"flaky": 0,
"derivedInventory": {
"frontend": 807,
"frontendSuites": 95,
"browser": 326,
"backend": 1054
},
"delta": "Entry23 to39 adds16 ordinary caller tests, zero suites; native3 adds3 to323. No integrated count is claimed.",
"inheritedWhole": {
"frontend": 573,
"frontendSuites": 89,
"backend": 1033,
"sidecar": 49
}
},
"history": [
{
"path": ".artifacts/phase7/p7-09/oauth-security/p709-oauth-security-red-20261017/results.json",
"bytes": 16197,
"sha256": "e7221fef89b29caa34c2eaab7830785d07d191834189c849a583c077fc859e18",
"hashPolicy": "Exact raw bytes"
},
{
"path": ".artifacts/phase7/p7-09/oauth-security/p709-oauth-security-candidate1-20261017/results.json",
"bytes": 4951,
"sha256": "0042e2e7ea345bdbc8c9bce0bf5e04ed2071f1d271f196046e8622c4a95c26eb",
"hashPolicy": "Exact raw bytes"
},
{
"path": ".artifacts/phase7/p7-09/oauth-browser-types-failed/results.json",
"bytes": 2698,
"sha256": "3ab28a122342287941afdfd9d3f3203e2b15daf9d7f4353217a80712dfd370ab",
"hashPolicy": "Exact raw bytes"
},
{
"path": ".artifacts/phase7/p7-09/oauth-native-attempt1/results.json",
"bytes": 34346,
"sha256": "7fd1799e3a87b61f22556ecb140270dd598b7b6d4e48789b41537c8613a76af7",
"hashPolicy": "Exact raw bytes"
},
{
"path": ".artifacts/phase7/p7-09/oauth-native-startup-red/results.json",
"bytes": 33625,
"sha256": "08e055e46c480e1d384a73c753f3cebb4f1e0fa7f620d5d8b31be885cd63c05f",
"hashPolicy": "Exact raw bytes"
},
{
"path": ".artifacts/phase7/p7-09/oauth-security/p709-oauth-startup-locale-red-20261017/results.json",
"bytes": 45175,
"sha256": "aec5cb574ca5d58b626842ceb6ad21f0de324fca195a43b3db6d5cf6103e9dd7",
"hashPolicy": "Exact raw bytes"
},
{
"path": ".artifacts/phase7/p7-09/oauth-security/p709-oauth-startup-locale-green-20261017/results.json",
"bytes": 4955,
"sha256": "a39bcd3af0d0b2fcefe3f00d5d393f52e3a78fa04329c5f1e76226f7ba65b69f",
"hashPolicy": "Exact raw bytes"
}
],
"visual": {
"retained": 76,
"actuallyReviewed": [
{
"raw": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/embedded/oauth-sender/002-p709-client-guard-connections-disconnected.png",
"sha256": "9bf6277c770b18767e6d51abf5435983fa300c3a080645d807dae6ace10bc127",
"bytes": 90735,
"hashPolicy": "Exact measured raw bytes"
},
"originalEmbeddedReport": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/oauth-sender.json",
"sha256": "d692d63ae1b8381914cad8d349981dce77abab099cd2ccf6e597072cd3fa4e56",
"bytes": 154261,
"hashPolicy": "Exact measured raw bytes"
},
"lane": "oauth-sender",
"test": "[P7-09 OAuth sender] actual local child proxy and callback origin bind one terminal Connections refresh while forged and duplicate messages are ignored",
"name": "p709-client-guard-connections-disconnected",
"manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT",
"review": "ACTUALLY DISPLAYED AND REVIEWED by parent",
"reviewedUtc": "2026-10-17T08:26:39.793290+00:00"
},
{
"raw": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression-results/job-sections-presentation--3db37-xplicit-and-recover-locally-chromium/attachments/sections-documents-loading-7849a3a5b4870c2813da5e077971061e408c8086.png",
"sha256": "41dbeece6f2a8e6b30bdbffb73f10ad1640be556ba1e3f2d32c2bd8b8647433b",
"bytes": 54618,
"hashPolicy": "Exact measured raw bytes"
},
"originalEmbeddedReport": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression.json",
"sha256": "6635854a36655342f2c7c5d2b303fa359907312b66a839358f7e1a69e6585fb9",
"bytes": 137941,
"hashPolicy": "Exact measured raw bytes"
},
"lane": "application-forms-regression",
"test": "[PRES-W01 W08 M01 E08] Job section loading and partial read failures stay explicit and recover locally",
"name": "sections-documents-loading",
"manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT",
"review": "ACTUALLY DISPLAYED AND REVIEWED by parent",
"reviewedUtc": "2026-10-17T08:26:39.793290+00:00"
},
{
"raw": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression-results/job-sections-presentation--6b168-tasks-and-history-en-light--chromium/attachments/sections-timeline-768-en-light-1cd7e78e8c8c2c4afc7af8281944396581e4960d.png",
"sha256": "8f352eb32ded467f7dc2c914a67a356da0493246837339430d5732d8d92b1c72",
"bytes": 63152,
"hashPolicy": "Exact measured raw bytes"
},
"originalEmbeddedReport": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression.json",
"sha256": "6635854a36655342f2c7c5d2b303fa359907312b66a839358f7e1a69e6585fb9",
"bytes": 137941,
"hashPolicy": "Exact measured raw bytes"
},
"lane": "application-forms-regression",
"test": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
"name": "sections-timeline-768-en-light",
"manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT",
"review": "ACTUALLY DISPLAYED AND REVIEWED by parent",
"reviewedUtc": "2026-10-17T08:26:39.793290+00:00"
},
{
"raw": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression-results/job-sections-presentation--9cba8--tasks-and-history-en-dark--chromium/attachments/sections-communication-390-en-dark-ab586d30b020e90bc0b98c58a2aebff52d631444.png",
"sha256": "4602ffe1395f5125ea9df5a1fa49b35764a2fabd43e29edee2be8367ce448962",
"bytes": 45456,
"hashPolicy": "Exact measured raw bytes"
},
"originalEmbeddedReport": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression.json",
"sha256": "6635854a36655342f2c7c5d2b303fa359907312b66a839358f7e1a69e6585fb9",
"bytes": 137941,
"hashPolicy": "Exact measured raw bytes"
},
"lane": "application-forms-regression",
"test": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, dark)",
"name": "sections-communication-390-en-dark",
"manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT",
"review": "ACTUALLY DISPLAYED AND REVIEWED by parent",
"reviewedUtc": "2026-10-17T08:26:39.793290+00:00"
},
{
"raw": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression-results/job-sections-presentation--9f2d9-tasks-and-history-nb-light--chromium/attachments/sections-documents-320-nb-light-6adbb6be58b8c957e0d943acfeae64c4e7ed3adb.png",
"sha256": "325b31938bfcd342ce6c00e563a93796eff5b9054330f8282d38062994f7be6f",
"bytes": 45863,
"hashPolicy": "Exact measured raw bytes"
},
"originalEmbeddedReport": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression.json",
"sha256": "6635854a36655342f2c7c5d2b303fa359907312b66a839358f7e1a69e6585fb9",
"bytes": 137941,
"hashPolicy": "Exact measured raw bytes"
},
"lane": "application-forms-regression",
"test": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, light)",
"name": "sections-documents-320-nb-light",
"manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT",
"review": "ACTUALLY DISPLAYED AND REVIEWED by parent",
"reviewedUtc": "2026-10-17T08:26:39.793290+00:00"
},
{
"raw": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression-results/job-sections-presentation--79a07--tasks-and-history-nb-dark--chromium/attachments/sections-sparse-nb-dark-2a16a7ade8be87e69a9284919536ff2606f37745.png",
"sha256": "70fff9c80f37808d884b3d7743c4208e604081bcb37f1cb01ad0240779426298",
"bytes": 42359,
"hashPolicy": "Exact measured raw bytes"
},
"originalEmbeddedReport": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-forms-regression.json",
"sha256": "6635854a36655342f2c7c5d2b303fa359907312b66a839358f7e1a69e6585fb9",
"bytes": 137941,
"hashPolicy": "Exact measured raw bytes"
},
"lane": "application-forms-regression",
"test": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, dark)",
"name": "sections-sparse-nb-dark",
"manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT",
"review": "ACTUALLY DISPLAYED AND REVIEWED by parent",
"reviewedUtc": "2026-10-17T08:26:39.793290+00:00"
},
{
"raw": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/embedded/application-p2d01/001-native-frozen-package.png",
"sha256": "0e50da5bb0832aa07ddb5669555520f57df2d23b29cdcd6ed80044148f06e0aa",
"bytes": 93792,
"hashPolicy": "Exact measured raw bytes"
},
"originalEmbeddedReport": {
"path": ".artifacts/phase7/p7-09/oauth-final-verified/application-p2d01.json",
"sha256": "40fd978b3924cba8da8ad5d3fe396484c274ab7a540ee763e8469fe27003001e",
"bytes": 129482,
"hashPolicy": "Exact measured raw bytes"
},
"lane": "application-p2d01",
"test": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change",
"name": "native-frozen-package",
"manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT",
"review": "ACTUALLY DISPLAYED AND REVIEWED by parent",
"reviewedUtc": "2026-10-17T08:26:39.793290+00:00"
}
],
"qualification": "Seven of76 retained PNGs actually displayed: Connections, controlled loading, EN/light768, EN/dark390, NB/light320, NB/dark320 and frozen package. The unchanged P2-D01 screenshot catches dialog transition opacity; passing archive/readback assertions are not a settled visual or PDF-fidelity claim."
},
"accessibility": {
"senderScans": 0,
"consumerScans": 8,
"violations": 0,
"incompleteNodes": 89,
"triage": [
{
"count": 8,
"category": "Short notification badge text; manual contrast remains required"
},
{
"count": 15,
"category": "Overlapped form backgrounds; manual contrast/state remains required"
},
{
"count": 20,
"category": "Partly obscured labels; scroll/state review remains required"
},
{
"count": 46,
"category": "aria-label on roleless span (45 Notes/Tasks,1 Interview); retained P7-11 diagnostic requiring responsible-owner review"
}
],
"qualification": "Full node/check vectors retained in raw reports. Consumer scans are inherited workflow regression, not new sender scans or human screen-reader acceptance. No rule is disabled."
},
"peerReview": "Independent read-only review: no actionable introduced defect across helper, both callers, unit suites and native fixture. Actual provider interoperability remains unqualified.",
"preservation": {
"groups": 57,
"partial": 56,
"deferred": [
"PRES-C11"
],
"routes": 33,
"targets": [
"PRES-M01",
"PRES-M02",
"PRES-M06",
"PRES-E09"
],
"ordinaryP2D01": "PASS",
"qualification": "No provider grants, backend auth/state exchange, IMAP semantics, document renderer, stored data, routes or permissions changed."
},
"limits": [
"Local child URLs/HTML/messages are controlled client-guard projections, not real OAuth grants; actual server status remains disconnected.",
"Known Google Fonts stylesheet is intercepted and aborted; no provider/model/mailbox/send call is authorized or executed.",
"Native Microsoft connect500 is checked-in unconfigured-service behavior. Anonymous401 is a real separate API request, not a fabricated browser response.",
"RD11/RD12/RD13/RD21, other reliability/scaling and manual/device/zoom/production-output gates remain open.",
"Preferences/Connections and data/privacy/plan/backup presentation remain pending. P5-13 stays withheld, followMode deferred, main unchanged, production NO-GO, Phase8 not started."
],
"staticChecks": {
"path": "docs/redesign/phase-7/p7-09/evidence/oauth-static-checks.json",
"sha256": "2efe01046430d1b9522ec348b0dfb1462d16589dff137ef7068f4b5b6609017e",
"checkedUtc": "2026-10-17T08:27:18.310998+00:00"
}
}
@@ -0,0 +1,104 @@
{
"schemaVersion": 1,
"checkpoint": "p7-09",
"status": "PASS",
"checkedUtc": "2026-10-17T08:27:18.310998+00:00",
"commands": [
{
"name": "secret-scan",
"command": [
"rtk",
"proxy",
"C:\\Users\\Connor\\AppData\\Local\\Programs\\Python\\Python312\\python.exe",
"-X",
"utf8",
"scripts/supply-chain.py",
"scan-secrets"
],
"startedUtc": "2026-10-17T08:27:14.824608+00:00",
"finishedUtc": "2026-10-17T08:27:17.557432+00:00",
"exitCode": 0,
"log": ".artifacts/phase7/current/static/20261017T082714Z/secret-scan.log",
"logSha256Raw": "c5a88d5ebdc042adba125c1eaacbe44f9f4a5c19898c0f195573c00d511aa28d"
},
{
"name": "working-whitespace",
"command": [
"rtk",
"proxy",
"git",
"diff",
"--check"
],
"startedUtc": "2026-10-17T08:27:17.557931+00:00",
"finishedUtc": "2026-10-17T08:27:17.648521+00:00",
"exitCode": 0,
"log": ".artifacts/phase7/current/static/20261017T082714Z/working-whitespace.log",
"logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6"
},
{
"name": "staged-whitespace",
"command": [
"rtk",
"proxy",
"git",
"diff",
"--cached",
"--check"
],
"startedUtc": "2026-10-17T08:27:17.649028+00:00",
"finishedUtc": "2026-10-17T08:27:17.743329+00:00",
"exitCode": 0,
"log": ".artifacts/phase7/current/static/20261017T082714Z/staged-whitespace.log",
"logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6"
},
{
"name": "phase7-whitespace",
"command": [
"rtk",
"proxy",
"git",
"diff",
"--check",
"b5319981ad3d1bd635daff861453d23c0de5320b"
],
"startedUtc": "2026-10-17T08:27:17.743826+00:00",
"finishedUtc": "2026-10-17T08:27:17.908329+00:00",
"exitCode": 0,
"log": ".artifacts/phase7/current/static/20261017T082714Z/phase7-whitespace.log",
"logSha256Raw": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6"
}
],
"untrackedSecretScan": {
"files": 0,
"findings": 0
},
"documentation": {
"files": 25,
"relativeLinks": 583,
"errors": []
},
"preservation": {
"groups": 57,
"statuses": {
"PARTIAL": 56,
"PASS": 0,
"FAIL": 0,
"DEFERRED": 1
},
"originalRoutesPreserved": true,
"currentConcreteRoutes": 33
},
"production": {
"main": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"originMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"status": "NO-GO",
"qualification": "Local fetched refs; direct push observation recorded separately."
},
"hashPolicy": "Portable JSON UTF8 LF; raw log hashes measure exact saved bytes.",
"limits": [
"Pattern scanner skips binary and files over2MiB; not historical Git/production secrets.",
"Local links check target existence, not URL/heading anchors.",
"Static evidence is not runtime/manual/device/provider/production acceptance."
]
}