docs(qa): qualify Phase 9 regression and acceptance

This commit is contained in:
cesnimda
2026-10-23 07:31:27 +02:00
parent 0fb108bd67
commit 8e7e3f6387
63 changed files with 64728 additions and 6835 deletions
+4 -4
View File
@@ -23,11 +23,11 @@ $env:PLAYWRIGHT_STATIC_EXPORT='true'
$env:PLAYWRIGHT_PREBUILT_EXPORT='true'
$env:CV_FIDELITY_OUTPUT='E:\Storage\Projects\Active\Job tracker\.artifacts\phase9\fidelity'
$env:CV_SETTINGS_FIDELITY_OUTPUT='E:\Storage\Projects\Active\Job tracker\.artifacts\phase9\settings-fidelity'
$env:PLAYWRIGHT_JSON_OUTPUT_NAME='E:\Storage\Projects\Active\Job tracker\.artifacts\phase9\ordinary-shard-1.json'
rtk proxy node node_modules/@playwright/test/cli.js test --shard=1/4 --retries=0 --reporter=list,json --output=../.artifacts/phase9/ordinary-shard-1-results
$env:PLAYWRIGHT_JSON_OUTPUT_NAME='E:\Storage\Projects\Active\Job tracker\.artifacts\phase9\ordinary-cta-shard-1.json'
rtk proxy node node_modules/@playwright/test/cli.js test --shard=1/4 --retries=0 --reporter=list,json --output=../.artifacts/phase9/ordinary-cta-shard-1-results
```
Repeat the ordinary command serially with `--shard=2/4`, `3/4` and `4/4`, separate `ordinary-shard-N.json` and output names, and an unchanged source/export. Playwright keeps connected files together because fullyParallel is false. Native `test --list --reporter=json` records the complete discovery set without starting servers. Final reconciliation requires the exact discovered362 IDs to appear once across the four successful shards. Interrupted attempts are retained but excluded. This preserves completed result checkpoints rather than repeatedly losing a nearly hour-long run; assertions/retries/skips are unchanged.
Repeat serially with `--shard=2/4`, `3/4` and `4/4`, separate `ordinary-cta-shard-N.json` and output names, and unchanged source/export. The `-cta` successor follows the P9-V02 repair/rebuild and retains the provider-worker isolation fixture. Browser interception alone does not constrain that server-originated worker: keep `Workers__SavedJobSearchAlertsEnabled=false` for local fixture qualification. Playwright keeps connected files together because fullyParallel is false. Native `test --list --reporter=json` records discovery without starting servers. Final reconciliation requires all 362 discovered IDs exactly once across four successful shards. Interrupted/superseded attempts remain excluded, with assertions/retries/skips unchanged. Use fresh output names for later reproduction to preserve evidence.
Run separate browser configurations sequentially, each with its own JSON/output name: `playwright.cv-ai.config.ts`, `playwright.auth-recovery.config.ts`, `playwright.rate-limits.config.ts`, `playwright.ingress.config.ts`, `playwright.pdf.config.ts`, and `../docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/playwright.config.ts`. Use the same CLI `--config=... --retries=0 --reporter=list,json`. The Phase9 lane uses `../docs/redesign/phase-9/p9-05/diagnostics/playwright.config.ts` (18 cases); the separate API-only volume lane uses `../docs/redesign/phase-9/p9-05/volume/playwright.config.ts` (3 cases). Native PDF admission uses inert processes; it is distinct from native rendering fidelity.
@@ -35,6 +35,6 @@ The configs start isolated synthetic local API/storage and a static frontend. Do
From `tools/summarizer`, `SKIP_MODEL_LOAD=1`, run `rtk proxy .venv/Scripts/python.exe -m pytest -q tests --junitxml=../../.artifacts/phase9/sidecar.xml`. No inference semantics are qualified by these56 contracts.
The unchanged `scripts/verify-cv-fidelity.py` takes a corpus directory containing `measurements.json` and native PDF/preview fixtures. It requires the existing Python PDF/Pillow dependencies (bundled workspace runtime used in this run). Invoke it separately for the fidelity corpus and the combined Settings measurements. Never increase its tolerances to clear a failure.
The unchanged `scripts/verify-cv-fidelity.py` takes a corpus directory containing `measurements.json` and native PDF/preview fixtures. It requires the existing Python PDF/Pillow dependencies (bundled workspace runtime used in this run). After the final document producers finish, run `rtk proxy <python-runtime> docs/redesign/phase-9/native-documents.py`. It merges the four Settings measurements, invokes the original oracle separately for both corpora, verifies stable input hashes and records successful commands, final producer report/exit hashes and result hashes in `p9-05/evidence/native-document-provenance.json`. Never increase oracle tolerances to clear a failure.
After accepted reports exist, `rtk proxy python docs/redesign/phase-9/evidence.py` builds portable cases, route/axe/RD21/performance records and hashes raw reports. `rtk proxy python docs/redesign/phase-9/reconcile.py` checks362 ordinary cases,396 route vectors and57 unchanged preservation dispositions before generating final ledgers. Missing or failed data must not be replaced with baseline counts. Source/artifact identities are retained in `p9-00/source-manifest.json`.
+66
View File
@@ -0,0 +1,66 @@
# Phase 9 preservation reconciliation
All57 groups retain **56 PARTIAL / C11 DEFERRED**. Zero groups are promoted to PASS. These statuses retain mandatory human/provider/output obligations and are not57 defect findings. Phase9 adds finite executed evidence and repairs in two existing UI owners; it does not erase previous acceptance records. [Phase7](../phase-7/PRESERVATION.md) supplies the later residual obligations, superseding stale Phase2 gap descriptions (notably repaired P2-D01 and CV revision safety).
Exact executed browser cases are in [ordinary-cases](p9-01/ordinary-cases.json); complete backend case results and frontend suite totals are linked from [validation](validation.json). The matches below use explicit IDs in test titles only; zero explicit matches means no direct title mapping, not absent unit/API coverage. A case may cover several groups; do not sum counts as independent tests.
| Group / owners | Entry → Phase9 | Direct native title matches | Current residual / closure |
|---|---|---|---|
| **PRES-E01** — Public product/plans; honest unavailable billing; owners: LandingPage, planCatalog; AccountPlans | PARTIAL → PARTIAL | 2 | Finite full regression retained; human/provider/output qualifications remain. P9-V01/P9-V02 proportional heading and CTA fixes; two native cases retain16-vector geometry proof. Public-page complete mobile/keyboard review and actual billing availability; no invented prices |
| **PRES-E02** — Local login/register/remember, challenge, reset and verification; owners: LoginPage, TurnstileWidget, VerifyEmailPage; AuthController | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Real mail/reset submit/Turnstile and token expiry/used-token cases; query loss is repaired for its tested scope |
| **PRES-E03** — Google/Microsoft login, link, legacy relink and popup results; owners: GoogleAuthCard, MicrosoftAuthCard, MicrosoftLegacyRelinkPage; token validators | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Actual consent/popups/revoked grants/relink; mailbox grants remain separate from sign-in |
| **PRES-E04** — 2FA challenge/recovery/setup/disable; trusted-device revocation; owners: TwoFactorSettingsCard, TwoFactorChallenge; TwoFactorController | PARTIAL → PARTIAL | 1 | Finite full regression retained; human/provider/output qualifications remain. Real authenticator/recovery and reader/trusted-device traversal; sensitive confirmations retained |
| **PRES-E05** — Session list/current device, revoke one/others, logout; owners: SessionsSettingsCard, AppShell, auth; SessionsController | PARTIAL → PARTIAL | 2 | Finite full regression retained; human/provider/output qualifications remain. Native session-card refresh after remote revocation and complete device/AT acceptance |
| **PRES-E06** — Avatar, account names/headline, email change and password; owners: ProfilePage; AuthController, AvatarStorage | PARTIAL → PARTIAL | 4 | Finite full regression retained; human/provider/output qualifications remain. Complete avatar/remove/password/email-change native flow; account identity remains distinct from career facts |
| **PRES-E07** — Desktop collapse/mobile drawer, active nav and command search/actions; owners: AppShell, QuickCommandDialog; job/company search APIs | PARTIAL → PARTIAL | 30 | Finite full regression retained; human/provider/output qualifications remain. Spoken names/live state, settled drawer AX-name triage and historical command/dialog timing; no route silently hidden |
| **PRES-E08** — Theme/system, EN/NB hydration, toast/confirm/prompt and errors; owners: themePrefs, I18nProvider, confirm, prompt; auth preference | PARTIAL → PARTIAL | 28 | Finite full regression retained; human/provider/output qualifications remain. P9-L01 installed vendor locale and2new Jest cases. Full OS/locale/state cross-product, contrast/incomplete axe, reader/reflow; save feedback is distinct from server500 root-cause repair |
| **PRES-E09** — Account-switch private-state disposal and stale request rejection; owners: App, api, sessionBoundary; SessionContextMiddleware | PARTIAL → PARTIAL | 6 | Finite full regression retained; human/provider/output qualifications remain. Broader BFCache/offline/old-bundle/deployed cases; presentation never becomes authorization |
| **PRES-J01** — NAV discovery/filter/sort/source/deadline/details; owners: JobDiscoveryPage; JobDiscoveryController | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Live NAV availability/freshness and long-result keyboard/narrow traversal |
| **PRES-J02** — Saved searches, run/delete/alerts, result changes/dismissal; owners: JobDiscoveryPage; saved-search/alert services | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Actual scheduler-to-owned-notification delivery, human/mobile delete acceptance and intended-provider qualification; deterministic runner is not live NAV |
| **PRES-J03** — Reviewed manual/URL/paste job create, company/tags/dates, duplicates; owners: AddJobModal; JobImportService, JobApplicationsController | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Duplicate/company/date/interrupted creation and distinct creation-intent idempotency debt; preview/open is no-write |
| **PRES-J04** — Extension/bookmarklet/share capture; post-create attachment/CV; owners: App, captureUrl, QuickCaptureCard; job/CV APIs | PARTIAL → PARTIAL | 1 | Finite full regression retained; human/provider/output qualifications remain. Installed extension/share/no-replay and attachment failure recovery; keep payload and safe-return contracts |
| **PRES-J05** — Job filters/sort/page/columns, saved views and row/mobile actions; owners: JobTable, SavedViewsMenu; JobApplicationsController | PARTIAL → PARTIAL | 7 | Finite full regression retained; human/provider/output qualifications remain. Full saved-view CRUD/dirty page-size/history combinations and supported capacity; server query semantics unchanged |
| **PRES-J06** — Bulk status/delete, soft delete/trash/restore and job edit; owners: JobTable, EditJobDialog; job lifecycle/controller | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. RD21 stale-write safety FAIL; see separate contract issue. Complete selected-scope/partial-failure/dirty/manual combinations; no hard-delete substitution |
| **PRES-J07** — Kanban grouped statuses, pointer/keyboard move and precise menu; owners: KanbanBoard, pipeline; status endpoint | PARTIAL → PARTIAL | 4 | Finite full regression retained; human/provider/output qualifications remain. Physical drag/touch/browser variants and O(N) full-array capacity; no capped hidden results or pipeline redefinition |
| **PRES-J08** — Company/contact edits, pipeline dates and linked-job history; owners: CompaniesTable; company relationship APIs | PARTIAL → PARTIAL | 12 | Finite full regression retained; human/provider/output qualifications remain. Scoped in-modal failure proof follows P6 manifest; complete contact/date/source-link and human acceptance remain |
| **PRES-J09** — Recorded offers/compensation/deadlines/notes and source links; owners: OfferComparisonPage; job API | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Many-offer mobile/currency/date acceptance; no invented salary normalization |
| **PRES-J10** — CSV/JSON export, JSON import and CSV-to-JSON conversion; owners: ImportExportJobs; CSV/job controller | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Complete native roundtrip and target spreadsheet compatibility; job import is not account restore |
| **PRES-W01** — Full workspace, sections, legacy links and optional reusable overlay; owners: ApplicationWorkspacePage, jobWorkspaceRoute; workspace API | PARTIAL → PARTIAL | 14 | Finite full regression retained; human/provider/output qualifications remain. `followMode` metadata retained; compose consumer deferred. P5-05 optional preview lacks production host; full page remains |
| **PRES-W02** — Detail/status/progression, recruiter/dates/description/timeline; owners: WorkspaceHeader, JobDetailsSection, ApplicationProgress/Timeline; workflow APIs | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. RD21 stale-write safety FAIL; see separate contract issue. Stored-event localisation/timezones/status-reload combinations and separate job revision debt |
| **PRES-W03** — Analysis, match/gaps, strategy and reviewed status/workflow suggestions; owners: ApplicationAnalysis/Match/StrategySnapshot/StatusSuggestion; intelligence/AI services | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Real-model truthfulness/freshness/cancel quality; route entry never auto-generates; unrelated AI survives C11 withholding |
| **PRES-W04** — Checklist create/edit/complete/delete/order and next action; owners: ApplicationChecklist; checklist service/controller | PARTIAL → PARTIAL | 4 | Finite full regression retained; human/provider/output qualifications remain. Mobile interruption/edit/delete/reader; item identity and keyboard alternatives retained; no invented due-date schema |
| **PRES-W05** — Attach/select/create/tailor CV and source context; owners: ApplicationCvSection/TailoringSection; ApplicationAssetsService | PARTIAL → PARTIAL | 1 | Finite full regression retained; human/provider/output qualifications remain. **P2-D01 remains ordinary passing**; broader attach-render/model/deployed combinations remain; owner/job association unchanged |
| **PRES-W06** — Cover-letter manual/AI review, versions/restore and dirty protection; owners: ApplicationCoverLetterSection, CoverLetterAiAssistant; assets/history | PARTIAL → PARTIAL | 5 | Finite full regression retained; human/provider/output qualifications remain. Complete native history/reject/reader/model combinations; no canonical mutation or auto-send |
| **PRES-W07** — Application drafts and immutable submitted package/archived binaries; owners: ApplicationPackageDraftsSection, SubmittedPackagesSection; package service/storage | PARTIAL → PARTIAL | 1 | Finite full regression retained; human/provider/output qualifications remain. Actual production restore/rollback/all-storage combinations; current edits/delete cannot mutate frozen bytes; capture is not delivery |
| **PRES-W08** — Attachments upload/category/name/AI consent/preview/download/delete; owners: Attachments; AttachmentsController, AttachmentStorage | PARTIAL → PARTIAL | 9 | Finite full regression retained; human/provider/output qualifications remain. Physical drop, full rename/download/reader and deployed storage; AI inclusion remains explicit |
| **PRES-W09** — Interview questions/answers/ready/manual removal/AI review; owners: InterviewPrep; interview persistence/AI endpoints | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Real-model and physical software-keyboard/reload/reader; preparation is not a scheduled interview |
| **PRES-W10** — Debrief/follow-up draft/date/readiness; owners: InterviewPrep; follow-up draft services | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Timezones/provider delivery; `followMode` reviewed compose UI remains deferred, no automatic send |
| **PRES-W11** — Reminder rules/actions/notifications, ICS and Google/Outlook events; owners: RemindersView, RulesSettingsCard, ApplicationCalendarActions; calendar/rules APIs | PARTIAL → PARTIAL | 1 | Finite full regression retained; human/provider/output qualifications remain. F21 DST/date-only/offsets, real provider events/scheduler delivery and historical unconfirmed Rules500 cause |
| **PRES-W12** — Async progress/failure/retry/cancel/notifications; owners: OperationsPage, CareerProfilePage; operation store/worker | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Disconnect/reconnect and F20 enabled-worker fault recovery; stable operation IDs/no duplicate starts |
| **PRES-C01** — Canonical structured career data and long-tail/custom sections; owners: CareerProfilePage, career views; CareerProfileService/controller | PARTIAL → PARTIAL | 27 | Finite full regression retained; human/provider/output qualifications remain. RD21 stale-write safety FAIL; see separate contract issue. Full long-tail mobile save and profile concurrency; singleton source distinct from identified variants |
| **PRES-C02** — Profile overview/completeness/import guidance/raw copy/history/restore; owners: CareerWorkspacePage, CareerProfilePage; version service | PARTIAL → PARTIAL | 5 | Finite full regression retained; human/provider/output qualifications remain. Complete native historical restore/clipboard/avatar/reader; live inherited CVs may reflect later source changes |
| **PRES-C03** — Upload/extract/rebuild/reprocess/diff/select/accept/discard/retry/cancel; owners: CareerProfilePage; profile-CV/processing/diff services | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Scanned/OCR corpus and complete low-confidence/discard/native-reader flow; extracted proposal is not canonical truth |
| **PRES-C04** — Evidence bank source/category/tags/add/list/delete; owners: CareerEvidenceBank; CareerEvidenceController | PARTIAL → PARTIAL | 2 | Finite full regression retained; human/provider/output qualifications remain. Many-item/delete/keyboard/human acceptance; SQLite compatibility repaired with owner SQL preserved, full frontend/production acceptance remains qualified |
| **PRES-C05** — CV library create/copy/delete/templates/share/publication/PDF; owners: CvBuilderPage, thumbnails; CvVariantService/PublicCvController | PARTIAL → PARTIAL | 23 | Finite full regression retained; human/provider/output qualifications remain. Library migration not complete; publish/unpublish/old-slug revocation and every template combination required |
| **PRES-C06** — Studio tabs, preview debounce/pages/fit/save state/mobile panes; owners: CvBuilderEditor, CvPreviewPane; preview API | PARTIAL → PARTIAL | 18 | Finite full regression retained; human/provider/output qualifications remain. Physical keyboard/touch/AT and broader short-height/wrapped/deployed cases; one editor/save/preview owner |
| **PRES-C07** — Visibility/order/custom sections and item/document overrides; owners: CvBuilderEditor, CV controls/useDragReorder; resolver/settings | PARTIAL → PARTIAL | 7 | Finite full regression retained; human/provider/output qualifications remain. Physical selection/drop/all-browser and exhaustive reset/inheritance combinations; sibling/canonical/frozen separation retained |
| **PRES-C08** — Capability-aware templates/typography/color/header/skills/sidebar/photo; owners: CvCustomizeTab, registry; ThemedCvRenderer | PARTIAL → PARTIAL | 6 | Finite full regression retained; human/provider/output qualifications remain. Production fonts/portraits/wrapped lines/custom color/reader; schematic gallery is not final-photo qualification |
| **PRES-C09** — A4/Letter/density/margins/dates/document locale/section presentation; owners: cvBuilder, CvCustomizeTab; settings normalization/render model | PARTIAL → PARTIAL | 7 | Finite full regression retained; human/provider/output qualifications remain. Advanced cross-product/manual print/deployed fonts; UI locale distinct from document locale; no print geometry styling change |
| **PRES-C10** — Undo/redo, save queue, dirty guard, history restore/preview lifecycle; owners: CvBuilderEditor; CvVariantService version history | PARTIAL → PARTIAL | 6 | Finite full regression retained; human/provider/output qualifications remain. Long offline/history and IF-CV-UNSAVED-01 trace; settings history is not immutable historical profile/PDF; profile/job saves remain separate |
| **PRES-C11** — Section and whole-document AI improve/translate/instruction/grammar review; owners: AiSectionAssistant, DocumentAiTab; CV AI assist | DEFERRED → DEFERRED | 2 | P5-13 remains withheld; real model/semantic qualification not executed. **0/366 configured-target calls;0 human semantic reviews;review UI absent.** Production503 `cv_ai_unavailable`/no provider/no write remains; safe withholding is not generation acceptance |
| **PRES-C12** — Private PDF and published anonymous CV/PDF, long searchable pages; owners: PublicCvPage, cvBuilder; HtmlPdfGenerator/shared admission | PARTIAL → PARTIAL | 6 | Finite full regression retained; human/provider/output qualifications remain. Deployed Linux/font/photo/browser/manual-print qualification and complete revoke/busy-recovery cases; white print pages retained |
| **PRES-M01** — Job-scoped manual correspondence/search/delete/paste import; owners: Correspondence; CorrespondenceController | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Full edit/delete/paste/reader native combinations; logging is not sending |
| **PRES-M02** — Gmail candidate/thread import/refresh/sync/unlink/relink/move; owners: Correspondence; GmailController/provider | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Actual provider threads/multi-account revoke/reconnect/sync failures; cross-job changes owner-bound |
| **PRES-M03** — Global inbox filters/page/provider/link/direction/detail/source links; owners: CorrespondenceInboxPage; EmailController | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Large mailbox/native attachments/complete reader acceptance; global inbox remains Phase7 migration |
| **PRES-M04** — Compose/reply/provider/recipient/job; draft conflicts; confirm send/uncertainty; owners: CorrespondenceInboxPage; EmailDrafts/Send/attempt store | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Sandbox delivery/reconnect/dirty interruption; no automatic uncertain resend; reviewed `followMode` UI deferred |
| **PRES-M05** — Review proposed jobs/link/reject/keep/notes/sync/create; owners: GmailReviewPage, CorrespondenceInboxPage; Gmail review | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Real provider and complete proposed-job create flow; route opening is no-write |
| **PRES-M06** — Gmail/Graph/IMAP connect/status/disconnect separate from sign-in; owners: EmailProviderConnections; Google/Graph/IMAP controllers | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Real grants/revoke/token expiry/reconnect/IMAP safety; keep sign-in identity separate |
| **PRES-S01** — Personal metrics/activity/funnel/company/skills/stage/salary/next actions; owners: DashboardView; analytics/controllers | PARTIAL → PARTIAL | 5 | Finite full regression retained; human/provider/output qualifications remain. Exact cohort/timezone/sample/unsupported metrics and whole reader acceptance; no fabricated statistics or Analytics rebuild |
| **PRES-S02** — Owner-local five visibility preferences/onboarding dismiss/notifications; owners: DashboardView, OnboardingChecklist, NotificationsPopover; notification APIs | PARTIAL → PARTIAL | 12 | Finite full regression retained; human/provider/output qualifications remain. Phase8 account-layout order/size/visibility/reset/conflict behaviour preserved. Historical500 causes unproved; full human/notification acceptance; order/resize/reset/cross-device design remains Phase8 |
| **PRES-S03** — Rules/reminder/table/theme/language preferences and account links; owners: SettingsView, RulesSettingsCard, theme/i18n; rules/notification/auth | PARTIAL → PARTIAL | 5 | Finite full regression retained; human/provider/output qualifications remain. Language failure visibility is separate from RD11 server cause; RD12 notification locking/RD13 Rules500 and human/provider acceptance retained |
| **PRES-S04** — AI privacy/usage/limits/Free-Pro/server entitlement/conditional billing; owners: AiPrivacySettingsCard, AiUsageCard, AccountPlanProvider; billing/entitlement | PARTIAL → PARTIAL | 1 | Finite full regression retained; human/provider/output qualifications remain. Checkout/webhook/portal and provider delivery; temporary C11 withholding cannot disable unrelated AI or imply successful review |
| **PRES-S05** — Account ZIP/encrypted backup/lifecycle/deletion confirmations; owners: BackupCard; export/backup/deletion services | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Current complete backup/restore/keys/tombstones/rollback and deletion/provider policy; downloading backup is not restore proof |
| **PRES-A01** — Admin user/create/roles/reset/delete/last-admin/self guards; owners: AdminUsersPage; UsersController | PARTIAL → PARTIAL | 1 | Finite full regression retained; human/provider/output qualifications remain. P9-L01 installed vendor locale and2new Jest cases. Mounted-role revoke/full persisted mutations/reset delivery; hiding navigation never authorizes API calls |
| **PRES-A02** — Audit list/detail/supported undo/job restore; owners: AdminAuditPage; AdminAuditController | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Native successful persisted undo/restore and unsupported-action denial; no generic undo semantics |
| **PRES-A03** — System/build/DB/AI/mail/SMTP/test/probe/benchmark/maintenance; owners: AdminSystemPage; AdminSystemController/maintenance/benchmark | PARTIAL → PARTIAL | 0 | Finite full regression retained; human/provider/output qualifications remain. Actual guarded diagnostic/SMTP/model/maintenance and sensitive-output qualification; no production jobs launched |
+41
View File
@@ -0,0 +1,41 @@
# Final route/workflow QA matrix
All33 concrete patterns are retained. Each has12 native samples:320/768/1440px × EN/NB × light/dark, with actual applied theme/locale, heading, expected owned read states where applicable and root-overflow assertions. The correspondence review alias deliberately expects409 for unavailable mailbox configuration. Public invalid-token/unpublished states are deliberately identified; they do not prove successful external delivery/publication. Screenshots were inspected within the scope in [visual report](p9-02/README.md).
Route presence/DOM PASS is separate from workflow acceptance PARTIAL. Consult [ordinary executed cases](p9-01/ordinary-cases.json) and per-group [preservation](PRESERVATION.md) for connected mutation/failure journeys; route screenshots alone are not end-to-end capability proof.
| Route → workflow owners | Feature contracts | Executed route evidence | Known risks / acceptance |
|---|---|---|---|
| `/` → Navigate, LandingPage | PRES-E01 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/dashboard` → DashboardView | PRES-S01, PRES-S02 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/analytics` → AnalyticsPage | Shared shell/nearest contracts; no invented group |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/discover` → JobDiscoveryPage | PRES-J01, PRES-J02 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/jobs` → JobTable | PRES-J05, PRES-J06, PRES-W01, PRES-W02, PRES-W03 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification; RD21 unsafe concurrent saves FAIL |
| `/jobs/:id` → ApplicationWorkspacePage | PRES-W01, PRES-W02, PRES-W03 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification; RD21 unsafe concurrent saves FAIL |
| `/reminders` → RemindersView | PRES-W11 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/operations` → OperationsPage | PRES-W12 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/kanban` → LegacyBoardRedirect | PRES-J07 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/companies` → CompaniesTable | PRES-J08 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/offers` → OfferComparisonPage | PRES-J09 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/correspondence` → CorrespondenceInboxPage | PRES-M03, PRES-M04, PRES-M05 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/correspondence/review` → LegacyCorrespondenceReviewRedirect | PRES-M05 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/profile` → ProfilePage | PRES-E04, PRES-E05, PRES-E06 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/applications/:id` → LegacyApplicationRedirect | PRES-W01 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification; RD21 unsafe concurrent saves FAIL |
| `/career` → CareerWorkspacePage | PRES-C01, PRES-C02, PRES-C05, PRES-C06 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification; RD21 unsafe concurrent saves FAIL |
| `/career/builder` → CvBuilderPage | PRES-C05, PRES-C06 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/career/builder/:id` → CvBuilderEditor | PRES-C06 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/documents` → DocumentsPage | Shared shell/nearest contracts; no invented group |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/admin/audit` → AdminAuditPage | PRES-A02 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/admin/users` → AdminUsersPage | PRES-A01 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/admin/system` → AdminSystemPage | PRES-A03 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/trash` → JobTable | PRES-J06 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/settings` → SettingsView | PRES-J10, PRES-W11, PRES-M06, PRES-S03, PRES-S04 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/settings/connected-accounts` → ConnectedAccountsPage | PRES-M06 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/login` → LoginPage | PRES-E02, PRES-E03, PRES-E04 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/register` → LoginPage | PRES-E02 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/forgot-password` → ForgotPasswordPage | PRES-E02 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/reset-password` → ResetPasswordPage | PRES-E02 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/verify-email` → VerifyEmailPage | PRES-E02 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/confirm-email-change` → VerifyEmailPage | PRES-E06 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/microsoft-legacy-relink` → MicrosoftLegacyRelinkPage | PRES-E03 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
| `/cv/:slug` → PublicCvPage | PRES-C12 |12/12 applied-state/overflow samples; [rows](p9-02/route-results.json) | RD06/07 human/device; relevant provider/output gates; PARTIAL workflow qualification |
+3 -1
View File
@@ -1,6 +1,8 @@
# Phase 9 — Comprehensive QA and regression qualification
Entry: `1c24e406f194f0f42277d837b3008a7a28dca26a`, clean working tree and direct Phase 8 remote equality verified 22 October 2026. Work branch: `feature/phase9-full-qa`. Main was observed at `5f835e54a9b74e6b71418422e28431b2af06453f` at entry; later HTTP502 prevents a fresh remote claim. It is not the redesign base.
**Assessment completed:** P9-00–07 deliverables and latest-source regression are complete. The CTA repair, full Jest, four ordinary shards, diagnostics and separate contracts pass strict reconciliation. Phase 9, Phase 10 readiness and production remain NO-GO; open human/provider/infrastructure qualifications and High RD21 are retained.
Entry: `1c24e406f194f0f42277d837b3008a7a28dca26a`, clean working tree and direct Phase8 remote equality verified22October2026. Work branch: `feature/phase9-full-qa`. Main was observed at `5f835e54a9b74e6b71418422e28431b2af06453f` at entry and directly reverified unchanged23October after the temporary Git HTTP502 outage recovered. It is not the redesign base. Feature checkpoint `0fb108bd673ea91749f6fa057295e5b6d15d557f` and all its ancestors are published with direct ref equality; final publication is recorded separately.
## Execution plan
+2 -2
View File
@@ -35,7 +35,7 @@ Phase 9 can complete an assessment while withholding acceptance. Open high data-
| RD27 | NOT TESTED: actual monitoring/alert/recovery coverage | High operational detection risk | Operations owner: effective sink, alert trigger, responder/runbook and recovery observations | Production |
| RD28 | Ongoing evidence/provenance obligation | High if failures are misrepresented | QA owner: exact source hashes/counts, original failures, no retries/skips/assertion relaxation; separate characterization from safe behavior | Every decision |
| P9-OPS-01 | Previously reported EXT4/Docker storage errors UNRECHECKED | Critical if disk faults persist | Production operator only: independent storage-health/repair and recovery qualification under separate authority | Production |
| P9-SEC-01 | Live advisories NOT REFRESHED; inherited NuGet Pkcs high/moderate and expiring dev exception retained | High dependency risk until assessed | Dependency owner: authorised live advisory refresh, actual locked versions/paths and exception expiry review; offline policy tests do not clear advisories | Production |
| P9-PUB-01 | Feature publication initially blocked by Git server HTTP 502 | Medium review/recoverability risk | Git service owner / QA: successful normal push and direct ref equality for each published checkpoint; never force push | Publication / handoff completeness |
| P9-SEC-01 | Live advisories NOT REFRESHED; inherited NuGet Pkcs high/moderate retained. Local dev-only GHSA-vfj7-8cjw-p6xm policy expires at2026-11-01 00:00UTC (after31October), verified in source23October | High dependency risk until assessed | Dependency owner: authorised live advisory refresh, actual locked versions/paths and pre-expiry exception review; offline fixed-date policy tests do not clear current advisories. No environment bypass | Production |
| P9-PUB-01 | Initial HTTP502 blockage recovered on23October; all checkpoint ancestors published in normal push; direct feature equality verified at `0fb108bd673ea91749f6fa057295e5b6d15d557f` | Resolved for published checkpoint; final commit still needs its own direct equality proof | QA: retain failed attempts and verify each subsequent normal push; no force push | Final publication / handoff completeness |
The pre-existing duplicate initial reminder read is tracked as P9-PERF-01 in [DEFECTS.md](p9-06/DEFECTS.md). No shared loader/query framework was introduced without measured benefit and consumer proof. The new admin vendor-locale repair closes only P9-L01 after its integrated successor; it does not certify every third-party or provider string.
+10 -8
View File
@@ -1,12 +1,14 @@
# Phase 9 TODO
- [ ] P9-00 — Inventory, matrix, fresh baseline and source identity.
- [ ] P9-01 — Connected functional journeys.
- [ ] P9-02 — Responsive / visual qualification.
- [ ] P9-03 — Accessibility / localisation and human checklist.
- [ ] P9-04 — Data, provider and security qualification.
- [ ] P9-05 — Native documents, edge cases and sustained performance.
- [ ] P9-06 — Confirmed defect remediation and complete regression.
- [ ] P9-07 — Acceptance, preservation reconciliation, risks and Phase 10 handoff.
- [x] P9-00 — Inventory, matrix, fresh baseline and source identity.
- [x] P9-01 — Connected functional journeys (362/362 ordinary cases; provider/human qualifications retained).
- [x] P9-02 — Responsive / visual assessment (396 captures, 33 sheets, nine selected full-page originals and 12 latest homepage CTA crops inspected).
- [x] P9-03 — Accessibility / localisation assessment and explicit human checklist; no human acceptance claimed.
- [x] P9-04 — Data/provider/security assessment; RD21 FAIL, MariaDB runtime NOT TESTED.
- [x] P9-05 — Native documents, bounded volumes and sustained performance measured.
- [x] P9-06 — P9-V02 repair and latest-source strict regression completed.
- [x] P9-07 — Final decisions, preservation, risks and Phase 10 handoff reconciled.
Checks mark assessment/deliverable completion, not application or production acceptance. All three final decisions are NO-GO; human/provider/infrastructure gates and RD21 remain open.
No Phase 10 implementation or production operation is authorised.
+17 -6
View File
@@ -47,17 +47,28 @@ if __name__ == '__main__':
changed = [name for name, expected in manifest.items() if not (ROOT / name).is_file() or digest(ROOT / name) != expected]
assert not changed, changed
report['sourceIdentity'] = dict(inputs=len(manifest), differences=changed, manifestSha256=digest(manifest_path),
qualification='Selected product/test, diagnostic, Release assembly and static-export bytes equal the frozen manifest. Documentation is outside this selected-source identity.')
qualification='Selected inputs equal the final ordinary/contract manifest. Separate Admin locator, provider-worker isolation and CTA/export deltas retain the history. Backend/sidecar inputs are unchanged; final UI results are selected from CTA-specific successor reports. Documentation is outside this selected-source identity.')
delta_path = HERE / 'p9-00/admin-fixture-delta.json'
if delta_path.exists():
report['ordinaryFixtureDelta'] = json.loads(delta_path.read_text(encoding='utf-8'))
report['workerIsolationDelta'] = json.loads((HERE / 'p9-00/worker-isolation-delta.json').read_text(encoding='utf-8'))
report['ctaDelta'] = json.loads((HERE / 'p9-00/cta-delta.json').read_text(encoding='utf-8'))
report['documentOracle'] = dict(path='scripts/verify-cv-fidelity.py', sha256=digest(ROOT / 'scripts/verify-cv-fidelity.py'), qualification='Original unchanged oracle; native rendering and admission counts are separate.')
provenance_path = HERE / 'p9-05/evidence/native-document-provenance.json'
provenance = json.loads(provenance_path.read_text(encoding='utf-8'))
for name, expected in {**provenance['inputs'], **provenance['outputs']}.items():
assert digest(ROOT / name) == expected, name
report['nativeDocuments'] = provenance
report['offline'] = json.loads((RAW / 'offline.json').read_text(encoding='utf-8-sig'))
report['supplementalSources'] = {str(path.relative_to(ROOT)): digest(path) for path in sorted((HERE / 'p9-05/volume').glob('*.ts'))}
discovered = json.loads((RAW / 'discovered.json').read_text(encoding='utf-8-sig'))
discovered = json.loads((RAW / 'discovered-cta.json').read_text(encoding='utf-8-sig'))
discovered_cases = browser_cases(discovered['suites'])
discovered_ids = {(case['id'], case['project']) for case in discovered_cases}
assert not discovered.get('errors') and len(discovered_cases) == len(discovered_ids) == 362
report['discovery'] = dict(cases=362, errors=discovered.get('errors', []), source='.artifacts/phase9/discovered.json',
report['discovery'] = dict(cases=362, errors=discovered.get('errors', []), source='.artifacts/phase9/discovered-cta.json',
qualification='List-only inventory; no tests executed. Its not-run statuses are not regression skip results.')
write_json(HERE / 'p9-00/discovered-cases.json', [{key: case[key] for key in ['id', 'project', 'file', 'title']} for case in discovered_cases])
sources = dict(ordinary=[f'ordinary-shard-{number}' for number in range(1, 5)], ai='ai', auth='auth', rate='rate', ingress='ingress', pdf='pdf', preferences='preferences', phase9='phase9-frozen', volume='volume-qualified')
sources = dict(ordinary=[f'ordinary-cta-shard-{number}' for number in range(1, 5)], ai='ai-cta', auth='auth-cta', rate='rate-cta', ingress='ingress-cta', pdf='pdf-cta', preferences='preferences-cta', phase9='phase9-cta', volume='volume-complete')
for lane, source in sources.items():
files = [RAW / f'{name}.json' for name in (source if isinstance(source, list) else [source])]
if not all(file.exists() for file in files):
@@ -121,7 +132,7 @@ if __name__ == '__main__':
body = base64.b64decode(attachment.pop('body'))
attachment.update(bytes=len(body), sha256=hashlib.sha256(body).hexdigest())
(folder / f'{lane}-cases.json').write_text(json.dumps(cases, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
frontend = RAW / 'frontend.json'
frontend = RAW / 'frontend-cta.json'
if frontend.exists():
data = json.loads(frontend.read_text(encoding='utf-8-sig'))
report['lanes']['frontend'] = {k: data.get(k) for k in ['success', 'numPassedTestSuites', 'numFailedTestSuites', 'numPassedTests', 'numFailedTests', 'numPendingTests', 'numTodoTests', 'startTime']}
@@ -135,7 +146,7 @@ if __name__ == '__main__':
if sidecar.exists():
report['lanes']['sidecar'] = ET.parse(sidecar).find('.//testsuite').attrib
report['failedOrSupersededAttempts'] = {}
for lane in ['phase9', 'phase9-successor', 'phase9-final', 'phase9-qualified', 'phase9-accepted', 'ordinary', 'ordinary-final', 'ordinary-accepted', 'ordinary-complete', 'volume', 'landing-red', 'landing-green', 'landing-qualified']:
for lane in ['phase9', 'phase9-successor', 'phase9-final', 'phase9-qualified', 'phase9-accepted', 'phase9-frozen', 'phase9-isolated', 'ordinary', 'ordinary-final', 'ordinary-accepted', 'ordinary-complete', 'ordinary-shard-1', 'ordinary-shard-1-final', 'ordinary-shard-2', 'ordinary-shard-3', *[f'ordinary-isolated-shard-{number}' for number in range(1, 5)], 'ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences', 'volume', 'volume-qualified', 'landing-red', 'landing-green', 'landing-qualified', 'landing-cta-red']:
file = RAW / f'{lane}.json'
if file.exists():
data = json.loads(file.read_text(encoding='utf-8-sig'))
+56
View File
@@ -0,0 +1,56 @@
"""Re-run the unchanged PDF oracle and bind its results to final producer bytes."""
from pathlib import Path
import datetime
import hashlib
import json
import shutil
import subprocess
import sys
HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[2]
RAW = ROOT / '.artifacts/phase9'
def sha(path):
return hashlib.sha256(path.read_bytes()).hexdigest()
def main():
producer = RAW / 'ordinary-cta-shard-1-exit.json'
assert json.loads(producer.read_text(encoding='utf-8-sig'))['exitCode'] == 0
sources = [ROOT / 'scripts/verify-cv-fidelity.py', RAW / 'ordinary-cta-shard-1.json', producer]
for name, count in [('fidelity', 16), ('settings-fidelity', 8)]:
folder = RAW / name
if name == 'settings-fidelity':
inputs = [json.loads(p.read_text(encoding='utf-8')) for p in sorted(folder.glob('*-measurements.json'))]
assert len(inputs) == 4
merged = dict(browserVersion=inputs[0]['browserVersion'], fixtures=[f for data in inputs for f in data['fixtures']])
(folder / 'measurements.json').write_text(json.dumps(merged, indent=2), encoding='utf-8')
fixtures = json.loads((folder / 'measurements.json').read_text(encoding='utf-8'))['fixtures']
assert len(fixtures) == len({f['fixture'] for f in fixtures}) == count
sources.append(folder / 'measurements.json')
sources.extend(sorted(folder.glob('*-measurements.json')))
for fixture in fixtures:
sources.append(folder / fixture['fixture'] / 'export.pdf')
sources.extend(sorted((folder / fixture['fixture']).glob('preview-*.png')))
sources = sorted(set(sources))
before = {p.relative_to(ROOT).as_posix(): sha(p) for p in sources}
commands = []
outputs = {}
for name in ['fidelity', 'settings-fidelity']:
command = ['rtk', 'proxy', sys.executable, 'scripts/verify-cv-fidelity.py', str(RAW / name)]
with (RAW / f'{name}-oracle.log').open('w', encoding='utf-8') as log:
result = subprocess.run(command, cwd=ROOT, stdout=log, stderr=subprocess.STDOUT, check=True)
commands.append(dict(command=command, exitCode=result.returncode))
target = HERE / 'p9-05/evidence' / f'{name}-results.json'
shutil.copyfile(RAW / name / 'fidelity-results.json', target)
outputs[target.relative_to(ROOT).as_posix()] = sha(target)
assert before == {p.relative_to(ROOT).as_posix(): sha(p) for p in sources}
record = dict(finishedUtc=datetime.datetime.now(datetime.timezone.utc).isoformat(), inputs=before, outputs=outputs, commands=commands)
(HERE / 'p9-05/evidence/native-document-provenance.json').write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8')
print('Unchanged native oracle passed on final producer inputs; hashes stable.')
if __name__ == '__main__':
main()
+2 -2
View File
@@ -1,6 +1,6 @@
# P9-01 connected functional journeys
Execution outcomes are recorded in [ordinary-cases.json](ordinary-cases.json) and [validation](../validation.json); a named test file below describes its actual scope, not an extra pass count. Final full-suite completion is required. No route-only screenshot is treated as a successful mutation journey.
The final ordinary suite completed **362/362 passed** across four serial native shards (98 + 87 + 88 + 89), with zero failures, skips, flaky results, retries or run-level errors. Exact unique case IDs equal full native discovery. [ordinary-cases.json](ordinary-cases.json) and [validation](../validation.json) retain actual single passed results and process exits. A named test file below describes scope, not an extra pass count. Route screenshots do not establish successful mutation journeys.
| Journey | Existing exercised sequence / evidence owner | Qualification retained |
|---|---|---|
@@ -16,4 +16,4 @@ Execution outcomes are recorded in [ordinary-cases.json](ordinary-cases.json) an
All33 concrete routes are additionally tied to explicit applied-state/read/overflow samples in [QA_MATRIX](../QA_MATRIX.md). The native route census tests ordinary-role/admin/anonymous ownership posture separately from the privileged synthetic screenshot fixture. Admin page rendering is not an authorisation grant. All service/API/sidecar results are distinguished in [P9-04](../p9-04/README.md), [P9-05](../p9-05/README.md) and final regression.
Failure cases deliberately intercept a specific local read/write or transport response; successful saves and ownership checks use local native API where stated by their fixtures. No new integration or external provider call was introduced. The exact per-case titles and raw attachments are retained so reviewers can distinguish intercepted UI recovery from persisted API evidence.
Failure cases deliberately intercept a specific local read/write or transport response; successful saves and ownership checks use local native API where stated by their fixtures. P9-T03 exposed a gap in the original test boundary: the existing server worker could run a real NAV search despite browser interception. The corrected browser configuration disables that worker and the complete successor reruns under it. No live-provider acceptance is inferred from the earlier traffic. Exact case titles and attachments distinguish intercepted UI recovery from persisted API evidence.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,382 @@
[
{
"pattern": "/",
"mode": "entry",
"destination": "/dashboard"
},
{
"pattern": "/",
"mode": "refresh",
"destination": "/dashboard"
},
{
"pattern": "/login",
"mode": "entry",
"destination": "/login"
},
{
"pattern": "/login",
"mode": "refresh",
"destination": "/login"
},
{
"pattern": "/register",
"mode": "entry",
"destination": "/register"
},
{
"pattern": "/register",
"mode": "refresh",
"destination": "/register"
},
{
"pattern": "/forgot-password",
"mode": "entry",
"destination": "/forgot-password"
},
{
"pattern": "/forgot-password",
"mode": "refresh",
"destination": "/forgot-password"
},
{
"pattern": "/reset-password",
"mode": "entry",
"destination": "/reset-password"
},
{
"pattern": "/reset-password",
"mode": "refresh",
"destination": "/reset-password"
},
{
"pattern": "/verify-email",
"mode": "entry",
"destination": "/verify-email"
},
{
"pattern": "/verify-email",
"mode": "refresh",
"destination": "/verify-email"
},
{
"pattern": "/confirm-email-change",
"mode": "entry",
"destination": "/confirm-email-change"
},
{
"pattern": "/confirm-email-change",
"mode": "refresh",
"destination": "/confirm-email-change"
},
{
"pattern": "/microsoft-legacy-relink",
"mode": "entry",
"destination": "/microsoft-legacy-relink"
},
{
"pattern": "/microsoft-legacy-relink",
"mode": "refresh",
"destination": "/microsoft-legacy-relink"
},
{
"pattern": "/cv/:slug",
"mode": "entry",
"destination": "/cv/acceptance-unpublished-link",
"status": 404
},
{
"pattern": "/cv/:slug",
"mode": "refresh",
"destination": "/cv/acceptance-unpublished-link",
"status": 404
},
{
"pattern": "/dashboard",
"mode": "entry",
"destination": "/dashboard",
"status": 200
},
{
"pattern": "/dashboard",
"mode": "refresh",
"destination": "/dashboard",
"status": 200
},
{
"pattern": "/analytics",
"mode": "entry",
"destination": "/analytics?months=6",
"status": 200
},
{
"pattern": "/analytics",
"mode": "refresh",
"destination": "/analytics?months=6",
"status": 200
},
{
"pattern": "/discover",
"mode": "entry",
"destination": "/discover",
"status": 200
},
{
"pattern": "/discover",
"mode": "refresh",
"destination": "/discover",
"status": 200
},
{
"pattern": "/jobs",
"mode": "entry",
"destination": "/jobs?q=Acceptance",
"status": 200
},
{
"pattern": "/jobs",
"mode": "refresh",
"destination": "/jobs?q=Acceptance",
"status": 200
},
{
"pattern": "/jobs/:id",
"mode": "entry",
"destination": "/jobs/60?section=documents",
"status": 200
},
{
"pattern": "/jobs/:id",
"mode": "refresh",
"destination": "/jobs/60?section=documents",
"status": 200
},
{
"pattern": "/reminders",
"mode": "entry",
"destination": "/reminders",
"status": 200
},
{
"pattern": "/reminders",
"mode": "refresh",
"destination": "/reminders",
"status": 200
},
{
"pattern": "/operations",
"mode": "entry",
"destination": "/operations",
"status": 200
},
{
"pattern": "/operations",
"mode": "refresh",
"destination": "/operations",
"status": 200
},
{
"pattern": "/kanban",
"mode": "entry",
"destination": "/jobs?q=Acceptance&status=Saved&view=board#board",
"status": 200
},
{
"pattern": "/kanban",
"mode": "refresh",
"destination": "/jobs?q=Acceptance&status=Saved&view=board#board",
"status": 200
},
{
"pattern": "/companies",
"mode": "entry",
"destination": "/companies",
"status": 200
},
{
"pattern": "/companies",
"mode": "refresh",
"destination": "/companies",
"status": 200
},
{
"pattern": "/offers",
"mode": "entry",
"destination": "/offers",
"status": 200
},
{
"pattern": "/offers",
"mode": "refresh",
"destination": "/offers",
"status": 200
},
{
"pattern": "/correspondence",
"mode": "entry",
"destination": "/correspondence",
"status": 200
},
{
"pattern": "/correspondence",
"mode": "refresh",
"destination": "/correspondence",
"status": 200
},
{
"pattern": "/correspondence/review",
"mode": "entry",
"destination": "/correspondence?route=all&view=review#review",
"status": 409
},
{
"pattern": "/correspondence/review",
"mode": "refresh",
"destination": "/correspondence?route=all&view=review#review",
"status": 409
},
{
"pattern": "/profile",
"mode": "entry",
"destination": "/profile",
"status": 200
},
{
"pattern": "/profile",
"mode": "refresh",
"destination": "/profile",
"status": 200
},
{
"pattern": "/applications/:id",
"mode": "entry",
"destination": "/jobs/60?section=documents&followMode=waiting-update",
"status": 200
},
{
"pattern": "/applications/:id",
"mode": "refresh",
"destination": "/jobs/60?section=documents&followMode=waiting-update",
"status": 200
},
{
"pattern": "/career",
"mode": "entry",
"destination": "/career?section=profile",
"status": 200
},
{
"pattern": "/career",
"mode": "refresh",
"destination": "/career?section=profile",
"status": 200
},
{
"pattern": "/career/builder",
"mode": "entry",
"destination": "/career/builder",
"status": 200
},
{
"pattern": "/career/builder",
"mode": "refresh",
"destination": "/career/builder",
"status": 200
},
{
"pattern": "/career/builder/:id",
"mode": "entry",
"destination": "/career/builder/71",
"status": 200
},
{
"pattern": "/career/builder/:id",
"mode": "refresh",
"destination": "/career/builder/71",
"status": 200
},
{
"pattern": "/documents",
"mode": "entry",
"destination": "/documents",
"status": 200
},
{
"pattern": "/documents",
"mode": "refresh",
"destination": "/documents",
"status": 200
},
{
"pattern": "/admin/audit",
"mode": "entry",
"destination": "/admin/audit",
"status": 200
},
{
"pattern": "/admin/audit",
"mode": "refresh",
"destination": "/admin/audit",
"status": 200
},
{
"pattern": "/admin/users",
"mode": "entry",
"destination": "/admin/users",
"status": 200
},
{
"pattern": "/admin/users",
"mode": "refresh",
"destination": "/admin/users",
"status": 200
},
{
"pattern": "/admin/system",
"mode": "entry",
"destination": "/admin/system",
"status": 200
},
{
"pattern": "/admin/system",
"mode": "refresh",
"destination": "/admin/system",
"status": 200
},
{
"pattern": "/trash",
"mode": "entry",
"destination": "/trash",
"status": 200
},
{
"pattern": "/trash",
"mode": "refresh",
"destination": "/trash",
"status": 200
},
{
"pattern": "/settings",
"mode": "entry",
"destination": "/settings",
"status": 200
},
{
"pattern": "/settings",
"mode": "refresh",
"destination": "/settings",
"status": 200
},
{
"pattern": "/settings/connected-accounts",
"mode": "entry",
"destination": "/settings/connected-accounts",
"status": 200
},
{
"pattern": "/settings/connected-accounts",
"mode": "refresh",
"destination": "/settings/connected-accounts",
"status": 200
}
]
@@ -0,0 +1,334 @@
[
{
"pattern": "/",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/login",
"mode": "entry",
"destination": "/login"
},
{
"pattern": "/login",
"mode": "refresh",
"destination": "/login"
},
{
"pattern": "/register",
"mode": "entry",
"destination": "/register"
},
{
"pattern": "/register",
"mode": "refresh",
"destination": "/register"
},
{
"pattern": "/forgot-password",
"mode": "entry",
"destination": "/forgot-password"
},
{
"pattern": "/forgot-password",
"mode": "refresh",
"destination": "/forgot-password"
},
{
"pattern": "/reset-password",
"mode": "entry",
"destination": "/reset-password"
},
{
"pattern": "/reset-password",
"mode": "refresh",
"destination": "/reset-password"
},
{
"pattern": "/verify-email",
"mode": "entry",
"destination": "/verify-email"
},
{
"pattern": "/verify-email",
"mode": "refresh",
"destination": "/verify-email"
},
{
"pattern": "/confirm-email-change",
"mode": "entry",
"destination": "/confirm-email-change"
},
{
"pattern": "/confirm-email-change",
"mode": "refresh",
"destination": "/confirm-email-change"
},
{
"pattern": "/microsoft-legacy-relink",
"mode": "entry",
"destination": "/microsoft-legacy-relink"
},
{
"pattern": "/microsoft-legacy-relink",
"mode": "refresh",
"destination": "/microsoft-legacy-relink"
},
{
"pattern": "/cv/:slug",
"mode": "entry",
"destination": "/cv/acceptance-unpublished-link",
"status": 404
},
{
"pattern": "/cv/:slug",
"mode": "refresh",
"destination": "/cv/acceptance-unpublished-link",
"status": 404
},
{
"pattern": "/dashboard",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/dashboard",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/analytics",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/analytics",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/discover",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/discover",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/jobs",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/jobs",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/jobs/:id",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/jobs/:id",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/reminders",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/reminders",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/operations",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/operations",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/kanban",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/kanban",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/companies",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/companies",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/offers",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/offers",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/correspondence",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/correspondence",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/correspondence/review",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/correspondence/review",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/profile",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/profile",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/applications/:id",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/applications/:id",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/career",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/career",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/career/builder",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/career/builder",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/career/builder/:id",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/career/builder/:id",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/documents",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/documents",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/admin/audit",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/admin/audit",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/admin/users",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/admin/users",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/admin/system",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/admin/system",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/trash",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/trash",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/settings",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/settings",
"mode": "refresh",
"destination": "/"
},
{
"pattern": "/settings/connected-accounts",
"mode": "entry",
"destination": "/"
},
{
"pattern": "/settings/connected-accounts",
"mode": "refresh",
"destination": "/"
}
]
@@ -0,0 +1,382 @@
[
{
"pattern": "/",
"mode": "entry",
"destination": "/dashboard"
},
{
"pattern": "/",
"mode": "refresh",
"destination": "/dashboard"
},
{
"pattern": "/login",
"mode": "entry",
"destination": "/login"
},
{
"pattern": "/login",
"mode": "refresh",
"destination": "/login"
},
{
"pattern": "/register",
"mode": "entry",
"destination": "/register"
},
{
"pattern": "/register",
"mode": "refresh",
"destination": "/register"
},
{
"pattern": "/forgot-password",
"mode": "entry",
"destination": "/forgot-password"
},
{
"pattern": "/forgot-password",
"mode": "refresh",
"destination": "/forgot-password"
},
{
"pattern": "/reset-password",
"mode": "entry",
"destination": "/reset-password"
},
{
"pattern": "/reset-password",
"mode": "refresh",
"destination": "/reset-password"
},
{
"pattern": "/verify-email",
"mode": "entry",
"destination": "/verify-email"
},
{
"pattern": "/verify-email",
"mode": "refresh",
"destination": "/verify-email"
},
{
"pattern": "/confirm-email-change",
"mode": "entry",
"destination": "/confirm-email-change"
},
{
"pattern": "/confirm-email-change",
"mode": "refresh",
"destination": "/confirm-email-change"
},
{
"pattern": "/microsoft-legacy-relink",
"mode": "entry",
"destination": "/microsoft-legacy-relink"
},
{
"pattern": "/microsoft-legacy-relink",
"mode": "refresh",
"destination": "/microsoft-legacy-relink"
},
{
"pattern": "/cv/:slug",
"mode": "entry",
"destination": "/cv/acceptance-unpublished-link",
"status": 404
},
{
"pattern": "/cv/:slug",
"mode": "refresh",
"destination": "/cv/acceptance-unpublished-link",
"status": 404
},
{
"pattern": "/dashboard",
"mode": "entry",
"destination": "/dashboard",
"status": 200
},
{
"pattern": "/dashboard",
"mode": "refresh",
"destination": "/dashboard",
"status": 200
},
{
"pattern": "/analytics",
"mode": "entry",
"destination": "/analytics?months=6",
"status": 200
},
{
"pattern": "/analytics",
"mode": "refresh",
"destination": "/analytics?months=6",
"status": 200
},
{
"pattern": "/discover",
"mode": "entry",
"destination": "/discover",
"status": 200
},
{
"pattern": "/discover",
"mode": "refresh",
"destination": "/discover",
"status": 200
},
{
"pattern": "/jobs",
"mode": "entry",
"destination": "/jobs?q=Acceptance",
"status": 200
},
{
"pattern": "/jobs",
"mode": "refresh",
"destination": "/jobs?q=Acceptance",
"status": 200
},
{
"pattern": "/jobs/:id",
"mode": "entry",
"destination": "/jobs/59?section=documents",
"status": 200
},
{
"pattern": "/jobs/:id",
"mode": "refresh",
"destination": "/jobs/59?section=documents",
"status": 200
},
{
"pattern": "/reminders",
"mode": "entry",
"destination": "/reminders",
"status": 200
},
{
"pattern": "/reminders",
"mode": "refresh",
"destination": "/reminders",
"status": 200
},
{
"pattern": "/operations",
"mode": "entry",
"destination": "/operations",
"status": 200
},
{
"pattern": "/operations",
"mode": "refresh",
"destination": "/operations",
"status": 200
},
{
"pattern": "/kanban",
"mode": "entry",
"destination": "/jobs?q=Acceptance&status=Saved&view=board#board",
"status": 200
},
{
"pattern": "/kanban",
"mode": "refresh",
"destination": "/jobs?q=Acceptance&status=Saved&view=board#board",
"status": 200
},
{
"pattern": "/companies",
"mode": "entry",
"destination": "/companies",
"status": 200
},
{
"pattern": "/companies",
"mode": "refresh",
"destination": "/companies",
"status": 200
},
{
"pattern": "/offers",
"mode": "entry",
"destination": "/offers",
"status": 200
},
{
"pattern": "/offers",
"mode": "refresh",
"destination": "/offers",
"status": 200
},
{
"pattern": "/correspondence",
"mode": "entry",
"destination": "/correspondence",
"status": 200
},
{
"pattern": "/correspondence",
"mode": "refresh",
"destination": "/correspondence",
"status": 200
},
{
"pattern": "/correspondence/review",
"mode": "entry",
"destination": "/correspondence?route=all&view=review#review",
"status": 409
},
{
"pattern": "/correspondence/review",
"mode": "refresh",
"destination": "/correspondence?route=all&view=review#review",
"status": 409
},
{
"pattern": "/profile",
"mode": "entry",
"destination": "/profile",
"status": 200
},
{
"pattern": "/profile",
"mode": "refresh",
"destination": "/profile",
"status": 200
},
{
"pattern": "/applications/:id",
"mode": "entry",
"destination": "/jobs/59?section=documents&followMode=waiting-update",
"status": 200
},
{
"pattern": "/applications/:id",
"mode": "refresh",
"destination": "/jobs/59?section=documents&followMode=waiting-update",
"status": 200
},
{
"pattern": "/career",
"mode": "entry",
"destination": "/career?section=profile",
"status": 200
},
{
"pattern": "/career",
"mode": "refresh",
"destination": "/career?section=profile",
"status": 200
},
{
"pattern": "/career/builder",
"mode": "entry",
"destination": "/career/builder",
"status": 200
},
{
"pattern": "/career/builder",
"mode": "refresh",
"destination": "/career/builder",
"status": 200
},
{
"pattern": "/career/builder/:id",
"mode": "entry",
"destination": "/career/builder/70",
"status": 200
},
{
"pattern": "/career/builder/:id",
"mode": "refresh",
"destination": "/career/builder/70",
"status": 200
},
{
"pattern": "/documents",
"mode": "entry",
"destination": "/documents",
"status": 200
},
{
"pattern": "/documents",
"mode": "refresh",
"destination": "/documents",
"status": 200
},
{
"pattern": "/admin/audit",
"mode": "entry",
"destination": "/admin/audit",
"status": 403
},
{
"pattern": "/admin/audit",
"mode": "refresh",
"destination": "/admin/audit",
"status": 403
},
{
"pattern": "/admin/users",
"mode": "entry",
"destination": "/admin/users",
"status": 403
},
{
"pattern": "/admin/users",
"mode": "refresh",
"destination": "/admin/users",
"status": 403
},
{
"pattern": "/admin/system",
"mode": "entry",
"destination": "/admin/system",
"status": 403
},
{
"pattern": "/admin/system",
"mode": "refresh",
"destination": "/admin/system",
"status": 403
},
{
"pattern": "/trash",
"mode": "entry",
"destination": "/trash",
"status": 200
},
{
"pattern": "/trash",
"mode": "refresh",
"destination": "/trash",
"status": 200
},
{
"pattern": "/settings",
"mode": "entry",
"destination": "/settings",
"status": 200
},
{
"pattern": "/settings",
"mode": "refresh",
"destination": "/settings",
"status": 200
},
{
"pattern": "/settings/connected-accounts",
"mode": "entry",
"destination": "/settings/connected-accounts",
"status": 200
},
{
"pattern": "/settings/connected-accounts",
"mode": "refresh",
"destination": "/settings/connected-accounts",
"status": 200
}
]
+3 -1
View File
@@ -8,7 +8,9 @@ The reviewer confirmed overlapping public-page h2 text in full EN/light and NB/d
The initial Reminders and Profile matrix captures were loading-only and cannot qualify their body layouts. The matrix now waits for Reminders' settled region and the seeded Profile username. The reviewer inspected the eight corrected320px EN/NB light/dark originals: actual empty-state/forms were visible, with no clipping/overlap identified. Additional final-width inspection must be recorded when actually performed; do not infer it from screenshot generation alone.
Final frozen review actually re-inspected all33 regenerated sheets (396 first900px thumbnail crops), with no new gross overlap/clipping/blank render identified. Nine final full-page originals were additionally inspected: `/`, `/reminders` and `/profile`, each at320EN/light,768NB/light and1440NB/dark. Those root headings are separated and the two private routes show settled content at all three inspected widths. This supplements the earlier inspections; it does not certify every full-page original or all text readability.
The prior isolated review inspected all 33 regenerated sheets (396 first-900px crops) and nine full-page originals: `/`, `/reminders` and `/profile`, each at 320 EN/light, 768 NB/light and 1440 NB/dark. Overview inspection missed a separate bottom CTA-title overlap; original-detail review then confirmed P9-V02 at `LandingPage.tsx:261`. All 12 old homepage originals were checked at original detail; no other ink collision was confirmed in hero/feature/step/plan/CTA body text. The CTA now has proportional line height; extended native geometry fails both languages before and passes both after over 16 vectors. Earlier results remain retained as superseded, not silently rewritten.
Final `phase9-cta` review actually inspected all 33 latest contact sheets, the same nine latest full-page originals, and native-width bottom-650px CTA crops from all 12 latest homepage originals. The index points to the final `phase9-cta-results` paths. CTA title/body/button remain visibly separated and contained across all 12; Reminders shows settled empty content and Profile reaches its sessions section. No other gross overlap/clipping/blank/loading-only defect was observed in this exact scope. Tall full-page images were scaled layout overviews; this is not blanket readability, human/device/assistive-technology or production acceptance.
Existing ordinary browser fixtures cover populated/empty/loading/error/long-translation states, dialog recovery, dense Jobs/Board, long Career/CV, saved-settings variants and the Dashboard editor. Their exact scope is limited to the executable scenarios; this396-route cross-product is not a cross-product of every state. Intentional grid/document scrollers preserve content; fixed CV paper geometry was not changed to fit the screen.
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 445 KiB

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 431 KiB

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 389 KiB

After

Width:  |  Height:  |  Size: 389 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 KiB

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 KiB

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 KiB

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 KiB

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 KiB

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 464 KiB

After

Width:  |  Height:  |  Size: 464 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 KiB

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 KiB

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 KiB

After

Width:  |  Height:  |  Size: 390 KiB

@@ -429,7 +429,7 @@
],
"lang": "en",
"effectiveTheme": "light",
"domElements": 813,
"domElements": 815,
"englishLeakCandidates": []
},
{
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -2,11 +2,13 @@
**PARTIAL.** Automated findings and finite keyboard/DOM observations do not establish human accessibility acceptance.
The final ordinary suite collected 102 actual browser-zoom observations across 13 named areas at 100/200/400%, using `chrome.tabs.setZoom` with asserted zoom/DPR: [EN/light](zoom-en-light.json), [NB/dark](zoom-nb-dark.json). All recorded root/main horizontal overflow values are zero. Sixteen recorded states still contain controls outside the horizontal viewport before interaction: Jobs pagination, job/document section tabs, CV tabs and a Settings input. The collector's intentional-scroller flag covers only tables/documents/Board cards, so these flags alone establish neither clipping nor keyboard reachability. They remain explicit M09-06 targets; passing this collection test is not human reflow acceptance.
The inherited 64 incomplete axe occurrences are deduplicated in [triage](inherited-axe-triage.json): one aria-hidden drawer-focus occurrence, 48 native size-control background-overlap occurrences, five other obscured-background occurrences and ten invisible zero-badge occurrences. They are not 64 confirmed violations. Hidden zero badges are not applicable in the tested zero-area, aria-hidden state. The inherited Analytics drawer occurrence remains qualified: fresh shared-drawer settled Dashboard tests do not establish the exact original cause or actual reader behaviour. The53 background-contrast cases require contextual painted-colour inspection. New open-modal background incompletes are separately observed tool/state limits; do not conflate them with the inherited drawer node. Keep original occurrences and stable group IDs.
The settled diagnostic suite explicitly inspects zero badges, keyboard-opened drawer focus, Escape return, closed drawer/descendant visibility and 24 Tab presses, plus Dashboard editor controls. Exact final scans and incompletes are in [settled-axe.json](settled-axe.json) when accepted; failed transition observations remain retained in raw traces. No NVDA, VoiceOver, human reader, physical device, forced-colour or actual browser-zoom acceptance is claimed. [Human checklist](MANUAL_CHECKLIST.md) gives exact steps, owners and closure records.
Final `phase9-frozen` evidence is16 scans with0violations and120 incomplete-node occurrences:100`bgOverlap` (contextual colour inspection still required),16`shortTextContent` (the verified invisible zero badge; not applicable in that state) and4`focusable-modal-open` (background root during the active modal, a state/tool limitation; actual reader/modal behaviour remains M09-01/02/05). Counts are repeated occurrences across states, not120 unique defects. The earlier failed NB observations sampled15 visible descendants after root hiding but before Slide exit; the successor polls the complete unchanged settled predicate and then verifies24Tab presses, with no retries/skips or product drawer change.
Final `phase9-cta` evidence is 16 scans with 0 violations and 120 incomplete-node occurrences: 100 `bgOverlap` (contextual colour inspection required), 16 `shortTextContent` (the verified invisible zero badge; not applicable in that state) and four `focusable-modal-open` (background root during the active modal; actual reader/modal behaviour remains M09-01/02/05). These are repeated occurrences, not 120 unique defects. Earlier failed NB observations sampled 15 visible descendants after root hiding but before Slide exit; the successor polls the complete unchanged settled predicate and verifies 24 Tab presses, with no retries/skips or product drawer change.
The dictionary [comparison](localisation.json) found 2,871 English and 2,871 Bokmål keys, no missing/extra keys and no placeholder mismatch. The 49 identical values are candidates reviewed as technical/proper/established terms, not automatic untranslated-copy defects. Dictionary parity alone does not certify grammar, dates, pluralisation or every rendered state.
+64 -64
View File
@@ -788,32 +788,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1b_\" aria-label=\"Size for Today\"><option value=\"standard\">Standard</option><option value=\"full\">Full width</option></select>",
"target": [
"#_r_1b_"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined because it is overlapped by another element"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"contrastRatio": 0,
"fontSize": "10.5pt (14px)",
"fontWeight": "normal",
"messageKey": "bgOverlap",
"expectedContrastRatio": "4.5:1"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element's background color could not be determined because it is overlapped by another element"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1f_\" aria-label=\"Size for Current pipeline\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1f_\" aria-label=\"Size for Today\"><option value=\"standard\">Standard</option><option value=\"full\">Full width</option></select>",
"target": [
"#_r_1f_"
],
@@ -838,7 +813,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1j_\" aria-label=\"Size for Application activity\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1j_\" aria-label=\"Size for Current pipeline\">",
"target": [
"#_r_1j_"
],
@@ -863,7 +838,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1n_\" aria-label=\"Size for Median current-stage age\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1n_\" aria-label=\"Size for Application activity\">",
"target": [
"#_r_1n_"
],
@@ -888,7 +863,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1r_\" aria-label=\"Size for Response sources\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1r_\" aria-label=\"Size for Median current-stage age\">",
"target": [
"#_r_1r_"
],
@@ -913,7 +888,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1v_\" aria-label=\"Size for Salary insights\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1v_\" aria-label=\"Size for Response sources\">",
"target": [
"#_r_1v_"
],
@@ -938,7 +913,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_23_\" aria-label=\"Size for Top companies by activity\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_23_\" aria-label=\"Size for Salary insights\">",
"target": [
"#_r_23_"
],
@@ -963,12 +938,37 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_27_\" aria-label=\"Size for Job tags\"><option value=\"standard\">Standard</option><option value=\"full\">Full width</option></select>",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_27_\" aria-label=\"Size for Top companies by activity\">",
"target": [
"#_r_27_"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined because it is overlapped by another element"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"contrastRatio": 0,
"fontSize": "10.5pt (14px)",
"fontWeight": "normal",
"messageKey": "bgOverlap",
"expectedContrastRatio": "4.5:1"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element's background color could not be determined because it is overlapped by another element"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_2b_\" aria-label=\"Size for Job tags\"><option value=\"standard\">Standard</option><option value=\"full\">Full width</option></select>",
"target": [
"#_r_2b_"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined because it is overlapped by another element"
},
{
"any": [
{
@@ -3794,7 +3794,32 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1f_\" aria-label=\"Størrelse for I dag\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1b_\" aria-label=\"Størrelse for I dag\">",
"target": [
"#_r_1b_"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined because it is overlapped by another element"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"contrastRatio": 0,
"fontSize": "10.5pt (14px)",
"fontWeight": "normal",
"messageKey": "bgOverlap",
"expectedContrastRatio": "4.5:1"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element's background color could not be determined because it is overlapped by another element"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1f_\" aria-label=\"Størrelse for Nåværende statusfordeling\">",
"target": [
"#_r_1f_"
],
@@ -3819,7 +3844,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1j_\" aria-label=\"Størrelse for Nåværende statusfordeling\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1j_\" aria-label=\"Størrelse for Søknadsaktivitet\">",
"target": [
"#_r_1j_"
],
@@ -3844,7 +3869,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1n_\" aria-label=\"Størrelse for Søknadsaktivitet\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1n_\" aria-label=\"Størrelse for Median tid i nåværende fase\">",
"target": [
"#_r_1n_"
],
@@ -3869,7 +3894,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1r_\" aria-label=\"Størrelse for Median tid i nåværende fase\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1r_\" aria-label=\"Størrelse for Svar etter kilde\">",
"target": [
"#_r_1r_"
],
@@ -3894,7 +3919,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1v_\" aria-label=\"Størrelse for Svar etter kilde\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_1v_\" aria-label=\"Størrelse for Lønnsinnsikt\">",
"target": [
"#_r_1v_"
],
@@ -3919,7 +3944,7 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_23_\" aria-label=\"Størrelse for Lønnsinnsikt\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_23_\" aria-label=\"Størrelse for Topp selskaper etter aktivitet\">",
"target": [
"#_r_23_"
],
@@ -3944,37 +3969,12 @@
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_27_\" aria-label=\"Størrelse for Topp selskaper etter aktivitet\">",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_27_\" aria-label=\"Størrelse for Jobbtagger\">",
"target": [
"#_r_27_"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined because it is overlapped by another element"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"contrastRatio": 0,
"fontSize": "10.5pt (14px)",
"fontWeight": "normal",
"messageKey": "bgOverlap",
"expectedContrastRatio": "4.5:1"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element's background color could not be determined because it is overlapped by another element"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<select class=\"MuiNativeSelect-select MuiNativeSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-aef9oy\" aria-invalid=\"false\" id=\"_r_2b_\" aria-label=\"Størrelse for Jobbtagger\">",
"target": [
"#_r_2b_"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined because it is overlapped by another element"
},
{
"any": [
{
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+7 -5
View File
@@ -1,14 +1,16 @@
# P9-05 — Documents, edge cases and finite performance
The final separate Phase9 diagnostic lane completed **18/18**, zero failures/skips/flaky/retries, on the frozen825-input manifest (`phase9-frozen`, exit0 at20:25:16UTC). It includes12 route/theme/locale/width cases, four settled accessibility cases, one RD21 characterization and one bounded workload. **A passing characterization does not qualify the unsafe behavior it records.** The earlier18-case run and the later16pass/2fail transition observation remain superseded raw evidence.
The final separate Phase 9 diagnostic lane completed **18/18**, zero failures/skips/flaky/retries (`phase9-cta`, exit 0 at 03:18:12 UTC on 23 October). It includes 12 route cases, four accessibility cases, one RD21 characterization and one bounded workload. **A passing characterization does not qualify the unsafe behavior it records.** Earlier reports remain retained as superseded evidence.
That diagnostic snapshot is retained as [source-manifest-before-admin-fixture.json](../p9-00/source-manifest-before-admin-fixture.json). The final ordinary-run snapshot changes only the locale-sensitive Admin test locator; [exact delta](../p9-00/admin-fixture-delta.json) proves product/build/diagnostic/core inputs are unchanged. No diagnostic result is claimed to execute an ordinary fixture it does not load.
The earlier diagnostic snapshot is retained as [source-manifest-before-admin-fixture.json](../p9-00/source-manifest-before-admin-fixture.json). The [Admin locator delta](../p9-00/admin-fixture-delta.json) and [provider-worker fixture delta](../p9-00/worker-isolation-delta.json) retain the two subsequent fixture changes. Product/export/core inputs are unchanged; inherited diagnostics rerun after the worker configuration repair.
## Native documents
The final oracle invocation is bound to the completed first ordinary shard by [native-document-provenance.json](evidence/native-document-provenance.json): 93 input hashes include its report/exit, the unchanged oracle, measurements, exported PDFs and preview images. Both oracle commands exited 0; inputs remained stable across execution. Portable result hashes are verified again by the reporting script.
Fresh real preview and native exported PDF bytes from the retained corpus passed **16/16 fixtures /36 pages** under the unchanged oracle: exact page count/membership, physical dimensions ±0.5mm, marker positions ±2mm, font sizes ±0.5pt and original RGB tolerance. Nine defaults, long EN/NB, 8mm Letter, 28mm roomy, grid/bubbles, long sidebar and unbreakable boundary fixtures are included. No renderer geometry or tolerance changed.
[Portable oracle results](evidence/fidelity-results.json) retain all measurements. The final frozen ordinary run's native corpus producer passed; the unchanged oracle again passed16/16 over its fresh36 pages. All36 regenerated page thumbnails were actually inspected in [sheet1](evidence/pdf-sheet-1.png), [sheet2](evidence/pdf-sheet-2.png) and [sheet3](evidence/pdf-sheet-3.png), plus the full-size preview/PDF `unbreakable-and-boundary/comparison-4.png`. Inspection found no visible clipping/overlap/blank output in those views. Several last pages contain little content; that is recorded layout behavior, not missing text according to the marker oracle. Thumbnail/spot inspection is not print/readability, photo/crop, every glyph or intended Linux-font acceptance. Whole-suite completion remains a separate gate.
[Portable oracle results](evidence/fidelity-results.json) retain all measurements. The final isolated ordinary shard's native corpus producer passed; the unchanged oracle passed 16/16 over its fresh 36 pages. All 36 regenerated page thumbnails were inspected in [sheet1](evidence/pdf-sheet-1.png), [sheet2](evidence/pdf-sheet-2.png) and [sheet3](evidence/pdf-sheet-3.png), plus the full-size preview/PDF `unbreakable-and-boundary/comparison-4.png`. The final regenerated sheets are byte-identical to the inspected sheets. No visible clipping/overlap/blank output was found in those views. Several last pages contain little content; that is layout behavior, not missing markers. Thumbnail/spot inspection does not establish print/readability, every photo/glyph or intended Linux-font acceptance. All 362 ordinary cases completed separately.
Existing browser fixtures also cover hidden preview mounting, image-layout readiness, dirty edits, stale CV revisions, preview transport recovery, canonical versus variant overrides, frozen submitted packages/archived binaries and missing optional sections. Their full-suite outcomes belong to final regression. Native PDF admission uses inert child processes and is not added to fidelity counts.
@@ -16,9 +18,9 @@ The separate Settings corpus passed the same unchanged oracle over **8 fixtures
## Sustained local workload
[Raw finite measurements](performance.json): **65.303s**, two paced readers, **240 successful reads**, 250 owned applications, eight Career roles with48 distinct long bullets, and20 native navigations across Dashboard/Table/Board/long CV. The same saved canonical profile and250-job membership remained intact afterward. CV readiness waits for settled pagination and verifies the final bullet's page membership and multiple rendered pages before recording timing.
[Raw finite measurements](performance.json): **63.332 s**, two paced readers, **240 successful reads**, 250 owned applications, eight Career roles with 48 distinct long bullets, and 20 native navigations across Dashboard/Table/Board/long CV. The saved canonical profile and exact 250-job membership remained intact afterward. CV readiness waits for settled pagination and verifies the final bullet's page membership and multiple rendered pages before recording timing.
API latency across these reads: **p50 23ms /p95 76ms /max115ms**. Native ready times in this run: Dashboard1377–1728ms; Table995–1249ms; Board1530–2238ms; long CV2038–2310ms. These include browser boot/auth/render work and automation overhead. The host reports Windows,16 logical CPUs,34,145,554,432 bytes RAM and Chromium151.0.7922.34; API uses isolated SQLite and frontend uses the rebuilt static export. This is a shared development host; final Jest overlapped most diagnostic collection and completed during the sustained case. Timing is not an isolated machine comparison.
API latency: **p50 12 ms /p95 42 ms /max 48 ms**. Native ready ranges: Dashboard 942–977 ms; Table 981–1035 ms; Board 951–966 ms; long CV 1492–1549 ms. These include browser boot/auth/render work and automation overhead. The host reports Windows, 16 logical CPUs, 34,145,554,432 bytes RAM and Chromium 151.0.7922.34; API uses isolated SQLite and frontend uses the rebuilt static export. Jest had finished before this final run. It remains a shared development host, not an isolated machine comparison. Earlier 65.303 s /p95 76 ms and 62.890 s /p95 39 ms checkpoints remain in superseded raw reports and are not combined with these measurements.
CDP CPU/task/heap/DOM metrics are retained for every navigation. They are observations, not leak diagnosis or attributed backend resource profiling. Two paced readers for a minute do not establish capacity/SLA, sustained drag frames, physical mobile performance, long-term memory stability, MariaDB/Linux behavior or real model inference throughput. No production load was generated.
@@ -0,0 +1,124 @@
{
"finishedUtc": "2026-10-23T05:22:45.212753+00:00",
"inputs": {
".artifacts/phase9/fidelity/compact-8mm-letter/export.pdf": "9863862e0025760097843a87a7b99d5c474d89927bba70aa0abd89cc9271d71b",
".artifacts/phase9/fidelity/compact-8mm-letter/preview-1.png": "4526b6f7f24cb0927dd93f845f629d566a24ead24a02154a604b4e353469197f",
".artifacts/phase9/fidelity/compact-8mm-letter/preview-2.png": "e865e133b17470eb85d19ef2fc76f472a07dd4d335ae0f8bdd2b6d6a65df648a",
".artifacts/phase9/fidelity/compact-8mm-letter/preview-3.png": "0bdebad4180919a3b32f554446c4e790dae6412e48edc4325435aa6a733b15e6",
".artifacts/phase9/fidelity/compact-8mm-letter/preview-4.png": "bcfc29f4911b1b0f4515cbc5eaeb7e67aa2d969d586280a2771b458f3940929b",
".artifacts/phase9/fidelity/default-ats-classic/export.pdf": "9b02c484d7f9db4ca143f40e50774fabd29d6d6828f6b6ce91219f647ad9fe60",
".artifacts/phase9/fidelity/default-ats-classic/preview-1.png": "9f6778b86e5e1db00caa55ecdc83e7f4bcc91a52643e7a9b45f4ff890d56d2c8",
".artifacts/phase9/fidelity/default-code/export.pdf": "ac98b2cf5afae40a5a76dee0a2db57f1e65870a16ac019eeed3bffe46b34707b",
".artifacts/phase9/fidelity/default-code/preview-1.png": "f9b9462be97a1a77e981234801a1dd415df28084d66b5b6d81288a923b15186e",
".artifacts/phase9/fidelity/default-creative/export.pdf": "84b718fd9806f6d8dbf1905845bfb97106c82fec13502ecb94e959a8f6365b37",
".artifacts/phase9/fidelity/default-creative/preview-1.png": "c34ed3549434fd2d3f1f5f98a1109ee19a10f6d3cd6833437b204a98659e92d8",
".artifacts/phase9/fidelity/default-elegant/export.pdf": "3b4fe50da4b3b5fb98351c25fa7682e5571ed23ae3e5a3c77f721265879bc916",
".artifacts/phase9/fidelity/default-elegant/preview-1.png": "ce10ae9f14e864208e755e59ed190c6dbd906d60e5d260f31e49be652c937365",
".artifacts/phase9/fidelity/default-executive/export.pdf": "01e8955aefdddf13dbadbd9daa599bdc23c66ffe00e11db141ba857c9a819371",
".artifacts/phase9/fidelity/default-executive/preview-1.png": "82601391cb873bdd385ed8c0ecb3fc4c5e472b5a2825f25c42a7619ff3476055",
".artifacts/phase9/fidelity/default-minimal/export.pdf": "f9146883edf1b8a265e454ca35a946269c5f808543601329bb8210022d34141d",
".artifacts/phase9/fidelity/default-minimal/preview-1.png": "f53d2da2c35edb1d0ef8650bf2469acfb945e7df1da86aa9fb3736bb6f6fd913",
".artifacts/phase9/fidelity/default-modern/export.pdf": "87f2447bf85e6202dbdb9f7509375142cf7eea3fbeec69a57195324bdcf84b35",
".artifacts/phase9/fidelity/default-modern/preview-1.png": "9544d0ca85773be277afa35bd9d61de31614975999a667904e162d7ed9829043",
".artifacts/phase9/fidelity/default-nordic/export.pdf": "b872fef34426bf1817a9c60f43d3c2a797d11877e443880f81e7b20acfc8f70e",
".artifacts/phase9/fidelity/default-nordic/preview-1.png": "fe04a7ee9161b705a23077f9aa986b715ad6faa22c564fda222780f26edbf87c",
".artifacts/phase9/fidelity/default-technical/export.pdf": "b8f142b1ca6a7f8f9283f8db17d522d657436e81f1a55cf9773e8a38d87ef137",
".artifacts/phase9/fidelity/default-technical/preview-1.png": "c0f71784ebab7303636c33f01a96dfd308ac49a0095054162ece1d67e8fd636a",
".artifacts/phase9/fidelity/grid-and-bubbles/export.pdf": "520fcad9433ec5a34d6212b12a03c3bf8052ebd73aab65c1442b594242dbe60e",
".artifacts/phase9/fidelity/grid-and-bubbles/preview-1.png": "4e8df81ce5afcd8a8e71898bbf4c5badc3b8a97a8474bfcfd3baa344ea3a7914",
".artifacts/phase9/fidelity/long-en-minimal/export.pdf": "029390ff235eda6a4ba1981aadb6a8b46851df005c61722eff23cb3c12039be4",
".artifacts/phase9/fidelity/long-en-minimal/preview-1.png": "b8e29a06b18a7de4476c906f84de8c2bb4067b4a7454d670a03b88074226aa46",
".artifacts/phase9/fidelity/long-en-minimal/preview-2.png": "fd034cc3aaa8da8ce229f80cc9755cd06341d0db05ab5859f005b73628a64e2d",
".artifacts/phase9/fidelity/long-en-minimal/preview-3.png": "0ccae375bbd5434492f05ee90ab1e8c2446d7ba8f5d940695d51368790607cb1",
".artifacts/phase9/fidelity/long-en-minimal/preview-4.png": "27563b5f2517618c942ecdf79d9474b87abc431e3ecbc6303160424f89e93330",
".artifacts/phase9/fidelity/long-nb-code/export.pdf": "63c4ffd7361d5a7b99741309cf2ca049030bb34451c86e4485fc8bd3c9dd2643",
".artifacts/phase9/fidelity/long-nb-code/preview-1.png": "ac3297137d46dc624400c9e937b0a89d291a148de1fcedc31029a60f734abcf3",
".artifacts/phase9/fidelity/long-nb-code/preview-2.png": "723645731d2056dfd3fa1e7ec50017d8ceadf501b83f30d7768f48479ba643be",
".artifacts/phase9/fidelity/long-nb-code/preview-3.png": "109ff8fc9ab61e7e6bf2149e1f7bc5c96b41674004bb107ed0192906696cb677",
".artifacts/phase9/fidelity/long-nb-code/preview-4.png": "ddc8aa95c196c1cab571f950dc524be1bd5f189621116609c3cb5a26bb2dc4f9",
".artifacts/phase9/fidelity/long-sidebar-nb/export.pdf": "b0714ab2f18db5952d6ce087371af0e9d65d3552b18ce1f372d3e0a1cb766c48",
".artifacts/phase9/fidelity/long-sidebar-nb/preview-1.png": "f74562d6bbf67c7f56636e379d8baf475bbda2e2a02f10528ab10db9d0b175a7",
".artifacts/phase9/fidelity/long-sidebar-nb/preview-2.png": "a41ad5a61c45164aaa64c16f35c2692f8830121280adbad02a12420356eeaef6",
".artifacts/phase9/fidelity/long-sidebar-nb/preview-3.png": "c3a7da98ae5a81f5cf5e199b8f04ce87afa7d0dad45387941989c43972333c77",
".artifacts/phase9/fidelity/long-sidebar-nb/preview-4.png": "78bf331f6b61755906a8441cbe4dcb01cc122cd7c8054e024d836e4319e5924c",
".artifacts/phase9/fidelity/long-sidebar-nb/preview-5.png": "1ed22b2b5d115a75c9bd0dd4afe6064d54d6a8848b091edacdc1014e0bd0a8d0",
".artifacts/phase9/fidelity/measurements.json": "312ecc12f0d6c81ad7ac5709a4e6ce2c6736142b13b01ae62d87451e5e089f9c",
".artifacts/phase9/fidelity/roomy-28mm-nb/export.pdf": "1bb4c5a0d8c21653f5e7a52ec7fed399b9cfd5c86f59f9e7fbb2178766bdcb17",
".artifacts/phase9/fidelity/roomy-28mm-nb/preview-1.png": "1bec40fd7a5f4d65105772cab3c33a8387890c99adc477f228db4ec1bf5c07a7",
".artifacts/phase9/fidelity/roomy-28mm-nb/preview-2.png": "75f9177577851a90993429231bed94061b8a18d406bf1ebfc0231a0f0d814aa4",
".artifacts/phase9/fidelity/roomy-28mm-nb/preview-3.png": "94bba146ad3794d202e1e590f55ef881523ee37f704c29aaa36d24bdfbaa7902",
".artifacts/phase9/fidelity/roomy-28mm-nb/preview-4.png": "a4cb07e5f5964e8f356cf71314111c5e478535505dff8451dddcafabf2dd1de2",
".artifacts/phase9/fidelity/roomy-28mm-nb/preview-5.png": "308685d178725e49b4be78acf7cfd5ed02f33e689dd0a0316e5ecc40fc7ebff5",
".artifacts/phase9/fidelity/unbreakable-and-boundary/export.pdf": "d1db584b703fec642f2e771917dd58bcb98e30a28ad275030b1ea39227c2f069",
".artifacts/phase9/fidelity/unbreakable-and-boundary/preview-1.png": "161cd02aaf92943dbff14930f35de26ccc983569b24d87b264761cb9ad3a6c21",
".artifacts/phase9/fidelity/unbreakable-and-boundary/preview-2.png": "c55281f95c5f039b30e232b146ed67254a60d35e6dce864a51533effe132b619",
".artifacts/phase9/fidelity/unbreakable-and-boundary/preview-3.png": "f483f4f87cb811d84345f871c745efe598603b2543dde80633e7c7d298436d4d",
".artifacts/phase9/fidelity/unbreakable-and-boundary/preview-4.png": "7509f2c3cbc459f1d98be5210a63c1c83adb8ca9098df7a3869eefdee08d33bf",
".artifacts/phase9/ordinary-cta-shard-1-exit.json": "128e069d62df7a243669889ed40ac6c412611a2be30d607c22fa7dae641cdff9",
".artifacts/phase9/ordinary-cta-shard-1.json": "837c58100e80c74674be5b0d763c354f148fb052a761cb0b0c5fbb3bff7e8754",
".artifacts/phase9/settings-fidelity/dark-en-after/export.pdf": "69a1da73b07c59f53cf8809e61082fa8d78cdb6f06511a928a5d7b8ae3c8bd4b",
".artifacts/phase9/settings-fidelity/dark-en-after/preview-1.png": "dfa55cc028f07b9e459947df43339eb5f175b4c539caf543fc3a91a1b7fa0340",
".artifacts/phase9/settings-fidelity/dark-en-after/preview-2.png": "b31ea6ac52444446643bb4fe8cc79d13df62495d731f3036db65028c62eb7dda",
".artifacts/phase9/settings-fidelity/dark-en-after/preview-3.png": "9ae93f15c84a78b6d02e7b55b95072a02c614219d2f53c88c38411657d370933",
".artifacts/phase9/settings-fidelity/dark-en-before/export.pdf": "11650463d93123a7eb3a8408503011565bde7fd256c742eb2bf58fdf677ef49f",
".artifacts/phase9/settings-fidelity/dark-en-before/preview-1.png": "64e5f6f5c0f974682fae0345e5db154638e00f492dfbac842bf9cdef811881e2",
".artifacts/phase9/settings-fidelity/dark-en-before/preview-2.png": "c600a25b013ab109ed922951f7d0a3cfd76473320e7cca66e91c21cd20fd33b5",
".artifacts/phase9/settings-fidelity/dark-en-before/preview-3.png": "f95618f08261a7a9a2b606c0ee0fa2300ab3d1a008fc69afe03fcda9f590c70f",
".artifacts/phase9/settings-fidelity/dark-en-measurements.json": "629a8007a4f8790c48b3f647a2d1ca38a47c5e7f9ebb0f2a361fc6378826fef8",
".artifacts/phase9/settings-fidelity/dark-nb-after/export.pdf": "e824b17548fa8e28ece4a3fed9d8e6ab88fb12b550058a123b3d9af0599ab9d4",
".artifacts/phase9/settings-fidelity/dark-nb-after/preview-1.png": "a67350056d41344ea0d5af214f153a8114f5c1f9877d3a1e11ff3c68c299be50",
".artifacts/phase9/settings-fidelity/dark-nb-after/preview-2.png": "f83f366b422966b88b4d77e61db71af1cf80539026b89df07a08708b48fe9212",
".artifacts/phase9/settings-fidelity/dark-nb-after/preview-3.png": "273feb28374258ef33fd63b90968b4888f405a8e73513b3bf8360414b436c09a",
".artifacts/phase9/settings-fidelity/dark-nb-before/export.pdf": "01d5fc31b5c459b20aadbdb95fc02ff90a805f2b552e14b51e89f3722921ef70",
".artifacts/phase9/settings-fidelity/dark-nb-before/preview-1.png": "ec9d3f8434bbda759faba9203e6ba53c443f555c98d16a8f6a92b84eaa900cb2",
".artifacts/phase9/settings-fidelity/dark-nb-before/preview-2.png": "5a2435578d25852ec24da607a2c85ed7c3233d30cfc3f5f7e035753b64252797",
".artifacts/phase9/settings-fidelity/dark-nb-before/preview-3.png": "512420e7a00329c7fdc871ffa63f46acb4f0c3399bae2a0ea3ce28f5a707f36e",
".artifacts/phase9/settings-fidelity/dark-nb-measurements.json": "02e9b46e776b5af3e433a34ded2c2320bde29c88c74972370ca77e9f7111e617",
".artifacts/phase9/settings-fidelity/light-en-after/export.pdf": "1891292e70444c79443b8629a4e27124a2e5e941644e0201c32f933dbf9c1b05",
".artifacts/phase9/settings-fidelity/light-en-after/preview-1.png": "dfa55cc028f07b9e459947df43339eb5f175b4c539caf543fc3a91a1b7fa0340",
".artifacts/phase9/settings-fidelity/light-en-after/preview-2.png": "b31ea6ac52444446643bb4fe8cc79d13df62495d731f3036db65028c62eb7dda",
".artifacts/phase9/settings-fidelity/light-en-after/preview-3.png": "9ae93f15c84a78b6d02e7b55b95072a02c614219d2f53c88c38411657d370933",
".artifacts/phase9/settings-fidelity/light-en-before/export.pdf": "65bd72ad1692c2bf91a4fa3d7c7edc8d6fe932d77f5e7f30ebfc0de2a92cde87",
".artifacts/phase9/settings-fidelity/light-en-before/preview-1.png": "64e5f6f5c0f974682fae0345e5db154638e00f492dfbac842bf9cdef811881e2",
".artifacts/phase9/settings-fidelity/light-en-before/preview-2.png": "c600a25b013ab109ed922951f7d0a3cfd76473320e7cca66e91c21cd20fd33b5",
".artifacts/phase9/settings-fidelity/light-en-before/preview-3.png": "f95618f08261a7a9a2b606c0ee0fa2300ab3d1a008fc69afe03fcda9f590c70f",
".artifacts/phase9/settings-fidelity/light-en-measurements.json": "f561cc1f8b15911c9a44897aa22d5f35c12cf3ac9c9781356136b55362d386e9",
".artifacts/phase9/settings-fidelity/light-nb-after/export.pdf": "64b9da87a32913b4578fc363e9537c7b3323eaecdc7a2a32216dff9b85427fb8",
".artifacts/phase9/settings-fidelity/light-nb-after/preview-1.png": "a67350056d41344ea0d5af214f153a8114f5c1f9877d3a1e11ff3c68c299be50",
".artifacts/phase9/settings-fidelity/light-nb-after/preview-2.png": "f83f366b422966b88b4d77e61db71af1cf80539026b89df07a08708b48fe9212",
".artifacts/phase9/settings-fidelity/light-nb-after/preview-3.png": "273feb28374258ef33fd63b90968b4888f405a8e73513b3bf8360414b436c09a",
".artifacts/phase9/settings-fidelity/light-nb-before/export.pdf": "e70a89c8ca750969f7c70ce11c98bd6a73c798e712e9d2c5f0fcb895a2d3f9c8",
".artifacts/phase9/settings-fidelity/light-nb-before/preview-1.png": "ec9d3f8434bbda759faba9203e6ba53c443f555c98d16a8f6a92b84eaa900cb2",
".artifacts/phase9/settings-fidelity/light-nb-before/preview-2.png": "5a2435578d25852ec24da607a2c85ed7c3233d30cfc3f5f7e035753b64252797",
".artifacts/phase9/settings-fidelity/light-nb-before/preview-3.png": "512420e7a00329c7fdc871ffa63f46acb4f0c3399bae2a0ea3ce28f5a707f36e",
".artifacts/phase9/settings-fidelity/light-nb-measurements.json": "610d66aa21e804a04a467dd949651f5d8211cd2085c7e6e64bf2397b4b469313",
".artifacts/phase9/settings-fidelity/measurements.json": "bab9d3845e1ad29058e21ab25724c9bbe6a2057006af42b148aa721e767b2506",
"scripts/verify-cv-fidelity.py": "64f82e622cc11483c33307d987e969f6cf27f82ab6bdbd72c2aeb1bfbceade87"
},
"outputs": {
"docs/redesign/phase-9/p9-05/evidence/fidelity-results.json": "98abd84d63708f1c632e29c8b8d37e1083811979365162ffea2e4e1bf48ea373",
"docs/redesign/phase-9/p9-05/evidence/settings-fidelity-results.json": "baf25ba3f32119734b6aacf541648df6d74474274346b7f8d5db256cd0bdbcd9"
},
"commands": [
{
"command": [
"rtk",
"proxy",
"C:\\Users\\Connor\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\python\\python.exe",
"scripts/verify-cv-fidelity.py",
"E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase9\\fidelity"
],
"exitCode": 0
},
{
"command": [
"rtk",
"proxy",
"C:\\Users\\Connor\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\python\\python.exe",
"scripts/verify-cv-fidelity.py",
"E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase9\\settings-fidelity"
],
"exitCode": 0
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -2,7 +2,7 @@
Status is evidence-specific. Historic acceptance records remain unchanged. A passing characterization of a known limitation does not make the limitation safe.
**P9-V02: Medium visual defect, focused repair verified; full successor pending.** Original-detail inspection after the first complete regression found a separate bottom CTA title at `LandingPage.tsx:261`: 24/30px font inherited body1's fixed 18px line height. The extended native test retains all four h2 checks and also requires the translated CTA title; both EN/NB fail before the repair (`landing-cta-red`, exit 1). The CTA owner now specifies proportional 1.4 line height. Types/lint/build pass, native geometry passes 2/2 across 16 vectors, and original-width crops of all four EN/NB light/dark 320px green images show separated CTA lines with contained body/button/footer. All 12 old homepage originals were checked at original detail; no other ink collision was confirmed. Full rebuilt-source Jest/browser/diagnostic/contract successors remain required. Earlier 362/18/23 passes are superseded for the changed UI; backend and sidecar bytes are unchanged. [Exact source/export delta](../p9-00/cta-delta.json) retains identities.
**P9-V02: Medium visual defect, resolved in the final rebuilt-source regression.** Original-detail inspection after the first complete regression found a separate bottom CTA title at `LandingPage.tsx:261`: 24/30px font inherited body1's fixed 18px line height. The extended native test retains all four h2 checks and also requires the translated CTA title; both EN/NB fail before the repair (`landing-cta-red`, exit 1). The CTA owner now specifies proportional 1.4 line height. Types/lint/build pass, native geometry passes 2/2 across 16 vectors, and original-width crops of all four EN/NB light/dark 320px green images show separated CTA lines with contained body/button/footer. All 12 old homepage originals were checked at original detail; no other ink collision was confirmed. Full rebuilt-source Jest 919/104 suites, ordinary 362/362, diagnostics 18/18 and contracts 23/23 passed with successful exits and strict reconciliation. Earlier 362/18/23 passes are superseded for the changed UI; backend and sidecar bytes are unchanged. [Exact source/export delta](../p9-00/cta-delta.json) retains identities.
**P9-T03: test isolation failure (High for qualification integrity).** The original browser API fixture inherited `SavedJobSearchAlertsEnabled=true`. Its browser interception could not block server-originated provider traffic. The third shard completed with 87 passes/1 failure: the responsive discovery test's active saved search acquired `lastRunAtUtc=2026-10-23T01:04:07.2042193+00:00` instead of remaining null. The enabled worker starts after 30 seconds and its real NAV search completes before writing that timestamp. This establishes that the original fixture did not provide the intended local-only provider boundary; it is not a product regression or live-provider acceptance. Synthetic accounts/searches were used. No payload/header/token capture or further external investigation was performed.
+17
View File
@@ -0,0 +1,17 @@
# P9-06 remediation and regression
Final latest-source regression completed **362/362 ordinary, 18/18 diagnostics, 3/3 volume and 23/23 contracts**, with successful exits, strict reconciliation and zero failures/skips/flakiness/retries or run-level errors. Full Jest passes 919/104 suites; types/lint/build pass. P9-V02 was repaired and all UI-dependent gates repeated on its rebuilt bytes. [Validation](../validation.json) and [defects](DEFECTS.md) retain earlier failures and superseded complete runs; no incomplete successor is accepted.
P9-T03 exposed server-originated NAV work outside the original browser-only interception boundary. The browser fixture now disables the existing saved-search alert worker; all four ordinary shards and inherited diagnostics passed with unchanged assertions. The earlier 98/98 and 87/87 shards and third shard's 87 pass/1 fail remain superseded. Production worker settings are unchanged. [Worker-isolation delta](../p9-00/worker-isolation-delta.json) records the configuration-only change and source identities.
Two bounded product repairs were made: the sole AdminUsers grid now receives the installed Bokmål vendor locale, and the existing four public h2 styles specify a proportional line height. No backend contract, schema, renderer, dependency, state/router system or inference configuration changed. The parser descendant test synchronizes its own startup before the unchanged deadline; it does not change the parser product timeout or process-kill behavior.
The existing native Admin test also needed its hard-coded English pager locator synchronized with the new vendor locale. It now obtains the accessible name from installed enUS/nbNO. Original long-identity, actual page-change, focus/reachability and no-write assertions remain. The failed97pass/1fail shard and focused six-vector1/1 green are retained; the complete98-case successor is required. Only that ordinary test file differs between the retained earlier825-input manifest and the new ordinary manifest.
New regression proof includes two parameterized Admin locale Jest cases (baseline917 becomes919), two ordinary landing cases over16 geometry vectors (baseline360 becomes362),18 separate route/accessibility/RD21/performance diagnostics, and three separately isolated native API volume cases. Existing focused landing tests remain unchanged. Original RED observations, insufficient1.2 spacing, fixture mistakes, transition timing and interrupted attempts remain retained in [DEFECTS](DEFECTS.md) and raw reports; no configured retry/skip or assertion relaxation replaced them.
The final ordinary protocol uses four **serial native Playwright shards**, keeping connected files together under fullyParallel=false. All four completed reports must have exit0; their362 unique IDs must exactly equal native discovery, with one actual passed result each, zero failures/skips/flakiness/retries and no run-level errors. Discovery-only not-run records are not counted as regression skips. The same825 selected source/build inputs are checked before each shard and after all contracts; supplementary volume sources are hashed separately. This changes result checkpointing after repeated runner interruption, preserving all original assertions and workflows.
Separate AI/auth/rate/ingress/PDF-admission/preferences lanes retain their original configs and assertions. Native PDF admission is an inert-child limit contract, distinct from actual CV fidelity. SQLite/test-host, scoped intercepted recovery, native API persistence, image inspection and human/provider acceptance remain labelled separately. Passing the characterization of High RD21 does not close data-loss safety.
Read-only AI review examined both product repairs, parser fixture synchronization, diagnostic readiness, final route images, supplementary isolation/content assertions and reporting gates. Findings led to localised mobile-preview selection, actual theme checks, settled pagination/drawer checks, ready Profile/Reminders captures, exact timeline content comparison and complete diagnostic/discovery gates. [Final acceptance](../p9-07/FINAL_ACCEPTANCE.md) records decisions and uncompleted gates; no review is described as human or production acceptance.
+41
View File
@@ -0,0 +1,41 @@
[
{
"id": "8c0c9ecd34e57cee381c-1dea0c2574f64b68b116",
"project": "",
"file": "cv-ai-readiness.spec.ts",
"title": "bound CV proposals use real owned saves and reject fabricated or stale output without source/history mutation",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 1283,
"errors": [],
"attachments": [
{
"name": "synthetic-provider-contract-calls",
"contentType": "application/json",
"bytes": 8638,
"sha256": "4272f7694531b4c08796faefc247722e1a2ee2a07750a004233b1eb738d13249"
}
]
}
]
},
{
"id": "8c0c9ecd34e57cee381c-c2d35f5e57184c5e7786",
"project": "",
"file": "cv-ai-readiness.spec.ts",
"title": "Production withholds CV review before provider calls or content writes while existing AI remains available",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 686,
"errors": [],
"attachments": []
}
]
}
]
@@ -0,0 +1,41 @@
[
{
"id": "d7599fc2c2391460bfd0-9d7d9f44d8dd91087b94",
"project": "chromium",
"file": "auth-recovery.spec.ts",
"title": "[PRES-E02] incomplete recovery links explain the problem without submitting tokens",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 8134,
"errors": [],
"attachments": []
}
]
},
{
"id": "d7599fc2c2391460bfd0-d746f9d614c710b3f0f7",
"project": "chromium",
"file": "auth-recovery.spec.ts",
"title": "[PRES-E02 PRES-E05 PRES-E09] real registration, SMTP verification and password recovery preserve protected return and revoke the old session",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 4795,
"errors": [],
"attachments": [
{
"name": "verified-recovery-complete",
"contentType": "image/png",
"bytes": 58743,
"sha256": "3f3fe80aa1114e533423e734cde8ee731b7e50b2dcc2232ba5507e648d685d43"
}
]
}
]
}
]
@@ -0,0 +1,98 @@
[
{
"id": "ed69554c53210704c98c-aa6114ab653335b0849c",
"project": "",
"file": "production.spec.ts",
"title": "unsafe production CORS overrides fail before the API starts listening",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 316,
"errors": [],
"attachments": []
}
]
},
{
"id": "ed69554c53210704c98c-b5aa0dee57975d249ef8",
"project": "",
"file": "production.spec.ts",
"title": "production CORS defaults to the canonical origin, never localhost or arbitrary origins",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 54,
"errors": [],
"attachments": []
}
]
},
{
"id": "ed69554c53210704c98c-f08f9970acd7897ea78b",
"project": "",
"file": "production.spec.ts",
"title": "forwarded host cannot replace Host and internal liveness does not expose other routes",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 19,
"errors": [],
"attachments": []
}
]
},
{
"id": "ed69554c53210704c98c-a22e20df1ecd17804b5c",
"project": "",
"file": "production.spec.ts",
"title": "forged forwarding scheme cannot downgrade canonical HTTPS cookie security",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 19,
"errors": [],
"attachments": []
}
]
},
{
"id": "ed69554c53210704c98c-1cbee69d1531ff47c6ff",
"project": "",
"file": "production.spec.ts",
"title": "untrusted direct source cannot reset its IP allowance using IP, scheme or host forwarding",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 68,
"errors": [],
"attachments": []
}
]
},
{
"id": "ed69554c53210704c98c-3f2473964eebe1793601",
"project": "",
"file": "production.spec.ts",
"title": "trusted proxy gives two real clients independent IP allowances and ignores leftmost extra hops",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 30,
"errors": [],
"attachments": []
}
]
}
]
@@ -0,0 +1,25 @@
[
{
"id": "57651d46c5b669da1368-ce86a9d6459ea6ed64a0",
"project": "",
"file": "admission.spec.ts",
"title": "authenticated bursts across variant, job and public routes share actual render capacity and recover",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 1825,
"errors": [],
"attachments": [
{
"name": "bounded-admission-observations",
"contentType": "application/json",
"bytes": 183,
"sha256": "aef6250c4f3779a00826e9d50959e80a8e4af63bc6adf77a48c04c94be7a0de0"
}
]
}
]
}
]
@@ -0,0 +1,155 @@
[
{
"id": "14778efd97370ce75a77-800209363045a0fecbb1",
"project": "chromium",
"file": "preferences.spec.ts",
"title": "[P5-15-01 diagnostic] an unsaved Rules draft survives switching to Notifications and back",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 1835,
"errors": [],
"attachments": [
{
"name": "unsaved-rule-tab-retention",
"contentType": "application/json",
"bytes": 95,
"sha256": "fec5c1c4c27d82d0b94fea7003a101df101fbbe3ed5b97242feee92729f0c68b"
}
]
}
]
},
{
"id": "14778efd97370ce75a77-3886d34583c00e75099c",
"project": "chromium",
"file": "preferences.spec.ts",
"title": "[P5-15-01 diagnostic] native language and notification saves persist during concurrent report reads",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 9425,
"errors": [],
"attachments": [
{
"name": "preference-round-1",
"contentType": "application/json",
"bytes": 679,
"sha256": "476ad3e78c2c7ef74a3bf4e022fb218039e76600882d56d255f92c4acef12eda"
},
{
"name": "preference-round-2",
"contentType": "application/json",
"bytes": 668,
"sha256": "42b0dbfa0477e9341a496a7f243f870ca308d6c86439325b67d2b08aa32151af"
},
{
"name": "preference-round-3",
"contentType": "application/json",
"bytes": 679,
"sha256": "476ad3e78c2c7ef74a3bf4e022fb218039e76600882d56d255f92c4acef12eda"
},
{
"name": "preference-round-4",
"contentType": "application/json",
"bytes": 668,
"sha256": "42b0dbfa0477e9341a496a7f243f870ca308d6c86439325b67d2b08aa32151af"
},
{
"name": "preference-round-5",
"contentType": "application/json",
"bytes": 679,
"sha256": "476ad3e78c2c7ef74a3bf4e022fb218039e76600882d56d255f92c4acef12eda"
},
{
"name": "preference-round-6",
"contentType": "application/json",
"bytes": 668,
"sha256": "42b0dbfa0477e9341a496a7f243f870ca308d6c86439325b67d2b08aa32151af"
},
{
"name": "preference-round-7",
"contentType": "application/json",
"bytes": 679,
"sha256": "476ad3e78c2c7ef74a3bf4e022fb218039e76600882d56d255f92c4acef12eda"
},
{
"name": "preference-round-8",
"contentType": "application/json",
"bytes": 668,
"sha256": "42b0dbfa0477e9341a496a7f243f870ca308d6c86439325b67d2b08aa32151af"
},
{
"name": "preference-round-9",
"contentType": "application/json",
"bytes": 679,
"sha256": "476ad3e78c2c7ef74a3bf4e022fb218039e76600882d56d255f92c4acef12eda"
},
{
"name": "preference-round-10",
"contentType": "application/json",
"bytes": 668,
"sha256": "42b0dbfa0477e9341a496a7f243f870ca308d6c86439325b67d2b08aa32151af"
},
{
"name": "preference-round-11",
"contentType": "application/json",
"bytes": 679,
"sha256": "476ad3e78c2c7ef74a3bf4e022fb218039e76600882d56d255f92c4acef12eda"
},
{
"name": "preference-round-12",
"contentType": "application/json",
"bytes": 668,
"sha256": "42b0dbfa0477e9341a496a7f243f870ca308d6c86439325b67d2b08aa32151af"
},
{
"name": "native-preference-concurrency",
"contentType": "application/json",
"bytes": 8948,
"sha256": "0f998f18a4cda0f4631fd98284ae324fad3cb755fc349fb0b30fb4b5ba2e8486"
}
]
}
]
},
{
"id": "14778efd97370ce75a77-e7315ff91caea6ab494f",
"project": "chromium",
"file": "preferences.spec.ts",
"title": "[P5-15-04 PRES-J07 J05] native full-result Board retains membership at 200 and 1000 owned jobs",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 11426,
"errors": [],
"attachments": [
{
"name": "board-200-native-membership",
"contentType": "application/json",
"bytes": 83,
"sha256": "8290fd60d7f731bd334499528b730b44665e2470ad4af7585f3ac18ffd5a509e"
},
{
"name": "board-1000-native-membership",
"contentType": "application/json",
"bytes": 86,
"sha256": "3cf751d7ac4e6fdd70fd5d8060ea893b639be9854545d2ad680207f93e083bde"
},
{
"name": "board-full-result-scaling",
"contentType": "application/json",
"bytes": 341,
"sha256": "38daa07d10e4e4b5d4b72af37fb2719429bbbb516a50120e84f27512a262eb79"
}
]
}
]
}
]
+167
View File
@@ -0,0 +1,167 @@
[
{
"id": "8603831629f4016ade15-413cabef86db688c278c",
"project": "",
"file": "isolation.spec.ts",
"title": "A exhausting account exports does not throttle the other account on the same IP",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 1004,
"errors": [],
"attachments": [
{
"name": "shared-ip-observations",
"contentType": "application/json",
"bytes": 97,
"sha256": "86f18a98252d8729d284e256c7866f691142a4499c63c219b29862801d7abf2b"
}
]
}
]
},
{
"id": "8603831629f4016ade15-6e8127441d833b255ecf",
"project": "",
"file": "isolation.spec.ts",
"title": "B exhausting account exports does not throttle the other account on the same IP",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 429,
"errors": [],
"attachments": [
{
"name": "shared-ip-observations",
"contentType": "application/json",
"bytes": 97,
"sha256": "21ec24c560fef21dc2db56fd0379bbf9bca456afaab87331a434ea5bf9deb7fe"
}
]
}
]
},
{
"id": "8603831629f4016ade15-44049b89f2ba8cc90dba",
"project": "",
"file": "isolation.spec.ts",
"title": "concurrent accounts share an IP while sessions, bearer/cookie and changed IPs share each owner's allowance",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 518,
"errors": [],
"attachments": [
{
"name": "concurrent-session-observations",
"contentType": "application/json",
"bytes": 169,
"sha256": "f33ee7fd2efc820e35e7b330f8f25c72bc270f6052f10e1eb58000a0e0044aa3"
}
]
}
]
},
{
"id": "8603831629f4016ade15-3c3251aa8da3c416b606",
"project": "",
"file": "isolation.spec.ts",
"title": "crafted body/query/headers and B02 context cannot select the email-send owner",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 388,
"errors": [],
"attachments": []
}
]
},
{
"id": "8603831629f4016ade15-ac269e0e7d56b610a971",
"project": "",
"file": "isolation.spec.ts",
"title": "export and disabled deletion consume the same account-data policy without affecting another account",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 369,
"errors": [],
"attachments": []
}
]
},
{
"id": "8603831629f4016ade15-97ade2f9efed92c59d4c",
"project": "",
"file": "isolation.spec.ts",
"title": "invalid credentials are rejected before account partitioning and cannot select anonymous login partitions",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 565,
"errors": [],
"attachments": []
}
]
},
{
"id": "8603831629f4016ade15-b138c1b57d0d85148feb",
"project": "",
"file": "isolation.spec.ts",
"title": "login/security policies remain IP based for authenticated and anonymous requests",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 362,
"errors": [],
"attachments": []
}
]
},
{
"id": "8603831629f4016ade15-9143f2e1b30e6be99490",
"project": "",
"file": "isolation.spec.ts",
"title": "public PDF remains IP plus slug scoped even after authentication",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 317,
"errors": [],
"attachments": []
}
]
},
{
"id": "8603831629f4016ade15-dcf8adf118fda6bb2506",
"project": "",
"file": "isolation.spec.ts",
"title": "untrusted direct peers cannot evade IP limits with forged forwarding headers",
"status": "expected",
"results": [
{
"status": "passed",
"retry": 0,
"durationMs": 19,
"errors": [],
"attachments": []
}
]
}
]
@@ -0,0 +1,71 @@
# Phase 9 acceptance — 23 October 2026
**P9-00–07 assessment completed. All required automated gates passed on the final rebuilt source; application acceptance remains NO-GO for the unresolved qualifications below.**
The assessment recommends **Phase 9 NO-GO, Phase 10 readiness NO-GO and production NO-GO**. The critical distinction is between completing the QA assessment and proving the application safe: two independently authenticated local clients reproduced acknowledged-edit loss in canonical Career and generic job saves (RD21). Passing CV/Dashboard revision tests do not protect those other domains. A passing RD21 characterization records unsafe behavior; it is not a safety pass.
| Independent decision | Reason / required closure |
|---|---|
| Phase 9 QA: **NO-GO** | High RD21 data loss remains unresolved. Human accessibility, intended-provider and output qualifications remain open. Scoped fixes and finite automated passes do not clear them. |
| Phase 10 readiness: **NO-GO** | Broad cleanup/deletion lacks complete preservation and migration proof. Retain all 33 routes, all 57 capabilities, compatibility aliases and canonical/CV/frozen boundaries. [Handoff](PHASE10_HANDOFF.md) lists possible separately scoped candidates, not permission to implement them. |
| Production release: **NO-GO** | RD21 plus unrechecked storage errors, backup/restore/rollback, ingress/deployed identity, MariaDB, human accessibility, live advisories and model/provider qualifications. No production operation was performed. |
## Checkpoint dispositions
| Checkpoint | Completed evidence / qualification |
|---|---|
| P9-00 inventory |33 actual routes, 57 preservation groups, 43 API controller/partial owners, actual roles/entitlements and page/shared/service/database/document/test ownership. [Entry inventory](../p9-00/INVENTORY.md) and source manifest distinguish candidate coverage from executed results. |
| P9-01 connected journeys | [Functional report](../p9-01/README.md), all 362 executed ordinary cases and final [QA matrix](../QA_MATRIX.md). Persisted local journeys and controlled failures remain distinguishable; intended-provider journeys remain unqualified. |
| P9-02 responsive/visual |396 route/theme/locale/width captures. AI reviewer inspected all 33 contact sheets, nine selected final full-page originals and native-width CTA crops from all 12 latest homepage originals. P9-V01/P9-V02 heading overlaps repaired. [Exact scope](../p9-02/README.md); no human/device/readability substitution. |
| P9-03 accessibility/localisation |64 inherited incompletes deduplicated into four groups, with originals retained. Final 16 settled scans: 0 violations/120 incomplete occurrences. 2,871 keys per language, no parity/placeholder gaps. Admin vendor locale repaired; human checks remain. [Results/checklist](../p9-03/README.md). |
| P9-04 integrity/provider/security | Local backend/isolation/security evidence passes in its scope; **RD21 stale-write safety FAIL**, MariaDB runtime **NOT TESTED**. Docker Linux engine remained unavailable on 23 October; no service installation/restart was attempted. [Data/security report](../p9-04/README.md). |
| P9-05 documents/edge/performance | Native 16-fixture/36-page plus Settings 8-fixture/24-page corpora pass the original oracle; all 60 thumbnails and selected full-size comparisons inspected. Three API volume cases and a 63.332 s finite workload completed. [Report](../p9-05/README.md). Human/Linux/print/capacity qualifications remain. |
| P9-06 remediation/regression | Three product defects in two existing UI owners and three fixture repairs qualified with original failures retained. Complete ordinary, diagnostic and separate-contract successors pass; interrupted/superseded attempts excluded. [Defects](../p9-06/DEFECTS.md). |
| P9-07 acceptance/handoff | This report, [risk register](../RISKS.md), [preservation](../PRESERVATION.md), cleanup eligibility and publication ledger. Recommendations do not activate Phase 10, C11/P5-13 or production. |
## Actual verification
| Lane | Completed result / scope |
|---|---|
| Backend Release | **1,084 passed**, 0 failed/skipped. Unchanged backend source/assembly; isolated SQLite/test-host evidence. |
| Frontend Jest | **919 passed /104 suites**, 0 failed/pending; completed exit 0 on final UI source. |
| Ordinary browser | **362 passed** across four serial native shards: 98 + 87 + 88 + 89. Exact discovery membership, one actual passed result each, four exit 0 records; zero run-level errors, failures, skips, flakiness or retries. |
| Separate browser contracts | **23 passed**: AI withholding 2, auth recovery 2, rate limits 9, ingress 6, PDF admission 1, preferences 3. Six exit 0 records; every actual case passed once with zero errors/retries/skips/flakiness. |
| Sidecar | **56 passed**, 0 failed/skipped, `SKIP_MODEL_LOAD=1`; no inference semantics claim. |
| Phase 9 diagnostics | **18 passed**, zero failed/skipped/flaky/retries, exit 0 under the corrected provider-worker fixture: 12 route cases cover 396 vectors, four accessibility cases cover 16 scans, one unsafe-write characterization and one sustained workload. |
| Volume supplement | **3 passed**, zero failed/skipped/flaky/retries, exit 0. 100 CV revisions +restore 101, 100 long timeline messages, 100 notifications with native membership/count/ownership assertions. No large-history browser usability claim. |
| Types/lint/build |PASS; final production static export and extended diagnostic TypeScript checking. No deployment. |
| Offline security helpers |PASS: supply-chain 3, Ollama-evaluation 5, browser-runtime 6, ingress 3, dependency-policy/SMTP 15, extension URL 3, tracked-secret scan; SBOM generated. No live advisory refresh or blanket security certification. |
| Native fidelity oracle |16/16 +8/8 fixtures;36 +24 pages, unchanged exact membership/page count and original dimension/position/font/colour tolerances. Reverified successfully against the final shard-produced bytes after the document producers completed. |
[Machine-readable validation](../validation.json) retains process timestamps/exits, source/report hashes, exact cases, failed/superseded attempts and raw provenance. The final UI runs use the updated 825-input manifest. The [Admin locator delta](../p9-00/admin-fixture-delta.json), [worker-isolation delta](../p9-00/worker-isolation-delta.json) and [CTA/export delta](../p9-00/cta-delta.json) retain the exact changes and manifest hashes. Only the last changes product/export bytes; backend and sidecar remain unchanged. Full Jest and all four ordinary shards, diagnostics and separate contracts qualify the rebuilt UI, retaining provider-worker isolation. Volume sources are hashed separately. Discovery is list-only: its not-run statuses do not enter regression skip counts.
New regression proof comprises two parameterized Admin locale Jest cases (917 to 919 tests), two ordinary landing cases with extended CTA coverage (360 to 362 cases), 18 separate diagnostics and three API volume cases. Vector/item counts are observations inside those cases, not extra test totals.
The switch to four serial native shards preserves connected files and assertions while keeping completed reports across interruptions. No partial log is accepted as a full run; no retry/skip was configured to hide a failure. Original early harness mistakes, transition traces and interrupted attempts remain in the defect/provenance record. `evidence.py` requires unique IDs and exact discovery membership; `reconcile.py` additionally rejects failed/missing lanes/processes before generating final ledgers.
## Fixes, open defects and release limits
- **P9-V01, Medium, resolved locally:** four public h2 owners inherited fixed body line height. Existing style now specifies1.4; native geometry fails before and passes after over 16 language/theme/width vectors. Independent image review confirms line separation.
- **P9-L01, Low, resolved locally:** AdminUsers omitted the installed MUI nbNO vendor locale. Two new parameterized Jest cases and visible native pagination proof retain English defaults and Bokmål controls.
- **P9-V02, Medium, resolved locally and in full regression:** the separate bottom CTA title also inherited fixed body line height. Its existing owner now specifies 1.4. The two retained native tests require the exact translated CTA alongside all four h2s; both languages fail before and pass after. Original-width inspection of all four 320px green images confirms separation and contained body/button/footer.
- **P9-T01, Medium test reliability, resolved in tested Windows environment:** the descendant timeout fixture could expire before creating its PID. Synchronize fixture startup, then retain the original 200 ms timeout, actual process-tree kill and 504 assertions. No parser product change.
- **P9-T02, Low test compatibility, resolved in integration:** the native Admin fixture expected an English pager in Bokmål. It now uses installed vendor locale names with the original pagination/visibility/focus/no-write assertions. The first shard's 97 pass/1 fail and focused 1/1 green are retained; the complete first-shard successor passed 98/98 with exit 0.
- **RD21, High, OPEN / safety FAIL:** stale Career PUT200 restores old summary; stale generic job PUT204 restores old title. [Exact observations and separate contract issue](../p9-04/RD21_CONCURRENCY_ISSUE.md). Closure requires atomic server comparison, all callers, recoverable conflicts, compatibility and SQLite/MariaDB proof; creation idempotency and later-Identity partial commits remain separate. No client-only workaround or architectural expansion was added in QA.
- **P9-T03, High test isolation, resolved in the corrected fixture:** the existing browser API fixture left the server's saved-search provider worker enabled. Shard 3's 87 pass/1 fail exposed an actual worker-written timestamp during a UI-only preservation check. Browser interception could not constrain server-originated NAV traffic. The fixture now disables that worker; all four ordinary shards and inherited diagnostics passed again with every assertion retained. Earlier reports remain superseded. Production worker settings are unchanged; earlier traffic is not live-provider acceptance.
- **P9-PERF-01, Low, retained:** initial shell/Dashboard duplicate reminder GET. Candidate only for separately measured shared-owner work with independent failure/loading/account-disposal proof.
- **P9-L02, Low, retained:** raw stored `Created` event type remains in Bokmål job/audit metadata. Dictionary parity does not translate authored/provider/technical data. Known enum presentation needs a bounded follow-up and human terminology review.
Accessibility classification retains53 painted-background contrast cases and the original Analytics drawer cause as human qualifications. Ten inherited zero-badge occurrences are not applicable in the verified hidden/zero-area state. Fresh open-modal background incompletes are separately qualified tool/state observations. Actual NVDA/VoiceOver, reader announcements, physical touch/drag/software keyboard, forced colours, human zoom/reflow and professional Bokmål acceptance remain [M09-01–10](../p9-03/MANUAL_CHECKLIST.md). Native zoom and emulated input observations do not close human rows.
SQLite startup/migrations, WAL/held-reader behavior, owner/revision guards, uploads/document ownership, auth/session/CSRF/admin protections and URL/transport boundaries have bounded local evidence. MariaDB SQL generation does not qualify MariaDB runtime. External OAuth/Turnstile/mail/calendar/model behavior, enabled-worker recovery and policy-level retention/deletion remain separate. No live secrets, databases, Docker services or production configuration were changed.
The final workload used 250 applications, eight Career roles/48 distinct long bullets, two paced readers, 240 successful GETs and 20 native navigations over **63.332 s**. API p50/p95/max were **12/42/48 ms**. Native ready ranges: Dashboard 942–977 ms, Table 981–1035 ms, Board 951–966 ms, long CV 1492–1549 ms. Windows 16 logical CPUs/~34.1 GB RAM, Chromium 151.0.7922.34, isolated SQLite, static export. CDP task/CPU/heap/DOM observations are retained. Jest had finished before this final run; the shared host and automation overhead still limit comparisons. No SLA, capacity, long-term leak diagnosis, backend resource attribution or inference throughput is established.
## Preservation, Git and next action
All 33 routes and all 57 functionality groups remain. **56 PARTIAL / PRES-C11 DEFERRED; zero upgrades to PASS.** Later Phase 7 residual obligations supersede obsolete Phase 2 gap descriptions without rewriting history: P2-D01/frozen archive and CV revision repairs remain ordinary passing contracts, not newly reopened defects. Canonical stale saves are a different RD21 boundary. C11/P5-13 remains withheld; no model/integration was activated.
Branch: **`feature/phase9-full-qa`**, based on accepted Phase 8 **`1c24e406f194f0f42277d837b3008a7a28dca26a`**. Published repair checkpoint **`0fb108bd673ea91749f6fa057295e5b6d15d557f`** has direct remote equality. Temporary HTTP502 errors recovered; remote main remained **`5f835e54a9b74e6b71418422e28431b2af06453f`**. [Publication ledger](PUBLICATION.md) retains chronology. The delivery message supplies the final reporting commit SHA and its direct remote comparison, avoiding a self-referential commit hash here. No main merge or production deployment occurred.
Next required product work is the separately scoped RD21 contract repair, followed by intended-provider and human qualifications. Phase 10 receives a candidate/eligibility list only; no alias/schema/feature deletion is approved. Production operators retain independent storage, backup/restore/rollback, ingress, dependency and deployed-identity gates. This assessment neither repairs nor accepts production.
@@ -0,0 +1,15 @@
# Publication ledger
Branch: `feature/phase9-full-qa`, created from accepted Phase8 `1c24e406f194f0f42277d837b3008a7a28dca26a`, preserving history. No main merge, force push or deployment.
Earlier normal pushes and direct ref reads repeatedly returned Git HTTP502. No publication was claimed from those failed attempts. The service later recovered.
| Observed UTC | Action / directly verified result |
|---|---|
| 23October2026 00:21 | Normal `git push -u origin feature/phase9-full-qa` succeeded, publishing all checkpoint ancestors. Direct `git ls-remote` returned `4b7727e22b2c3594b87b624467867d0ea961edb7` for the feature branch, equal to local HEAD. Main returned unchanged `5f835e54a9b74e6b71418422e28431b2af06453f`. |
| 23 October 2026 00:42 | Admin pager fixture checkpoint `d518d471f9b92bdef281f55a56dc25fdb2edd68d` pushed normally and directly matched the feature ref; main remained unchanged. |
| 23 October 2026 | Exact timeline-content checkpoint `a4cf429fb32eb72cd9fd16d0b3ae0051d3cb9c16` pushed normally and directly matched the feature ref; main remained `5f835e54a9b74e6b71418422e28431b2af06453f`. |
| 23 October 2026 | Provider-worker fixture checkpoint `b9e052cd22bcfc4a28a02ea8080de4d342531117` pushed normally after the corrected third shard passed 88/88. Direct feature ref equals the commit; main remains unchanged. The full regression was still pending at this checkpoint. |
| 23 October 2026 | CTA-title repair `0fb108bd673ea91749f6fa057295e5b6d15d557f` pushed normally after native EN/NB RED, 2/2 GREEN, types/lint/build and original-width inspection of four green images. Direct feature ref equals this commit; main remains unchanged. Full rebuilt-source regression was still running at this checkpoint. |
Published checkpoints include the inventory, parser fixture synchronization, Admin vendor-locale and landing heading repairs, route/accessibility/data/performance qualification, exact-content volume checks and provider-worker fixture isolation. After the scoped CTA repair, final rebuilt-source regression completed 362 ordinary +18 diagnostic +3 volume +23 contract cases with strict reconciliation. The final report/evidence commit follows the last listed checkpoint; its exact SHA and direct remote comparison are supplied in the delivery message, avoiding a self-referential hash in this file. No later publication is inferred from an earlier successful push.
File diff suppressed because it is too large Load Diff
+34 -5
View File
@@ -31,8 +31,29 @@ def main():
volume = read('p9-05/volume-cases.json')
assert len(cases) == 362 and len(diagnostics) == 18 and len(volume) == 3
assert len({(row['id'], row['project']) for row in cases}) == 362
assert all(row['status'] == 'expected' and len(row['results']) == 1 and row['results'][0]['status'] == 'passed' for row in cases + diagnostics + volume)
validation = read('validation.json')['lanes']
contracts = [case for lane in ['ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences'] for case in read(f'p9-06/{lane}-cases.json')]
assert len(contracts) == 23
assert all(row['status'] == 'expected' and len(row['results']) == 1
and row['results'][0]['status'] == 'passed'
and row['results'][0]['retry'] == 0 and not row['results'][0]['errors']
for row in cases + diagnostics + volume + contracts)
validation_record = read('validation.json')
validation = validation_record['lanes']
offline_commands = {
'python scripts/test-supply-chain.py', 'python scripts/test-ollama-evaluation.py',
'python scripts/test-browser-runtime-retry.py', 'python scripts/test-ingress.py',
'python scripts/supply-chain.py scan-secrets', 'python scripts/supply-chain.py generate-sbom',
'node --test audit-dependencies.test.mjs localSMTPfixture.test.mjs',
'node --test browser-extension/tests/capture-url.test.mjs',
}
assert len(validation_record['offline']) == len(offline_commands)
assert {row['command'] for row in validation_record['offline']} == offline_commands
assert all(row['exitCode'] == 0 for row in validation_record['offline'])
documents = validation_record['nativeDocuments']
assert len(documents['commands']) == 2 and all(row['exitCode'] == 0 for row in documents['commands'])
assert '.artifacts/phase9/ordinary-cta-shard-1.json' in documents['inputs']
assert '.artifacts/phase9/ordinary-cta-shard-1-exit.json' in documents['inputs']
assert len(documents['outputs']) == 2
assert validation['ordinary']['membershipMatchesDiscovery']
for lane in ['ordinary', 'phase9', 'volume', 'ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences']:
record = validation[lane]
@@ -41,16 +62,24 @@ def main():
assert record['stats']['expected'] == record['cases']
assert sum(validation[lane]['cases'] for lane in ['ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences']) == 23
assert validation['backend']['passed'] == '1084' and validation['backend']['failed'] == '0'
assert validation['backend']['total'] == validation['backend']['executed'] == '1084'
assert validation['backend']['notExecuted'] == '0'
assert validation['frontend']['success'] and validation['frontend']['numPassedTests'] == 919
assert validation['frontend']['numFailedTests'] == validation['frontend']['numPendingTests'] == 0
assert validation['frontend']['numTodoTests'] == validation['frontend']['numFailedTestSuites'] == 0
assert validation['frontend']['numPassedTestSuites'] == 104
assert validation['sidecar']['tests'] == '56' and validation['sidecar']['failures'] == validation['sidecar']['errors'] == '0'
assert validation['sidecar']['skipped'] == '0'
for lane in [*[f'ordinary-shard-{number}' for number in range(1, 5)], 'phase9-frozen', 'volume-qualified', 'ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences', 'backend', 'frontend', 'sidecar', 'build']:
for lane in [*[f'ordinary-cta-shard-{number}' for number in range(1, 5)], 'admin-grid-green', 'landing-cta-green', 'phase9-cta', 'volume-complete', *[lane + '-cta' for lane in ['ai', 'auth', 'rate', 'ingress', 'pdf', 'preferences']], 'backend', 'frontend-cta', 'sidecar', 'build-cta']:
assert validation[lane + 'Process']['exitCode'] == 0
for name, count, pages in [('fidelity-results.json', 16, 36), ('settings-fidelity-results.json', 8, 24)]:
corpus = read('p9-05/evidence/' + name)
assert corpus['passed'] == corpus['total'] == count
assert all(row['pass'] and not row['failures'] for row in corpus['fixtures'])
assert sum(row['pdfPages'] for row in corpus['fixtures']) == pages
rows = read('p9-02/route-results.json')
assert len(rows) == 396 and {row['pattern'] for row in rows} == set(inventory['routes'])
header = '# Phase 9 preservation reconciliation\n\nAll57 groups retain **56 PARTIAL / C11 DEFERRED**. Zero groups are promoted to PASS. These statuses retain mandatory human/provider/output obligations and are not57 defect findings. Phase9 adds finite executed evidence and two bounded UI fixes; it does not erase previous acceptance records. [Phase7](../phase-7/PRESERVATION.md) supplies the later residual obligations, superseding stale Phase2 gap descriptions (notably repaired P2-D01 and CV revision safety).\n\n'
header = '# Phase 9 preservation reconciliation\n\nAll57 groups retain **56 PARTIAL / C11 DEFERRED**. Zero groups are promoted to PASS. These statuses retain mandatory human/provider/output obligations and are not57 defect findings. Phase9 adds finite executed evidence and repairs in two existing UI owners; it does not erase previous acceptance records. [Phase7](../phase-7/PRESERVATION.md) supplies the later residual obligations, superseding stale Phase2 gap descriptions (notably repaired P2-D01 and CV revision safety).\n\n'
header += 'Exact executed browser cases are in [ordinary-cases](p9-01/ordinary-cases.json); complete backend case results and frontend suite totals are linked from [validation](validation.json). The matches below use explicit IDs in test titles only; zero explicit matches means no direct title mapping, not absent unit/API coverage. A case may cover several groups; do not sum counts as independent tests.\n\n'
lines = [header, '| Group / owners | Entry → Phase9 | Direct native title matches | Current residual / closure |', '|---|---|---|---|']
portable = []
@@ -64,7 +93,7 @@ def main():
if identifier == 'PRES-C11':
delta = 'P5-13 remains withheld; real model/semantic qualification not executed.'
if identifier == 'PRES-E01':
delta += ' P9-V01 wrapped heading fix and16-vector native geometry proof.'
delta += ' P9-V01/P9-V02 proportional heading and CTA fixes; two native cases retain16-vector geometry proof.'
if identifier in ['PRES-A01', 'PRES-E08']:
delta += ' P9-L01 installed vendor locale and2new Jest cases.'
if identifier == 'PRES-S02':
File diff suppressed because it is too large Load Diff