docs(redesign): record saved-search repair acceptance

This commit is contained in:
cesnimda
2026-10-09 15:30:16 +02:00
parent 2753d03db6
commit c8e32238ef
15 changed files with 1594 additions and 66 deletions
@@ -1,12 +1,14 @@
# P5-15-01 functional defect register
**R-01 current disposition:** DISCOVERY-01 is **CLOSED for the verified SQLite listing/error/recovery defect** by the [bounded repair](saved-search-repair/README.md). Live deployed-provider qualification and complete PRES-J02 delivery/device acceptance remain open. AUTH-01 and SETTINGS-01 remain P2/OPEN; current reproduced open counts areP0=0/P1=0/P2=2/P3=0. Original reproduction/severity/evidence below remain historical; closing this defect does not erase release blockers or grant full-group PASS.
Audit source `932b962b9038ddb5ad59b982c0199475bfb50454`. Findings use synthetic accounts and disposable local data; no production account, provider or infrastructure is exercised. An audit finding is not automatically a regression introduced by Phase 5. Application source is unchanged here; neither source inspection nor an InMemory pass can override a native failure.
P0 means serious security/data loss; P1 an important broken workflow; P2 limited/recoverable functional failure; P3 minor inconsistency. Missing evidence is a gap, not a defect. The original [debt register](../READINESS_DEBT.md) remains authoritative for separately carried items. This register assigns concrete remediation; it does not authorize or perform it.
## P5-15-01-DISCOVERY-01 — Saved-search listing fails on SQLite
**Confirmed P1 / OPEN.** PRES-J02; `/discover`; `GET /api/job-discovery/saved-searches`. Current local SQLite workflow is NO-GO. Production release remains blocked until the supported/provider-specific path is verified and repaired as appropriate; a SQLite exception is not proof of the deployed MariaDB result.
**Confirmed P1 at audit / CLOSED by R-01 for the verified SQLite defect.** PRES-J02; `/discover`; `GET /api/job-discovery/saved-searches`. The original local SQLite workflow was NO-GO; see the successor native proof. Production release remains blocked by its separate readiness/provider verification obligations; a SQLite exception is not proof of the deployed MariaDB result.
| Field | Evidence-based finding |
|---|---|
@@ -72,6 +74,6 @@ The two standalone [preference diagnostics](diagnostics/README.md) assert intend
| P5-13 and `followMode` compose UI | Approved deferrals, not accidental dead controls. P5-13 remains unqualified/Production-withheld; metadata-only followMode survives the current route contract |
| F04, current backup/restore, production config/schema/keys and rollback | Existing release blockers remain NOT VERIFIED. No deployment/production checks or `main` push are performed here |
**No P0 is demonstrated by the collected evidence.** That is a bounded finding, not an exhaustive security certification. P1 saved-search verification/acceptance and dependent activity remain blocked pending a separate repair; independent audit evidence can still be collected safely.
**No P0 is demonstrated by the collected evidence.** That is a bounded finding, not an exhaustive security certification. At the original audit, P1 saved-search verification and dependent activity were blocked; R-01 now supplies the scoped repair proof; independent audit evidence can still be collected safely.
Confirmed finding totals: **P0 0 / P1 1 / P2 2 / P3 0**. These are three distinct failures, not the same count as failing browser cases: normal/admin cases share DISCOVERY-01; AUTH-01 occupies the anonymous case; SETTINGS-01 is a separate diagnostic. Carried failures/evidence gaps are additional debt, not silently closed or counted as newly reproduced defects.
Original audit finding totals: **P0 0 / P1 1 / P2 2 / P3 0**. Current open reproduced totals after R-01: **P0 0 / P1 0 / P2 2 / P3 0**. These are three distinct failures, not the same count as failing browser cases: normal/admin cases share DISCOVERY-01; AUTH-01 occupies the anonymous case; SETTINGS-01 is a separate diagnostic. Carried failures/evidence gaps are additional debt, not silently closed or counted as newly reproduced defects.
@@ -1,5 +1,7 @@
# P5-15-01 functional preservation results
**Successor R-01:** [saved-search repair](saved-search-repair/README.md) verifies the native SQLite/list feedback repair. J02 is now PARTIAL; current57 totals are54PARTIAL/2FAIL/1DEFERRED in the [parent successor column](../PRESERVATION_ACCEPTANCE.md). This01 matrix and its53PARTIAL/3FAIL/1DEFERRED totals remain the original audit outcome, not a current open-defect count. No full group has been certified PASS.
Audit source **`932b962b9038ddb5ad59b982c0199475bfb50454`**, branch `codex/ui-redesign-phase4`, 2026-10-09. This document compares every original protected capability with actual current API/owner, frontend reach action, read/write boundary, inspected tests and outstanding evidence. It is a functional evidence record; no application repair, provider/model call, production operation, Docker recovery or B07 work belongs to it.
The original [Phase 1 ledger](../../../audit/FUNCTIONALITY_INVENTORY.md), [Phase 2 matrix](../../../phase-2/PRESERVATION_MATRIX.md), [approved Phase 5 plan](../../PHASE5_PLAN.md), [P5-15-00 matrix](../PRESERVATION_ACCEPTANCE.md) and [execution plan](../EXECUTION_PLAN.md) remain the contracts. Architecture follows the [API/controller/service/tenant boundaries](../../../../architecture/backend.md) and [client React Router/API layer](../../../../architecture/frontend.md). Each row includes the original full capability; its short test description covers representative assertions only.
@@ -1,5 +1,7 @@
# P5-15-01 — Functional and preservation audit
**Successor checkpoint:** [P5-15-01R-01](saved-search-repair/README.md) repairs DISCOVERY-01 on SQLite and visible list failure/retry. The original audit findings/counts below are preserved historically. The parent matrix now records54PARTIAL/2FAIL/1DEFERRED; Analytics AUTH-01 and Rules SETTINGS-01 remain open ordinary failures. R-01 does not authorize P5-15-02 or production.
**NO-GO for proceeding to P5-15-02 under its current entry criteria. Production remains NO-GO. Phase 5 is not complete.** The P1 saved-search workflow fails on the supported local SQLite path. Two P2 context/draft failures also require separately scoped remediation. No application repair, new redesign, production access, `main` change, P5-13 qualification/UI, Docker recovery or B07 occurred.
Audit source: **`932b962b9038ddb5ad59b982c0199475bfb50454`**, development branch `codex/ui-redesign-phase4`, 2026-10-09. Application/build/renderer inputs remain unchanged; this checkpoint adds behavioral audit tests and evidence/documentation. The production branch remains `main` at **`27657f31131cd95d42f0e1290853ec9c9b3959a4`**. Its automatic deployment trigger was not invoked.
@@ -1,5 +1,7 @@
# P5-15-01 route results
**R-01 successor:** [native saved-search repair](saved-search-repair/README.md) reruns all32 patterns/192 entry-refresh observations. The four normal/admin Discover reads now return200, with98 selected native reads and no remaining500. All entry-refresh assertions pass; the separately asserted sign-in query return still fails. Current broader workflow disposition is31PARTIAL/1FAIL (Login), not32 fully accepted workflows. The original01 table, failed observations and30PARTIAL/2FAIL outcome below remain historical.
Fresh disposable Chromium/Development API census at unchanged application source `932b962b9038ddb5ad59b982c0199475bfb50454`, 2026-10-09. [Portable execution](evidence/browser-summary.json) contains all raw entry/refresh destinations/statuses, times, command/report/test hashes and limits. [Original/source route plan](../ROUTE_ACCEPTANCE.md) retains owner/query/navigation mappings; [57-group result](PRES_RESULTS.md) records capability scope.
**32 current patterns = all31 original patterns + Analytics.** Current source has35 route declarations including wildcard/duplicate-root infrastructure,32 concrete patterns,29 pages/3redirects. No current original pattern is removed. For each pattern, anonymous, ordinary account and administrator each perform entry and hard refresh: **192 observations**. All192 reach the expected URL/heading/config state; **188 route observations satisfy all asserted conditions / 4 fail** on saved-search500s. Selected native GET observations are **98:94 expected statuses /4 failed**; the other94 route observations have no selected GET. Separately, a real anonymous→login return loses `months=6`, despite reaching Analytics.
@@ -0,0 +1,180 @@
# P5-15-01R-01 — Saved-search loading and error visibility
Source: `54a377054f6138c5645a3da293dacd84d3056237`, development branch `codex/ui-redesign-phase4`, 2026-10-09. This bounded checkpoint repairs **P5-15-01-DISCOVERY-01** only. Production remains **NO-GO**; production `main` is unchanged at `27657f31131cd95d42f0e1290853ec9c9b3959a4`.
The affected feature is **saved NAV searches in Discover (`/discover`)**, reached from the Jobs secondary navigation. It uses `SavedJobSearch` and `/api/job-discovery/saved-searches`. Jobs Table **Saved views** are a separate filter-preference domain. Neither the Table/Board query contract nor route hierarchy is changed.
## Original reproduction and root cause
The original audit recorded four genuine HTTP500s: normal/admin entry and refresh. This checkpoint reran the normal-user census **before any backend repair** and reproduced two more native saved-search GET500s against the existing disposable SQLite application. The new real-SQLite regression then failed for an empty owner, previously persisted records and a create/run/readback journey: **3 failed / 7 passed / 0 skipped**.
The exact failing operation was `OrderByDescending(x => x.UpdatedAtUtc)` inside `ListSavedSearches`, followed by `ToListAsync`. `UpdatedAtUtc` is an unconverted `DateTimeOffset`; installed EF Core SQLite raises:
> SQLite does not support expressions of type 'DateTimeOffset' in ORDER BY clauses.
This is a translation failure **before SQL execution**, not a missing account, corrupted search record, serializer exception, NAV outage or SQL statement rejected by SQLite. There is therefore no successfully executed failing SQL to reproduce. [Sanitized before/after evidence](evidence/validation.json) retains the exception, clean RED/GREEN counts, native request observations and fingerprints of raw logs/results.
| Stage | Actual behavior / authoritative boundary |
|---|---|
| Frontend | Discover requests the saved list; the old catch silently retained an empty array |
| API/authentication | Local authorization runs; the current-user service resolves the authenticated owner |
| Persistence | `Where(OwnerUserId == owner)` is retained, but the old unsupported timestamp ordering fails query translation |
| Materialization/serialization | The old query never reaches materialization or DTO serialization; native transport returns500 |
| User feedback | Old UI presented “No saved searches yet”; new UI announces the failed read and offers Retry |
Initial test-harness errors are separate from product evidence: async principal setup in a direct-controller fixture was corrected before the clean RED; validation asserts `ProblemDetails` rather than a formatter status unavailable outside MVC execution. The first new browser matrix run expected language-preference200 instead of its existing204 contract; only that fixture assertion was corrected. None of these errors was counted as a product pass or used to weaken the saved-search assertions.
## Smallest repair and compatibility
`JobDiscoveryController.ListSavedSearches` now projects owner-filtered **summary scalars and two SQL aggregate counts**. It does not materialize search-result entities. SQLite sorts the materialized **owned summaries** by `DateTimeOffset` instant; non-SQLite providers retain database ordering. Mixed-offset fixtures prove actual chronological order rather than lexical timestamp order.
Ownership filtering and result counts remain in SQL. The API already returns all of an owner's saved-search summaries; this preserves that response contract. SQLite's sort costs O(n log n) time/O(n) summary memory for that owner, rather than loading every account or every stored result. This is not client-side ownership/filter evaluation. No arbitrary limit, truncation, schema migration, timestamp rewrite, database reset or data deletion is introduced.
Existing DTO fields, descending-update semantics, cancellation, create trimming/validation, alert toggle, explicit run, result dismissal and delete/cascade behavior remain intact. No separate read-by-id endpoint or renamed search mutation is invented: the existing PATCH updates `IsActive`, not stored query/name. The real runner still uses the current service and normal persistence path.
### Provider qualification
The repository configures **SQLite and Pomelo MySQL/MariaDB**, with MariaDB11 in the existing deployment. It does **not** currently configure Npgsql/PostgreSQL. The non-SQLite branch retains server-side ordering and uses ordinary owner-filtered projections/counts; no SQLite-only schema workaround changes that branch.
**Live MariaDB and PostgreSQL integration are NOT VERIFIED.** No approved server/credential fixture was available and none was added. Source compatibility and Release compilation are evidence for the query shape, not successful execution against either server. PostgreSQL parity cannot be claimed for an unconfigured provider. Deployed provider/schema qualification remains a separate production obligation.
## Frontend states and recovery
| State | User-facing behavior |
|---|---|
| Loading | Named `status`, busy saved-search region; no successful-empty message; creation disabled |
| Loaded empty | Existing “No saved searches yet” message after a valid empty response |
| Loaded populated | Existing run/alert/delete controls and metadata; no interface redesign |
| Error / malformed response | Existing outlined MUI error Alert with localized concise wording and Retry; no internal server details; list not presented as refreshed |
| Retry | Reloads only the saved-search resource. Current role/company, municipality, discovery result set and sorting remain available |
The page validates the received list's existing DTO shape. A200 containing null, an object, or incomplete rows is a failed read, not an empty successful account. An unmounted/obsolete effect cannot publish its response. Saved rows are hidden while loading/failed, so stale data is not represented as successfully refreshed.
Save search remains disabled until a list is loaded. Review reproduced the otherwise-hidden-success risk after a failed initial read; a focused RED assertion failed before this guard and passes afterward. Retry restores creation without silently appending to an unknown list. This does not discard the user's search-name or discovery draft.
Translations:
- EN: “Loading saved searches…” / “Saved searches could not be loaded. Try again.”
- Bokmål: “Laster lagrede søk…” / “Lagrede søk kunne ikke lastes. Prøv igjen.”
Existing Retry wording and shared MUI semantics are reused. No new global resource framework, notification system or settings surface is added.
## Files changed and scope justification
| File | Bounded reason |
|---|---|
| `JobTrackerApi/Controllers/JobDiscoveryController.cs` | Owns the failed query; owner-filtered projection/counts and provider-compatible ordering |
| `JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs` | Ten new real-SQLite cases, real current-user service; no EF InMemory proof for the provider defect |
| `job-tracker-ui/src/views/JobDiscoveryPage.tsx` | Owns the suppressed saved-list failure and recovery without changing discovery/query semantics |
| `job-tracker-ui/src/i18n/translations.ts` | Two new labels in both existing languages; no new terminology domain |
| `job-tracker-ui/src/job-discovery.test.tsx` | Five new behavior cases; one old fixture now includes its actual `isActive` DTO field; existing seven tests retained |
| `job-tracker-ui/e2e/saved-search-repair.spec.ts` | Three new native transport/UI contract cases, explicit provider interception and injected fault boundaries |
| This record and P5-15 acceptance/defect evidence | Current status and traceability; original failed audit evidence remains historical |
No application code outside the discovery controller/page and shared translation owner changes. No authentication/session boundary, route, Jobs Table/Board, renderer, model/schema, CI/deployment, AI configuration or dependency changes occur.
## Behavioral verification
| Requirement | Evidence / result scope |
|---|---|
| New user empty list | Real SQLite integration and native authenticated GET/UI return200 + `[]`; no provider call |
| Previously persisted records | Save seeded owned/foreign records, clear tracking and reread; exact owned IDs/counts and mixed-offset descending instants; no entities tracked |
| Create/navigation/reload | Native201 from UI, navigate Jobs→Discover, refresh and compare exact persisted DTO; reload after pause/resume and delete |
| Apply saved search | UI action restores saved query/municipality and renders the provider fixture; native SQLite controller/runner verifies actual filter inputs, run/result persistence and subsequent readback |
| Update/delete | Native pause/resume200 and delete204, readback/refresh; backend verifies result cleanup and missing/foreign404 |
| Isolation | Native second account cannot list or mutate first account's search; forged owner/id payloads remain caller-owned; six anonymous list/create/update/delete/run/dismiss requests return401 |
| Foreign persisted result | Real-SQLite fixture seeds a foreign result and verifies dismissal denial/readback. Browser foreign dismissal uses an unavailable result, so it is not the sole proof of relationship ownership |
| Failure/recovery | Jest HTTP500 and malformed payload cases; browser deliberately faults only saved-list reads and retries the **native GET**, preserving edited filters and existing one-off results |
| Table/Board | Existing full-suite ID-membership/query/alias/owner tests retained; Jobs Saved views stays separate. Saved NAV repair does not modify that domain |
### Explicit test boundaries
The browser uses the real disposable local SQLite API for list/create/toggle/delete/authentication and owner denials. Only the **owner's provider-dependent run output and one-off vacancy search** are intercepted; NAV's base URL is external and no new live-provider processing is authorized. The backend tests exercise the real runner with a deterministic `IJobDiscoverySearchService`, real SQLite and real current-user resolution. This is stronger persistence evidence than mocked repositories, but not live NAV qualification.
The existing saved-alert worker is disabled **only by the browser-run environment flag** `Workers__SavedJobSearchAlertsEnabled=false` to avoid unintended external calls. No configuration file or production behavior is changed. Scheduler-to-notification/live delivery remains outside this proof.
Reload restores the persisted search **list**. Existing Discover semantics do not automatically rerun a search or persist the current one-off input as URL state. Explicit Apply restores the saved inputs. The checkpoint does not invent automatic query execution on reload.
## Preservation reconciliation
| PRES | Existing contract → defect/change → evidence → current acceptance |
|---|---|
| **J02** | Named saved searches/run/delete/alerts/result state → list500 + silent error → scalar read repair and visible independent error/retry → ten SQLite cases, native lifecycle/denial/recovery cases plus retained alert tests → **FAIL→PARTIAL**, not whole-group PASS |
| **J01** | NAV source/search/reviewed save → list failure must not disable one-off discovery → retry retains form/results; existing discovery behavior tests remain green → **PARTIAL unchanged** |
| **J05/J07** | Table filters/saved views and Board population/status/navigation → distinct saved-search domain → no Table/Board source changes; existing full browser membership/alias tests → **PARTIAL unchanged** |
| **E07/E08/E09** | Reachability, accessible named loading/error/retry, authenticated ownership → same Discover secondary entry and safe feedback → browser navigation/roles, finite axe, native tampering/anonymous denial → **PARTIAL unchanged** |
All original57 groups remain reconciled in the [parent matrix](../../PRESERVATION_ACCEPTANCE.md). This scoped repair cannot certify scheduler delivery, mobile delete confirmation, real providers or human screen-reader acceptance. The original01 columns retain their failed observations; the successor column records current evidence.
## Fresh validation and diagnostic reconciliation
All results below are **fresh local executions**, not inherited passes. [Validation/commands/fingerprints](evidence/validation.json), [saved-search RED/GREEN/native proof](evidence/saved-search-proof.json) and [repository/build/document checks](evidence/repository-validation.json) retain provenance. Raw logs/TRX/JSON/PDF files remain under the ignored `.artifacts/p5-15-01R-01/`; portable fingerprints and finite synthetic screenshots are committed.
| Gate | Inherited / audit source | Fresh final result | Count reconciliation |
|---|---|---|---|
| Backend | 1,023 | **1,033 passed**, 0failed/0skipped | +10 actual SQLite cases described above |
| Frontend | 459 /82suites | **464 passed /82suites**, 0failed/0skipped | +5 loading/error/malformed response cases; old7 discovery cases retained |
| Ordinary browser | 117 inherited +5 audit cases:119pass/3fail | **124 passed /1 failed /125 total**, 0skipped/0expected failures | All117 inherited pass; original five audit cases now4pass/1fail; +3 new repair cases pass |
| Saved-search focused browser | No dedicated native repair cases | **3/3 passed** | These same cases are also in the125-case full run; do not add them twice |
| Separate diagnostics | 1pass/1fail | **1pass/1fail** | Preference concurrency pass; Rules draft failure unchanged; not counted inside125 |
| Focused AI | 108 | **108 passed** | Backend subset; deterministic guards, not model qualification |
| Sidecar | 49 | **49 passed** | Offline; no model/provider qualification |
| Real HTTP | 2 | **2 passed** | Production CV-review withholding and authoritative proposal boundary remain protected |
| Revision safety | 5 | **5/5 passed** | Backend subset; no revision changes |
| Standard fidelity | 16;36=36pages | **16/16;36 preview=36 PDF pages** | Same corpus and declared tolerances |
| Settings exports | 8;24=24pages | **8/8;24 preview=24 PDF pages** | Same settings corpus and declared tolerances |
| Rate-limit / ingress / PDF admission / configuration | 9/6/1/3 | **9/6/1/3 passed** | Local security/configuration evidence; not deployed F04 proof |
| Additional offline supply / evaluator / extension | 3/5/3 | **3/5/3 passed** | No live evaluation, extension deployment or provider calls |
| TypeScript / E2E TypeScript / lint / frontend production / API Release builds | Passing | **Passed** | App and test typing, global lint, both builds; API warnings/errors0 |
| Secrets / whitespace / documents /57-group reconciliation | Passing | **Passed** | [Recorded checks](evidence/repository-validation.json); original contracts and route inventory unchanged |
The complete browser command exits1 because **AUTH-01 remains an ordinary failed case**: `/analytics?months=6` loses its period query after sign-in. The separate diagnostics command exits1 because **SETTINGS-01 remains an ordinary failed case**: unsaved14→5→tab round trip returns14, persisted14, zero writes. These are **not** skipped, quarantined, expected failures or repaired here. Both original normal/admin route failures caused by DISCOVERY-01 now pass. P2-D01 remains an ordinary passing case.
An initial new browser fixture expected200 from the existing language-preference PUT, whose actual contract is204; that harness assertion was corrected before the genuine3/3 run. No saved-search failure expectation was weakened. The first post-final-change Jest run observed463pass/1fail in an unchanged CV preview “Unsaved” assertion. Its isolated rerun and subsequent **complete464-case rerun** pass. The failed report remains fingerprinted; the cause is **not established**, no CV code/test is changed and no product fix is claimed. This is an open recurrence/verification risk for later CV acceptance. An earlier full frontend run began before the last UI guard change and is retained as intermediate evidence, not the final baseline.
The fresh route census covers all32 patterns/192 entry-refresh observations and98 selected native reads, with no remaining saved-search500. Four normal/admin Discover entry-refresh GETs now return200. All entry-refresh assertions pass; login query continuity remains failed. Broader route status is therefore **31PARTIAL/1FAIL**, not32 fully accepted workflows. [Original route evidence](../ROUTE_RESULTS.md) is retained historically.
## Visual, localisation and accessibility evidence
The new browser matrix tests **EN/light1440px, EN/dark390px, Bokmål/light390px and Bokmål/dark1440px**, including loading, fault and native retry, with edited inputs and a retained one-off result. It captures13 actual screenshots and checks document width against viewport width. These are Chromium mouse/viewport checks, not physical phone/touch/software-keyboard acceptance.
| Captured state | Evidence |
|---|---|
| Persisted saved search after native reload | [EN/light desktop](evidence/saved-search-native-persisted-en-light-desktop.png) |
| Error with preserved current discovery results | [EN/light desktop](evidence/saved-search-en-light-1440-load-error.png) |
| Narrow error message and Retry | [EN/dark390px](evidence/saved-search-en-dark-390-load-error.png) |
| Native retry restores saved controls while retaining changed inputs/results | [Bokmål/light390px](evidence/saved-search-nb-light-390-native-retry.png) |
| Named pending load, no false empty state | [Bokmål/dark desktop](evidence/saved-search-nb-dark-1440-loading.png) |
The coding agent inspected the genuine desktop error, dark narrow error and Bokmål narrow retry images: controls/text reflow, current results remain present and the message has no internal details. This is **agent visual inspection**, not independent human or screen-reader acceptance.
Scoped saved-search scans: **9 axe scans,0 violations,52 incomplete color-contrast node occurrences**. The complete fresh browser run records **251 scans,0 reported violations,1,880 incomplete node occurrences**. Incompletes are unaccepted; repeated occurrences are not a count of unique defects. Named status/Alert/Retry controls have automated evidence, but spoken announcements, actual screen reader, physical touch and complete zoom/reflow remain open. Existing manual accessibility requirements are preserved.
## Current debt and stopping boundary
| Item | Disposition after this checkpoint |
|---|---|
| DISCOVERY-01 P1 | **Closed for demonstrated SQLite listing + suppressed-error/recovery defect**; no data deletion or ownership regression observed |
| AUTH-01 P2 Analytics sign-in query | **OPEN/failing**, separate bounded repair required |
| SETTINGS-01 P2 Rules draft retention | **OPEN/failing**, separate bounded repair required |
| Historical Dashboard/language preference-save500 | **OPEN**; bounded concurrency diagnosis passes again, not reproduced does not mean fixed |
| Live MariaDB/PostgreSQL/NAV; saved-alert delivery | **NOT VERIFIED**; provider/scheduler qualification remains separate; PostgreSQL not configured |
| Transient CV “Unsaved” assertion | First full attempt failed; isolated and subsequent full passes; cause unestablished, retained for later recurrence triage |
| Manual screen reader, incomplete axe, physical touch/software keyboard, broader zoom/reflow, production fonts/photos | **OPEN/NOT VERIFIED**, preserved for assigned acceptance owners |
| Board scaling/native touch; metadata-only `followMode` compose UI | **OPEN/deferred** per existing plan; no remediation |
| P5-05/P5-13/B07 | No implementation; P5-13 remains unqualified,0/366calls,0human reviews, review UI deferred, Production withholding active |
| F04, current backup/restore, production configuration/schema/secrets and tested rollback | **Release blockers remain NOT VERIFIED**; no infrastructure recovery or deployment |
The [defect register](../DEFECTS.md) retains the original three findings and now distinguishes the two currently open reproduced defects from the closed SQLite defect. J02 stays PARTIAL and the whole57 matrix is **PASS0/PARTIAL54/FAIL2/DEFERRED1/BLOCKED0/NOT VERIFIED0**. No original contract is weakened and no unrelated failure is closed by this repair.
## Checkpoints and decision
| Logical checkpoint | Commit / immediate push evidence |
|---|---|
| Real-SQLite reproducer and owner-filtered summary repair | **`bcc959904915e381ef6bfe5c236d9626021681d4`**; pushed and remote equality verified before continuing |
| Visible load/failure/retry, guarded creation, localized labels and behavior/native browser regressions | **`2753d03db643c4b90b12c62748b0e844981d48b8`**; pushed and remote equality verified before final documentation |
| Final validation, scoped proof and acceptance/defect reconciliation | This independently pushed documentation checkpoint; final hash and remote/clean-tree confirmation are reported to the owner after commit |
**P5-15-01R-01: GO for the bounded saved-search repair.** The original HTTP500 is fixed, previously persisted data and current create/reload/apply controls work at the declared native/provider boundaries, real SQLite regressions and ownership denials pass, and failed reads have safe accessible recovery. All relevant saved-search cases pass. The complete baseline remains explicitly red for the two unrelated P2 defects.
**Production: NO-GO. P5-15-02 is not started or cleared by this checkpoint.** Reconcile AUTH-01/SETTINGS-01 through separately authorized bounded work. Stop here; no Analytics/Rules repair, P5-13, B07, production merge or deployment follows automatically.
@@ -0,0 +1,252 @@
{
"status": "PASS for repository/build/static checks only",
"codeCheckpoint": "2753d03db643c4b90b12c62748b0e844981d48b8",
"finalDocumentCommit": "This record; final push/tree equality is verified after commit and reported to the owner.",
"productionMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"productionChanged": false,
"checks": [
{
"name": "api-release-final",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.dotnet/dotnet.exe",
"build",
"JobTrackerApi/JobTrackerApi.csproj",
"--configuration",
"Release",
"--no-restore",
"-warnaserror"
],
"startedUtc": "2026-10-09T13:24:53.501352+00:00",
"finishedUtc": "2026-10-09T13:25:03.683070+00:00",
"exitCode": 0,
"logSha256": "9367b7240ef6eead402c931d7133cf6570b120ee3d25c9deb0d853693c9b2b39"
},
{
"name": "e2e-typescript",
"command": [
"rtk",
"proxy",
"node",
"node_modules/typescript/bin/tsc",
"--project",
"../.artifacts/p5-15-01/e2e-tsconfig.json",
"--noEmit",
"--incremental",
"false"
],
"startedUtc": "2026-10-09T13:25:03.683565+00:00",
"finishedUtc": "2026-10-09T13:25:06.152292+00:00",
"exitCode": 0,
"logSha256": "a4ed4c2c830adf807283a578ea7ee8b2f659416a86da69815d6147237e7d7f36"
},
{
"name": "lint-final",
"command": [
"rtk",
"proxy",
"npm.cmd",
"run",
"lint"
],
"startedUtc": "2026-10-09T13:25:06.152793+00:00",
"finishedUtc": "2026-10-09T13:25:38.707043+00:00",
"exitCode": 0,
"logSha256": "cfebe429755ba96788c4799da52e25090c30bf8c70ef856fb3dbb9cb1396b233"
},
{
"name": "document-links",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe",
"-X",
"utf8",
".artifacts/p4-04-check-doc-links.py"
],
"startedUtc": "2026-10-09T13:25:38.707553+00:00",
"finishedUtc": "2026-10-09T13:25:39.452916+00:00",
"exitCode": 0,
"logSha256": "168e84db44c16efddb29f55c5da708c253b9ea8043355277bf25811d3abe19f3"
},
{
"name": "secret-scan",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe",
"-X",
"utf8",
"scripts/supply-chain.py",
"scan-secrets"
],
"startedUtc": "2026-10-09T13:25:39.453419+00:00",
"finishedUtc": "2026-10-09T13:25:41.316106+00:00",
"exitCode": 0,
"logSha256": "da6efdc7fe0b34b8658c000c05ed2eaa8fdaf0dd62756adf51f7a770d5a4485f"
},
{
"name": "working-whitespace",
"command": [
"rtk",
"proxy",
"git",
"diff",
"--check"
],
"startedUtc": "2026-10-09T13:25:41.316106+00:00",
"finishedUtc": "2026-10-09T13:25:41.438960+00:00",
"exitCode": 0,
"logSha256": "a4ed4c2c830adf807283a578ea7ee8b2f659416a86da69815d6147237e7d7f36"
},
{
"name": "staged-whitespace",
"command": [
"rtk",
"proxy",
"git",
"diff",
"--cached",
"--check"
],
"startedUtc": "2026-10-09T13:25:41.439516+00:00",
"finishedUtc": "2026-10-09T13:25:41.555188+00:00",
"exitCode": 0,
"logSha256": "a4ed4c2c830adf807283a578ea7ee8b2f659416a86da69815d6147237e7d7f36"
},
{
"name": "checkpoint-whitespace",
"command": [
"rtk",
"proxy",
"git",
"diff",
"54a377054f6138c5645a3da293dacd84d3056237",
"--check"
],
"startedUtc": "2026-10-09T13:25:41.555730+00:00",
"finishedUtc": "2026-10-09T13:25:41.688445+00:00",
"exitCode": 0,
"logSha256": "a4ed4c2c830adf807283a578ea7ee8b2f659416a86da69815d6147237e7d7f36"
},
{
"name": "checkpoint-files",
"command": [
"rtk",
"proxy",
"git",
"diff",
"54a377054f6138c5645a3da293dacd84d3056237",
"--name-only"
],
"startedUtc": "2026-10-09T13:25:41.688445+00:00",
"finishedUtc": "2026-10-09T13:25:41.801172+00:00",
"exitCode": 0,
"logSha256": "b3f0d534993b8b8b2f0e231154771d1f1baa2e1a9341a31446bfa256027b9e16"
},
{
"name": "original-contracts-unchanged",
"command": [
"rtk",
"proxy",
"git",
"diff",
"54a377054f6138c5645a3da293dacd84d3056237",
"--",
"docs/redesign/phase-2",
"docs/redesign/audit/ROUTE_MAP.md"
],
"startedUtc": "2026-10-09T13:25:41.801686+00:00",
"finishedUtc": "2026-10-09T13:25:41.916281+00:00",
"exitCode": 0,
"logSha256": "a4ed4c2c830adf807283a578ea7ee8b2f659416a86da69815d6147237e7d7f36"
},
{
"name": "main-revision",
"command": [
"rtk",
"proxy",
"git",
"rev-parse",
"main"
],
"startedUtc": "2026-10-09T13:25:41.916281+00:00",
"finishedUtc": "2026-10-09T13:25:42.022752+00:00",
"exitCode": 0,
"logSha256": "897066df123bc63e82a45f42fe9b6dbc9dd0aeff602dd814ffdf3ffd8de8ec2c"
},
{
"name": "remote-branches",
"command": [
"rtk",
"proxy",
"git",
"ls-remote",
"origin",
"refs/heads/main",
"refs/heads/codex/ui-redesign-phase4"
],
"startedUtc": "2026-10-09T13:25:42.023246+00:00",
"finishedUtc": "2026-10-09T13:25:42.245781+00:00",
"exitCode": 0,
"logSha256": "0e50b46b0bf8069c66d5d95937e05ad3eff7fa05bad450f21853e3f3cdd583c3"
},
{
"name": "code-head",
"command": [
"rtk",
"proxy",
"git",
"rev-parse",
"HEAD"
],
"startedUtc": "2026-10-09T13:25:42.246279+00:00",
"finishedUtc": "2026-10-09T13:25:42.356820+00:00",
"exitCode": 0,
"logSha256": "82cb2a0e4c3c76f65eb68dfa103998771793211a3b53e1106207687b00f16382"
}
],
"changedTrackedFiles": [
"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs",
"JobTrackerApi/Controllers/JobDiscoveryController.cs",
"docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md",
"docs/redesign/phase-5/p5-15/README.md",
"docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md",
"docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md",
"docs/redesign/phase-5/p5-15/p5-15-01/README.md",
"docs/redesign/phase-5/p5-15/p5-15-01/ROUTE_RESULTS.md",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-en-dark-390-load-error.png",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-en-light-1440-load-error.png",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-native-persisted-en-light-desktop.png",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-nb-dark-1440-loading.png",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-nb-light-390-native-retry.png",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-proof.json",
"docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/validation.json",
"job-tracker-ui/e2e/saved-search-repair.spec.ts",
"job-tracker-ui/src/i18n/translations.ts",
"job-tracker-ui/src/job-discovery.test.tsx",
"job-tracker-ui/src/views/JobDiscoveryPage.tsx"
],
"preservation": {
"total": 57,
"historical": {
"PARTIAL": 53,
"FAIL": 3,
"DEFERRED": 1
},
"current": {
"PARTIAL": 54,
"FAIL": 2,
"DEFERRED": 1
},
"originalIdsUnchanged": true
},
"routePatterns": 32,
"balancedMarkdown": true,
"limits": [
"Browser remains124pass/1failure; standalone diagnostics1pass/1failure.",
"No production, human AT/device or live-provider qualification."
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

@@ -0,0 +1,202 @@
{
"sourceCheckpoint": "54a377054f6138c5645a3da293dacd84d3056237",
"scope": "Synthetic disposable native SQLite transport plus explicitly intercepted provider output; no production, live NAV/model, human screen reader or physical touch qualification.",
"beforeNativeReads": [
{
"pattern": "/discover",
"mode": "entry",
"destination": "/discover",
"status": 500
},
{
"pattern": "/discover",
"mode": "refresh",
"destination": "/discover",
"status": 500
}
],
"beforeRouteObservationCount": 64,
"savedFocusedStats": {
"startTime": "2026-10-09T12:51:20.074Z",
"duration": 51321.988999999994,
"expected": 3,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"nativeOwnerEvidence": {
"mockBoundary": "No endpoint interception in this case; denied run checks ownership before any provider call.",
"evidence": [
{
"operation": "foreign list with forged owner/id/filter",
"status": 200
},
{
"operation": "foreign update",
"status": 404
},
{
"operation": "foreign delete",
"status": 404
},
{
"operation": "foreign run",
"status": 404
},
{
"operation": "foreign dismiss",
"status": 404
},
{
"operation": "anonymous list",
"status": 401
},
{
"operation": "anonymous create",
"status": 401
},
{
"operation": "anonymous update",
"status": 401
},
{
"operation": "anonymous delete",
"status": 401
},
{
"operation": "anonymous run",
"status": 401
},
{
"operation": "anonymous dismiss",
"status": 401
}
]
},
"nativeRetryEvidence": [
{
"variant": "saved-search-en-light-1440",
"faultStatus": 500,
"retryStatus": 200,
"delayedStatus": 200
},
{
"variant": "saved-search-en-dark-390",
"faultStatus": 200,
"retryStatus": 200,
"delayedStatus": 200
},
{
"variant": "saved-search-nb-light-390",
"faultStatus": 500,
"retryStatus": 200,
"delayedStatus": 200
},
{
"variant": "saved-search-nb-dark-1440",
"faultStatus": 200,
"retryStatus": 200,
"delayedStatus": 200
}
],
"axe": {
"scans": 9,
"violations": 0,
"incompleteNodeOccurrences": 52
},
"incompleteRules": {
"color-contrast": 52
},
"screenshots": [
{
"path": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-native-persisted-en-light-desktop.png",
"sha256": "833d216db43a39b0f09405d2436504655b9b3aa2d3df9888dd735fd531505783"
},
{
"path": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-en-light-1440-load-error.png",
"sha256": "c49d7377f32647341fc41ac793e97d3c70ce04d5eb747af218e197e00c0b5f2f"
},
{
"path": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-en-dark-390-load-error.png",
"sha256": "f4c35c43d71668919432436147c4b8c58a540f86e98038d8a66876c9136e2a72"
},
{
"path": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-nb-light-390-native-retry.png",
"sha256": "d331ae3ffef8fa7ce3867f04b290e4f8feeaf90215443437474172eba8cf0d59"
},
{
"path": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-nb-dark-1440-loading.png",
"sha256": "e115a9af730ab6a1e672423a2be83d38e67049a21278f19a56df7ddd7f3450ed"
}
],
"sourceHashes": [
{
"path": "JobTrackerApi/Controllers/JobDiscoveryController.cs",
"sha256": "06dece853bf6a09662692058fa166dc748c3a86dc0aba0a73e7db583b5cc36b6"
},
{
"path": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs",
"sha256": "cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50"
},
{
"path": "job-tracker-ui/src/views/JobDiscoveryPage.tsx",
"sha256": "9407a04a8ea39f21cff6631367cd8a744a101807be0a7777d8d03ae8a01c299f"
},
{
"path": "job-tracker-ui/src/i18n/translations.ts",
"sha256": "1fd49ffa0bfac4500a0dda0d9ee0c02e42ccc201160f7fee13800b88c6398ed5"
},
{
"path": "job-tracker-ui/src/job-discovery.test.tsx",
"sha256": "b334cb40fd7d7450ea3585631fb64b9ca9ded7194a714f6ce524bf57668afd4e"
},
{
"path": "job-tracker-ui/e2e/saved-search-repair.spec.ts",
"sha256": "d18d064da6ebba4ba9096076c061addfdf103c9ed4cc504d07e3263a494d61f8"
}
],
"rawEvidence": [
{
"path": ".artifacts/p5-15-01R-01/browser-red.json",
"sha256": "e854d8fabcde614ebb2be1f2535b0f7822554956beb387044a2fbc0a5cedd0b1"
},
{
"path": ".artifacts/p5-15-01R-01/browser-red-command.json",
"sha256": "8f3066a17d5fa3c5c52eefa73318564d63b37755c18baf65e698b2d47fb84f19"
},
{
"path": ".artifacts/p5-15-01R-01/browser/saved-focused.json",
"sha256": "07ddf0a473ed6399d69f3521b412c8d36af344044aff59ec028cfffb906c9521"
},
{
"path": ".artifacts/p5-15-01R-01/backend/focused-summary.json",
"sha256": "23a227c35f0c8cbd5c8aacde7012f8d28b6862ef2afa0cfe513560d9c53664f6"
},
{
"path": ".artifacts/p5-15-01R-01/backend/sqlite-list-before.txt",
"sha256": "15a2d4399a1eb49634dc905d8a40496bbb31e2add7bdb985bbda1b737a4cfc08"
},
{
"path": ".artifacts/p5-15-01R-01/backend/sqlite-list-after.sql",
"sha256": "d509d2d53f0560455bb8377d98858c627b2ff004359a509dfe7af01b0e6e1f32"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-red.json",
"sha256": "0c81161c4cba8cb51cdc63f6dc5b9f53e903a2dcd580a53e2f7769bb3fef3693"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-error-create-red.json",
"sha256": "f1522072f39e1315d66e8e7b37a6010824f22f0b7b51e1fa2beafac76b43b12e"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-final-focused.json",
"sha256": "195e8ef97e7f7403b7a3f40c88a06af2d66470a4539d6a3d2b53d89948dbaf1e"
}
],
"limitations": [
"Provider-run browser output intercepted; real runner SQLite test uses a deterministic external service.",
"Worker disabled only in test environment; no scheduler-to-notification qualification.",
"Live MariaDB and PostgreSQL not exercised; PostgreSQL is not currently configured.",
"Axe incomplete and human/device checks remain open."
]
}
@@ -0,0 +1,873 @@
{
"sourceCheckpoint": "54a377054f6138c5645a3da293dacd84d3056237",
"repairCodeCommits": [
"bcc959904915e381ef6bfe5c236d9626021681d4",
"2753d03db643c4b90b12c62748b0e844981d48b8"
],
"recordedUtc": "2026-10-09T13:23:40.922708+00:00",
"scope": "Full fresh local regression after final application change; two unrelated P2 failures remain ordinary failing cases. No production, live NAV/model/provider, human AT or physical-device certification.",
"backend": [
{
"name": "backend-full",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.dotnet/dotnet.exe",
"test",
"JobTrackerApi.Tests/JobTrackerApi.Tests.csproj",
"--configuration",
"Release",
"--no-build",
"--logger",
"trx;LogFileName=backend-full.trx",
"--results-directory",
".artifacts/p5-15-01R-01/backend/final",
"--",
"xUnit.parallelizeTestCollections=false",
"xUnit.maxParallelThreads=1"
],
"startedUtc": "2026-10-09T12:50:36.292101+00:00",
"finishedUtc": "2026-10-09T12:51:14.850457+00:00",
"exitCode": 0,
"total": 1033,
"passed": 1033,
"failed": 0,
"logSha256": "12fe4a7908242bc2451c21b68d7250e34f212c742d202becd6ed640d2562ce00",
"resultSha256": "cf9ca7ee77e29e7f3b6dbb816eb5d8f63df7e171b0c4f10391185d7813868bef"
},
{
"name": "cv-revision",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.dotnet/dotnet.exe",
"test",
"JobTrackerApi.Tests/JobTrackerApi.Tests.csproj",
"--configuration",
"Release",
"--no-build",
"--filter",
"FullyQualifiedName~CvRevisionReadinessTests",
"--logger",
"trx;LogFileName=cv-revision.trx",
"--results-directory",
".artifacts/p5-15-01R-01/backend/final",
"--",
"xUnit.parallelizeTestCollections=false",
"xUnit.maxParallelThreads=1"
],
"startedUtc": "2026-10-09T12:51:14.884357+00:00",
"finishedUtc": "2026-10-09T12:51:23.769542+00:00",
"exitCode": 0,
"total": 5,
"passed": 5,
"failed": 0,
"logSha256": "65c5d0bdacfbdb7e6445dce4c2430de022b01bbe76665e1b74539ff33a079f2d",
"resultSha256": "de68eef51c333707474827efdc3a3d0ea4017d95f6b5658b1b79307f242a0287"
},
{
"name": "focused-ai",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.dotnet/dotnet.exe",
"test",
"JobTrackerApi.Tests/JobTrackerApi.Tests.csproj",
"--configuration",
"Release",
"--no-build",
"--filter",
"FullyQualifiedName~CvAi|FullyQualifiedName~AiWorkspace|FullyQualifiedName~AiPrivacyPolicy|FullyQualifiedName~MeteredSummarizerService",
"--logger",
"trx;LogFileName=focused-ai.trx",
"--results-directory",
".artifacts/p5-15-01R-01/backend/final",
"--",
"xUnit.parallelizeTestCollections=false",
"xUnit.maxParallelThreads=1"
],
"startedUtc": "2026-10-09T12:51:23.771541+00:00",
"finishedUtc": "2026-10-09T12:51:36.791416+00:00",
"exitCode": 0,
"total": 108,
"passed": 108,
"failed": 0,
"logSha256": "c43ec1fdc923469e004c4a70ca0c781896802b279ad5f6b2acb971d6c8f26cf5",
"resultSha256": "df115fb5e161b109de8f38e88965c800f7f91de1d12d3ec3d0dfcc71132db7b0"
}
],
"backendBuilds": [
{
"name": "api-release-build",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.dotnet/dotnet.exe",
"build",
"JobTrackerApi/JobTrackerApi.csproj",
"--configuration",
"Release",
"--no-restore",
"-warnaserror"
],
"startedUtc": "2026-10-09T12:42:23.030024+00:00",
"finishedUtc": "2026-10-09T12:42:24.991361+00:00",
"exitCode": 0,
"log": ".artifacts\\p5-15-01R-01\\backend\\full\\api-release-build.log",
"logSha256": "44bcf29e7f4181ef797bc566ef0410debaafcba274e1b8bb6c6eb02f9f0a6c7b",
"warnings": 0,
"errors": 0
},
{
"name": "backend-test-project-release-build",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.dotnet/dotnet.exe",
"build",
"JobTrackerApi.Tests/JobTrackerApi.Tests.csproj",
"--configuration",
"Release",
"--no-restore",
"-warnaserror"
],
"startedUtc": "2026-10-09T12:42:24.994735+00:00",
"finishedUtc": "2026-10-09T12:42:27.962238+00:00",
"exitCode": 0,
"log": ".artifacts\\p5-15-01R-01\\backend\\full\\backend-test-project-release-build.log",
"logSha256": "cd0b2eb3404c9e9d059394ca8b4dcd074fbdd455a9a93c08ff06804f38d6983f",
"warnings": 0,
"errors": 0
}
],
"offlineHelpers": [
{
"name": "sidecar",
"command": [
"rtk",
"proxy",
"tools/summarizer/.venv/Scripts/python.exe",
"-m",
"pytest",
"tools/summarizer/tests",
"-q",
"-o",
"cache_dir=E:/Storage/Projects/Active/Job tracker/.artifacts/p5-15-01R-01/backend/full/helpers/pytest-cache",
"--basetemp=E:/Storage/Projects/Active/Job tracker/.artifacts/p5-15-01R-01/backend/full/helpers/pytest-tmp",
"--junitxml=E:/Storage/Projects/Active/Job tracker/.artifacts/p5-15-01R-01/backend/full/helpers/sidecar.xml"
],
"startedUtc": "2026-10-09T12:43:47.564095+00:00",
"finishedUtc": "2026-10-09T12:44:16.395351+00:00",
"durationSeconds": 28.831,
"exitCode": 0,
"expectedPassed": 49,
"log": ".artifacts/p5-15-01R-01/backend/full/helpers/sidecar.log",
"logSha256": "634ab03038f5a35121b63aad69a1bd0c8961a00b1cf58af9e69aeb235edc2186",
"logModifiedUtc": "2026-10-09T12:44:14.862921+00:00",
"offlineEnvironment": {
"AI_SERVICE_SKIP_MODEL_LOAD": "1",
"HF_HUB_OFFLINE": "1",
"TRANSFORMERS_OFFLINE": "1"
},
"resultFile": ".artifacts/p5-15-01R-01/backend/full/helpers/sidecar.xml",
"resultFileSha256": "fafd4a05635473afb5a9b0f14a92b1811ae28f0c6932a1574ece8501d6c6dab1",
"total": 49,
"passed": 49,
"failed": 0,
"errors": 0,
"skipped": 0,
"countEvidence": "Fresh JUnit testcase elements and child outcomes",
"result": "PASS",
"includedInBackendTotal": false
},
{
"name": "configuration-tests",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe",
"-X",
"utf8",
"scripts/test-ingress.py"
],
"startedUtc": "2026-10-09T12:44:16.400409+00:00",
"finishedUtc": "2026-10-09T12:44:18.583189+00:00",
"durationSeconds": 2.183,
"exitCode": 0,
"expectedPassed": 3,
"log": ".artifacts/p5-15-01R-01/backend/full/helpers/configuration-tests.log",
"logSha256": "aa637d65ede334309d02f12566eced759eff89e1db332ff863588039ff458ed9",
"logModifiedUtc": "2026-10-09T12:44:18.538095+00:00",
"offlineEnvironment": {
"AI_SERVICE_SKIP_MODEL_LOAD": "1",
"HF_HUB_OFFLINE": "1",
"TRANSFORMERS_OFFLINE": "1"
},
"total": 3,
"passed": 3,
"failed": 0,
"errors": 0,
"skipped": 0,
"countEvidence": "Completed unittest count and final status in fresh log",
"unittestStatus": "OK",
"result": "PASS",
"includedInBackendTotal": false
},
{
"name": "supply-chain-tests",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe",
"-X",
"utf8",
"scripts/test-supply-chain.py"
],
"startedUtc": "2026-10-09T12:44:18.585710+00:00",
"finishedUtc": "2026-10-09T12:44:19.199927+00:00",
"durationSeconds": 0.614,
"exitCode": 0,
"expectedPassed": 3,
"log": ".artifacts/p5-15-01R-01/backend/full/helpers/supply-chain-tests.log",
"logSha256": "6924b28cc88b7cac53870e7e2d408fce1a1a9bbfaeec3d703a81cecd9f45f47d",
"logModifiedUtc": "2026-10-09T12:44:19.147321+00:00",
"offlineEnvironment": {
"AI_SERVICE_SKIP_MODEL_LOAD": "1",
"HF_HUB_OFFLINE": "1",
"TRANSFORMERS_OFFLINE": "1"
},
"total": 3,
"passed": 3,
"failed": 0,
"errors": 0,
"skipped": 0,
"countEvidence": "Completed unittest count and final status in fresh log",
"unittestStatus": "OK",
"result": "PASS",
"includedInBackendTotal": false
},
{
"name": "offline-evaluation-tests",
"command": [
"rtk",
"proxy",
"C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe",
"-X",
"utf8",
"scripts/test-ollama-evaluation.py"
],
"startedUtc": "2026-10-09T12:44:19.204129+00:00",
"finishedUtc": "2026-10-09T12:44:21.074598+00:00",
"durationSeconds": 1.87,
"exitCode": 0,
"expectedPassed": 5,
"log": ".artifacts/p5-15-01R-01/backend/full/helpers/offline-evaluation-tests.log",
"logSha256": "a820afabfc6e7fa7237921782b7986fa449905db745e943ddf53c077e2cb9dd2",
"logModifiedUtc": "2026-10-09T12:44:20.997248+00:00",
"offlineEnvironment": {
"AI_SERVICE_SKIP_MODEL_LOAD": "1",
"HF_HUB_OFFLINE": "1",
"TRANSFORMERS_OFFLINE": "1"
},
"total": 5,
"passed": 5,
"failed": 0,
"errors": 0,
"skipped": 0,
"countEvidence": "Completed unittest count and final status in fresh log",
"unittestStatus": "OK",
"result": "PASS",
"includedInBackendTotal": false
},
{
"name": "extension-tests",
"command": [
"rtk",
"proxy",
"node",
"--test",
"browser-extension/tests/capture-url.test.mjs"
],
"startedUtc": "2026-10-09T12:44:21.078100+00:00",
"finishedUtc": "2026-10-09T12:44:21.695324+00:00",
"durationSeconds": 0.617,
"exitCode": 0,
"expectedPassed": 3,
"log": ".artifacts/p5-15-01R-01/backend/full/helpers/extension-tests.log",
"logSha256": "f7a52d7888df13403de0b520d1a18ad94ea3fe06253035e4bb3fbdd9804d5862",
"logModifiedUtc": "2026-10-09T12:44:21.645359+00:00",
"offlineEnvironment": {
"AI_SERVICE_SKIP_MODEL_LOAD": "1",
"HF_HUB_OFFLINE": "1",
"TRANSFORMERS_OFFLINE": "1"
},
"total": 3,
"passed": 3,
"failed": 0,
"cancelled": 0,
"skipped": 0,
"todo": 0,
"countEvidence": "Node test-runner final counters in fresh log",
"result": "PASS",
"includedInBackendTotal": false
}
],
"frontend": {
"passed": 464,
"failed": 0,
"total": 464,
"suites": 82,
"commands": [
{
"name": "app-typescript",
"command": [
"rtk",
"proxy",
"npm.cmd",
"run",
"typecheck"
],
"startedUtc": "2026-10-09T12:47:29.839544+00:00",
"finishedUtc": "2026-10-09T12:48:00.153621+00:00",
"exitCode": 0
},
{
"name": "frontend-lint",
"command": [
"rtk",
"proxy",
"npm.cmd",
"run",
"lint"
],
"startedUtc": "2026-10-09T12:48:00.153621+00:00",
"finishedUtc": "2026-10-09T12:48:59.698786+00:00",
"exitCode": 0
},
{
"name": "frontend-production-build",
"command": [
"rtk",
"proxy",
"npm.cmd",
"run",
"build"
],
"startedUtc": "2026-10-09T12:48:59.703350+00:00",
"finishedUtc": "2026-10-09T12:49:13.505463+00:00",
"exitCode": 0
}
],
"intermediateRun": {
"command": {
"name": "frontend-full",
"command": [
"rtk",
"proxy",
"npm.cmd",
"test",
"--",
"--runInBand",
"--watchAll=false",
"--json",
"--outputFile=../.artifacts/p5-15-01R-01/frontend/jest.json"
],
"startedUtc": "2026-10-09T12:41:15.067098+00:00",
"finishedUtc": "2026-10-09T12:47:29.836544+00:00",
"exitCode": 0
},
"startedBeforeLastUiChange": true,
"usedForFinalBaseline": false
},
"finalRun": {
"command": [
"rtk",
"proxy",
"npm.cmd",
"test",
"--",
"--runInBand",
"--watchAll=false",
"--json",
"--outputFile=../.artifacts/p5-15-01R-01/frontend-final/jest.json"
],
"startedUtc": "2026-10-09T12:57:45.984405+00:00",
"finishedUtc": "2026-10-09T13:00:48.715429+00:00",
"exitCode": 0
},
"earlierAttempt": {
"passed": 463,
"failed": 1,
"case": "[P5-11 PRES-C06 C10 E08] returning from preview focuses the existing editor without changing the pending draft",
"isolatedRerunPassed": 1,
"applicationCodeChangedForRetry": false,
"cause": "Not established; intermittent observed assertion failure retained, no CV repair."
}
},
"ordinaryBrowser": {
"passed": 124,
"failed": 1,
"total": 125,
"inheritedPassing": 117,
"auditPassing": 4,
"auditFailing": 1,
"repairPassing": 3,
"skipped": 0,
"expectedFailures": 0,
"failedCases": [
"[P5-15-01 E02 E07 A01] all 32 routes retain native entry, refresh and anonymous permissions"
],
"stats": {
"startTime": "2026-10-09T12:52:47.261Z",
"duration": 1586652.9170000001,
"expected": 124,
"skipped": 0,
"unexpected": 1,
"flaky": 0
}
},
"diagnostics": {
"passed": 1,
"failed": 1,
"total": 2,
"rulesDraft": {
"original": 14,
"draft": 5,
"visibleDraft": "14",
"persisted": 14,
"ruleWrites": 0,
"readbackStatus": 200
},
"stats": {
"startTime": "2026-10-09T13:20:05.270Z",
"duration": 15429.199,
"expected": 1,
"skipped": 0,
"unexpected": 1,
"flaky": 0
}
},
"securityHttp": {
"http": {
"startTime": "2026-10-09T13:19:14.621Z",
"duration": 16866.354,
"expected": 2,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"rate-limit": {
"startTime": "2026-10-09T13:19:32.060Z",
"duration": 14271.636,
"expected": 9,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"ingress": {
"startTime": "2026-10-09T13:19:46.906Z",
"duration": 7677.677000000001,
"expected": 6,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"pdf-admission": {
"startTime": "2026-10-09T13:19:55.190Z",
"duration": 9524.312,
"expected": 1,
"skipped": 0,
"unexpected": 0,
"flaky": 0
}
},
"fidelity": {
"fidelity": {
"passed": 16,
"total": 16,
"previewPages": 36,
"pdfPages": 36,
"tolerances": {
"pageDimensionMm": 0.5,
"positionMm": 2,
"fontPt": 0.5,
"rgbComponent": 0.00392156862745098,
"pageCountAndMembership": "exact"
},
"measurementFingerprint": {
"path": ".artifacts/p5-15-01R-01/browser/fidelity/measurements.json",
"sha256": "31b649504e77a89cc9b326ff53c4c9d430a21bcad14f721bb1b957d6ba6d4266"
},
"resultFingerprint": {
"path": ".artifacts/p5-15-01R-01/browser/fidelity/fidelity-results.json",
"sha256": "98abd84d63708f1c632e29c8b8d37e1083811979365162ffea2e4e1bf48ea373"
},
"nativeFiles": [
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-modern/render.html",
"sha256": "8e768156c7ffd4ad8dae6914a6a57baa5114668dc53a861f3925e0be8cffb8aa"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-modern/export.pdf",
"sha256": "2d31acf639756cc3a62bcd69ef71c37ebffb4b785118eb672b07f0feea55c67b"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-minimal/render.html",
"sha256": "26bd74195f0f5ed917751ec5aeb0321ef156f93f105e889cea3fa67b2952bb1c"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-minimal/export.pdf",
"sha256": "41344fe30597e3ac6abc9b170fc71fa57a8dca5752fa428af8662d1f898841ee"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-executive/render.html",
"sha256": "d57da767c7c6cf446fe351fd381d33b95b555423db21feb84c9c1346775d8c48"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-executive/export.pdf",
"sha256": "730b3c03f5b9c5be768de30cbd2dc3a7e5850b93e4281360f8353bd17d33c80b"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-technical/render.html",
"sha256": "681554ff60e68efa848e0a9e0ea6c2776526ea6a2017a05952ef724b08fc9e95"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-technical/export.pdf",
"sha256": "83999e14263d0f736b8b903afbd1979f080f2bf4414c08a4def3dc3000fd099b"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-ats-classic/render.html",
"sha256": "f290eeef533983ea8a46c536e9747c0d88ee2cb7275f94366561c89645dc947b"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-ats-classic/export.pdf",
"sha256": "282bdfc748e8c6ee00b95f4f26db492e9c4d9befa5e2c8bf77813eb11dc1ace0"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-nordic/render.html",
"sha256": "361c0d55d3596a6e56d03b02bdecd9c9dbf6b48b7cb0a4add7d75382ca3e2958"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-nordic/export.pdf",
"sha256": "5f2ea45ce8347d3c0a6574c37e12a1aef68aad14d6dff1c504cd1edc764ea8fb"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-elegant/render.html",
"sha256": "816163e97d55be1fd726228fad0f7da471c707ca7879f0fbb036a1324dbdea47"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-elegant/export.pdf",
"sha256": "1beae06e1d2751312235db35220a7bea05d56bdd8327865075aac8f714ffbadf"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-creative/render.html",
"sha256": "1cd723eb101ac3d06f87b4c2f8fa28e53252075a0f3ff5aa6002d6f6c2be6799"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-creative/export.pdf",
"sha256": "0ef17ff5abfc6d62a68763b20294f05d02eabbbf7cb91a1eeec1efb450ccaad5"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-code/render.html",
"sha256": "579dbd0e1c14afdee09f29f652e7742f5082c22e2de5f7c7ed06b954a2568d35"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/default-code/export.pdf",
"sha256": "c72514d04a456c0c41cd20564c32069eda8232a68c483be524929c7627f9e281"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/long-en-minimal/render.html",
"sha256": "2506bfc9473a1096e29f643b6d2958ff941e226e91ee67b7f05323dd28646a6a"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/long-en-minimal/export.pdf",
"sha256": "22713afc57374b9540cdee70b971f7b79cba0dead13fa3b94c922bbbf51d6763"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/long-nb-code/render.html",
"sha256": "48bcca5d8713960e7543d4f150bf1c7cc96e7227d9b04b69ed063241dbbc68df"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/long-nb-code/export.pdf",
"sha256": "bd0c4f641e80383cbef93f8cd2d0d3d7bd62cfc77895333a9ef05f36e6c103ee"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/compact-8mm-letter/render.html",
"sha256": "515fbd6d8e0d031d86fa4cf08dc71c8c508fb84ea385aa19116f6cf13c9c7567"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/compact-8mm-letter/export.pdf",
"sha256": "f6a2718b4da4c857d038645e711d4003a25c5766e1aa334ca68a6f58549aaf80"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/roomy-28mm-nb/render.html",
"sha256": "cc0052318c874c2600ea0c137bd377411c0f6cd1c0115c1ed65c0d1173a3f1b9"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/roomy-28mm-nb/export.pdf",
"sha256": "838ce6a51f0269a7a4c4c02a4ca1ed27d1f9ef960c041943f350bcfb283b4825"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/grid-and-bubbles/render.html",
"sha256": "1e5fc270a8ecf02a6e6bd7ac7b0d1d50c9f15baa00fb4c37a39b7ab3c141de37"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/grid-and-bubbles/export.pdf",
"sha256": "9ea510229adf6474ecaf685dc30393bdba2227960b05bd4bc9c1cd4d0e44f6ca"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/long-sidebar-nb/render.html",
"sha256": "823db293254304db0d8ca2a9bf249af6dd343de959d4a965e741ae4cde633590"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/long-sidebar-nb/export.pdf",
"sha256": "9a948cc39f5cfd90f7691d8e7d6e4064005ffef32e7270be7573dabe84895915"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/unbreakable-and-boundary/render.html",
"sha256": "3faf425eb9ecf0be7e5294b5f60859133f24276df9a9d6ed2e569c3cd7069978"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity/unbreakable-and-boundary/export.pdf",
"sha256": "9564c015ec418b34ca0c9ded3a1c2ffbf7731df664e3cbefc68aa53a8d2bd0f9"
}
]
},
"settings-fidelity": {
"passed": 8,
"total": 8,
"previewPages": 24,
"pdfPages": 24,
"tolerances": {
"pageDimensionMm": 0.5,
"positionMm": 2,
"fontPt": 0.5,
"rgbComponent": 0.00392156862745098,
"pageCountAndMembership": "exact"
},
"measurementFingerprint": {
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/measurements.json",
"sha256": "8f98e92f62c7dfcbbf645cba88b139ec977e881a9f8f9fc25144708fa97c4016"
},
"resultFingerprint": {
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/fidelity-results.json",
"sha256": "baf25ba3f32119734b6aacf541648df6d74474274346b7f8d5db256cd0bdbcd9"
},
"nativeFiles": [
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-en-before/render.html",
"sha256": "846199be1b9e432aa9acfc0836a258e7e349a59f7ae2f199284e276c2a94f159"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-en-before/export.pdf",
"sha256": "ef8341dd75bc5d08d1c9bc3498a141d4703ddcafaad63197850c1d65c9e61564"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-en-after/render.html",
"sha256": "fc201751536f5f853fafafffe8d3ab6d6801a54fd561f2325b984044b292ae3c"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-en-after/export.pdf",
"sha256": "f564cebb2e75b2bc286ffd3eb65c1ac803e884d10d9e25fd44cffcf8bbee8a1b"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-nb-before/render.html",
"sha256": "b5972b49c6b2d19f22af90b1ab72088aac0548e068695f301764f24ca1b362e2"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-nb-before/export.pdf",
"sha256": "0afa5935e0481b958ff0db10eba9c403cf983994e88c678d94d71c8d363848ab"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-nb-after/render.html",
"sha256": "6922fe87ff0a6bcd83500fbb12bccd1d6091f35486aa39a8fc6b9c358817e64d"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/dark-nb-after/export.pdf",
"sha256": "d38a185bb38f9c16a5475efa8672a20865a0f633d16c74dbb653e8cf12403054"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-en-before/render.html",
"sha256": "846199be1b9e432aa9acfc0836a258e7e349a59f7ae2f199284e276c2a94f159"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-en-before/export.pdf",
"sha256": "4694d0f9067fcea93c68fd6076a9b19ecdeb0672522a900f4eab9275058a930a"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-en-after/render.html",
"sha256": "fc201751536f5f853fafafffe8d3ab6d6801a54fd561f2325b984044b292ae3c"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-en-after/export.pdf",
"sha256": "e6f3ef1059ab4cf56a41aa16cdd1b128ebabff9c738f09a6bbe93e13b751bad0"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-nb-before/render.html",
"sha256": "b5972b49c6b2d19f22af90b1ab72088aac0548e068695f301764f24ca1b362e2"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-nb-before/export.pdf",
"sha256": "10fd4dbd848f75c25897c811ff55387efefbb39b2d1cd4ee8d3f5c111ff65598"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-nb-after/render.html",
"sha256": "6922fe87ff0a6bcd83500fbb12bccd1d6091f35486aa39a8fc6b9c358817e64d"
},
{
"path": ".artifacts/p5-15-01R-01/browser/settings-fidelity/light-nb-after/export.pdf",
"sha256": "9d6f0a3bb13b401a6a4db959879a99427772ff03aef740b8563dd62e7301ae48"
}
]
}
},
"nativeSavedSearchAfterReads": [
{
"identity": "normal",
"pattern": "/discover",
"mode": "entry",
"destination": "/discover",
"status": 200
},
{
"identity": "normal",
"pattern": "/discover",
"mode": "refresh",
"destination": "/discover",
"status": 200
},
{
"identity": "admin",
"pattern": "/discover",
"mode": "entry",
"destination": "/discover",
"status": 200
},
{
"identity": "admin",
"pattern": "/discover",
"mode": "refresh",
"destination": "/discover",
"status": 200
}
],
"routes": {
"patterns": 32,
"original": 31,
"analyticsAdded": 1,
"observations": 192,
"selectedNativeReads": 98,
"failed500Reads": 0,
"allEntryRefreshAssertionsSatisfied": true,
"loginQueryFailureRemains": true
},
"axe": {
"scans": 251,
"violationEntries": 0,
"incompleteNodeOccurrences": 1880
},
"incompleteRules": {
"color-contrast": 1624,
"aria-prohibited-attr": 209,
"aria-hidden-focus": 25,
"aria-valid-attr-value": 18,
"th-has-data-cells": 4
},
"preservationCurrent": {
"PASS": 0,
"PARTIAL": 54,
"FAIL": 2,
"DEFERRED": 1,
"BLOCKED": 0,
"NOT VERIFIED": 0,
"total": 57
},
"rawEvidence": [
{
"path": ".artifacts/p5-15-01R-01/browser/commands.json",
"sha256": "fec661f95d4a70c4aac54637c783aefdfc8c99ddf651b6248a98da15da37ffdc"
},
{
"path": ".artifacts/p5-15-01R-01/browser/fidelity-commands.json",
"sha256": "6fe384df5d3db04ac78ac9ae74bcf1c3b4fa822f0628e7054e761d6c40d5d213"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-final/command.json",
"sha256": "f93df3459e4d6864717fb4073c4ac0b458db2fc2f0927d918c372e2a21d08fa7"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-final/jest.json",
"sha256": "0f45ad07fd7cca7941d1695c0271d552c4c6832b5de957ec4202c84649eaaee3"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-final/attempt1-command.json",
"sha256": "445412085d24578774ae349ea05ecdd678ce898bae3a7b618edbaf57ba73674e"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-final/attempt1-jest.json",
"sha256": "2ba7294cb7314345d70d2d8cfe7f1f6b3f04ec348a20c108f7e86c83b0a1d3f8"
},
{
"path": ".artifacts/p5-15-01R-01/frontend-final/cv-preview-diagnostic.json",
"sha256": "0eb314d9f7286b57790219db78ac8660fe014a7d50acf39129bcdf689e8cce62"
},
{
"path": ".artifacts/p5-15-01R-01/frontend/summary.json",
"sha256": "7e095c1903e3e342cc3adf7ef072e976f4d605780936662803975ba0836e37c2"
},
{
"path": ".artifacts/p5-15-01R-01/backend/final/summary.json",
"sha256": "49da5559757106c1857c515f272b31e7b16e18048db01cc097ead4467fae2156"
},
{
"path": ".artifacts/p5-15-01R-01/backend/full/helpers/helper-summary.json",
"sha256": "238300c66b07173ffc25b4e0db3d9b55fc2d2970e52d2399f8004141f5a3191b"
},
{
"path": ".artifacts/p5-15-01R-01/browser/main.json",
"sha256": "6ee325e33a49f0ef4960ab9c6558452d3e1d4cddb4be4162c6a9a7c98bd0510b"
},
{
"path": ".artifacts/p5-15-01R-01/browser/diagnostics.json",
"sha256": "12e1f44134e2f31913fadef91e9e52b27057e6b1b004936defb383162491f7a3"
},
{
"path": ".artifacts/p5-15-01R-01/browser/http.json",
"sha256": "9bd34045eacfe9d8e633e9009f9c93a9556c7df7fb58cc03cca0f42e20d86333"
},
{
"path": ".artifacts/p5-15-01R-01/browser/rate-limit.json",
"sha256": "b0712bafb26e9d3a09a258f49d71a837c675017554f63cbaf0dfee5219b92a66"
},
{
"path": ".artifacts/p5-15-01R-01/browser/ingress.json",
"sha256": "4227372db35dae85a22b3d1bb993d37a3edb64738d82caf401256a5c0db2a218"
},
{
"path": ".artifacts/p5-15-01R-01/browser/pdf-admission.json",
"sha256": "ea2295b623b2320b8905e8cedfed90ae96e0dfe73dba96db5778f94eca216e56"
}
],
"manualVisualReview": {
"by": "Coding agent inspecting genuine captured images, not an independent human or assistive-technology acceptance.",
"observations": [
"EN light desktop saved-list error and Retry remain visible beside a usable one-off result.",
"EN dark390px failure wraps without horizontal overflow; retry is reachable.",
"Bokmål light390px native retry restores saved controls while preserving changed input/result."
]
},
"production": {
"decision": "NO-GO",
"branch": "main",
"revision": "27657f31131cd95d42f0e1290853ec9c9b3959a4",
"modified": false
},
"limits": [
"Live MariaDB/PostgreSQL/NAV not qualified; PostgreSQL not configured.",
"Provider-dependent browser output intercepted; actual SQLite runner uses a deterministic external service.",
"Scheduler/browser notification chain, physical touch and human screen-reader checks remain unverified.",
"F04, backup/restore, production config/schema/keys and rollback remain release blockers.",
"P5-13 remains deferred/unqualified/Production-withheld; no qualification/UI/activation.",
"No P5-15-02, Analytics/Rules repair, B07 or production deployment."
]
}