diff --git a/README.md b/README.md index 1239382..7c564c7 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Job Tracker (Jobjakt) is a self-hosted workspace for managing job applications, - Next.js 16 / React 19 / TypeScript / MUI frontend - ASP.NET Core 9 / EF Core 9 API -- SQLite by default; MariaDB/MySQL for server deployments +- MariaDB across development, integration testing, CI and production; SQLite retained only during staged retirement - FastAPI document/AI service with optional Ollama, Gemini, or Groq CV routing - Docker Compose + nginx; Gitea Actions deployment @@ -22,7 +22,15 @@ docker compose -f docker-compose.yml -f docker-compose.dev.yml up --build Open `http://localhost:3000`. The API is available at `http://localhost:5202` in local process development. -For local processes: +For local processes, start the separate persistent development database first: + +```powershell +docker compose -f docker-compose.database.yml up -d --wait mariadb-dev +``` + +Then run the API/UI below. Development settings use only the loopback `jobtracker_dev` database; +startup applies the existing migrations. [MariaDB setup and qualification](docs/database/mariadb-standardisation/README.md) +documents the pinned server, disposable integration lane, credentials and data-preservation rules. ```powershell cd JobTrackerApi @@ -38,6 +46,7 @@ npm run dev ```powershell dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --no-restore +python scripts/mariadb-integration.py cd job-tracker-ui npm run lint npm test -- --runInBand diff --git a/deploy/MARIADB.md b/deploy/MARIADB.md index b2d0576..7b76e40 100644 --- a/deploy/MARIADB.md +++ b/deploy/MARIADB.md @@ -1,10 +1,14 @@ # MariaDB production bootstrap ## What this app supports -- SQLite for local/dev fallback -- MariaDB/MySQL for production when configured with: +- MariaDB for local development, integration testing, CI and production; explicit SQLite is a temporary existing-data/legacy-test path, never an automatic fallback. +- MariaDB is configured with: - `DATABASE_PROVIDER=mariadb` - `JOBTRACKER_CONNECTION_STRING=...` + - `DATABASE_SERVER_VERSION=12.2.2` (owner-verified production version; do not upgrade production implicitly) + +For isolated development and CI use the [current setup and qualification record](../docs/database/mariadb-standardisation/README.md). +The old production bootstrap below is an operator runbook, not authorization for this development task. ## 1. Create database and user in MariaDB Run this against your MariaDB server/container: diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md index cbad53a..f76fb79 100644 --- a/docs/architecture/overview.md +++ b/docs/architecture/overview.md @@ -8,7 +8,7 @@ Last verified: 2026-09-11 against the current repository. flowchart LR Browser --> Nginx[nginx static frontend] Nginx --> API[ASP.NET Core API] - API --> DB[(SQLite or MariaDB/MySQL)] + API --> DB[(MariaDB)] API --> Data[Data root: uploads, CV artifacts, exports, keys] API --> AI[FastAPI AI service] AI --> Local[local transformers/Ollama] @@ -25,13 +25,18 @@ The frontend is a client-rendered React application inside a Next.js static-expo |---|---| | UI | Next.js 16, React 19, TypeScript 5.9, MUI 7, React Router 7 | | API | ASP.NET Core 9, EF Core 9, ASP.NET Identity, JWT bearer, cookie sessions | -| Data | SQLite default; Pomelo MySQL/MariaDB provider for server deployments | +| Data | MariaDB standard for development/integration/CI/production; Pomelo 9.0.0, EF Core 9.0.14; explicit SQLite transition path retained pending safe retirement | | AI | FastAPI, transformers/distilbart summarizer, OCR and document extractors, Ollama/Gemini/Groq CV routes | | Runtime | Docker Compose, nginx 1.29-alpine, optional Ollama profile | | Delivery | Gitea Actions → SSH deployment → Docker Compose | Further detail: [frontend architecture](frontend.md), [backend architecture](backend.md), [data flow](data-flow.md), [integrations](integrations.md), [database schema](../database/schema.md), and [deployment](../infrastructure/deployment.md). +Database architecture decision updated 23 October 2026: production is owner-verified MariaDB +12.2.2, previously running floating `mariadb:latest`. The development/integration image is pinned +by version and verified registry manifest digest. [Standardisation record](../database/mariadb-standardisation/README.md) +separates actual runtime evidence, exact-image limits, remaining CI qualifications and staged SQLite retirement. + The older [architecture/current.md](current.md) path is retained as a compatibility pointer to this overview. ## Important boundaries diff --git a/docs/configuration/environment-variables.md b/docs/configuration/environment-variables.md index 35c1336..eadb8a3 100644 --- a/docs/configuration/environment-variables.md +++ b/docs/configuration/environment-variables.md @@ -6,8 +6,9 @@ This table covers the variables in `.env.example`, their Docker Compose mappings | Variable | Required | Service | Secret | Default | Description | |---|---|---|---|---|---| -| `DATABASE_PROVIDER` | Production | Compose/API | No | `sqlite` | `sqlite`, `mariadb`, or `mysql`; also selects the backup path. | -| `JOBTRACKER_CONNECTION_STRING` | Conditional | API | Yes | — | Server database connection string; ignored for SQLite. | +| `DATABASE_PROVIDER` | Production | Compose/API | No | `mariadb` | MariaDB standard; `mysql` alias retained, explicit `sqlite` only for transitional preservation. Unknown values fail closed. | +| `DATABASE_SERVER_VERSION` | No | Compose/API | No | `12.2.2` | Configured MariaDB `major.minor.patch`; registration never connects to auto-detect. | +| `JOBTRACKER_CONNECTION_STRING` | MariaDB | Compose/API | Yes | — | Required for MariaDB; missing configuration never falls back. Direct API equivalent: `ConnectionStrings__JobTracker`. Explicit SQLite can supply its existing path. | | `APP_PUBLIC_BASE_URL` | Production | API/UI | No | — | Canonical external origin for links, callbacks, cookies, billing, and host validation. | | `APP_VERSION` | No | API | No | — | Release/version metadata. | | `APP_COMMIT_SHA` | No | API | No | — | Release commit metadata. | diff --git a/docs/configuration/environments.md b/docs/configuration/environments.md index 870f051..3775843 100644 --- a/docs/configuration/environments.md +++ b/docs/configuration/environments.md @@ -2,11 +2,17 @@ ## Local development -SQLite and localhost defaults are supported. Run the API on 5202 and the UI on 3000, or use the development Compose override. Use seeded development credentials only from local settings and never reuse them in production. +MariaDB is the standard. Start the isolated persistent service in `docker-compose.database.yml`, +then run the API on 5202 and UI on 3000. Development settings use only loopback port33306 and +development-only credentials. See [MariaDB setup](../database/mariadb-standardisation/README.md). +Explicit SQLite selection is temporary for existing data and legacy test fixtures; it is never an automatic fallback. ## Tests -Jest, Playwright, xUnit, and the Python tests create isolated fixtures or temporary databases. They may set test-only variables such as `AI_SERVICE_SKIP_MODEL_LOAD`; they must not use a real database, mailbox, provider key, or production URL. +Jest, Playwright, xUnit and Python use isolated fixtures. The MariaDB integration lane uses an actual +disposable local server and creates only generated `jt_it_*` schemas. Never use an existing user or +production database, mailbox, provider key or production URL. Legacy SQLite/InMemory tests remain +explicitly labelled transition evidence and cannot substitute for MariaDB qualification. ## Production diff --git a/docs/database/README.md b/docs/database/README.md index 6e6f6e0..65c9c8d 100644 --- a/docs/database/README.md +++ b/docs/database/README.md @@ -1,6 +1,10 @@ # Database -EF Core owns the current schema and migrations. SQLite is the local default; MariaDB/MySQL is supported for server deployments. +EF Core owns the schema/migrations. MariaDB is the standard application database for local +development, integration testing, CI and production. SQLite is an explicit temporary preservation +and legacy-test path pending staged retirement, not an alternate architecture. + +- [MariaDB setup, RD21 qualification and retirement decisions](mariadb-standardisation/README.md) - [Schema overview](schema.md) - [Migrations and compatibility](migrations.md) diff --git a/docs/database/mariadb-standardisation/ACCEPTANCE.md b/docs/database/mariadb-standardisation/ACCEPTANCE.md new file mode 100644 index 0000000..05a75da --- /dev/null +++ b/docs/database/mariadb-standardisation/ACCEPTANCE.md @@ -0,0 +1,83 @@ +# MariaDB standardisation and RD21 qualification — 24 October 2026 + +RD21 is **resolved within the qualified MariaDB 12.2.2 save/concurrency scope**. The pinned official +Linux/amd64 image passes the actual Docker Compose persistence lane and a native browser/API recovery +journey with independent SQL reads. This supersedes the earlier addendum's missing-MariaDB blocker; +it does not reaccept all of Phase 9 or authorize release. + +Baseline: `0d16a691e0249fe1264bf960de5e59eaa9b87fed`. Implementation checkpoint: `a2c9bda` on +`codex/rd21-mariadb-standardisation`. Main stays `5f835e54a9b74e6b71418422e28431b2af06453f`. +Raw runtime timestamps are UTC on 23 October; the owner's local report date is 24 October. +See [machine-readable validation](validation.json), [setup](README.md), and [runtime provenance](runtime-provenance.json). + +## Separate decisions + +| Gate | Verdict | Evidence or remaining blocker | +| --- | --- | --- | +| MariaDB 12.2.2 RD21 qualification | **PASS, bounded resolution** | 32 real-provider cases and one native browser journey; durable SQL state, transactions, rejected drafts, revision conflicts, recovery and tenant isolation. No production image equality claim. | +| MariaDB local development | **READY** | Pinned Compose image, healthy loopback service, separate persistent development volume, API startup applies 51 migrations; synthetic company survives database stop/start. | +| MariaDB CI/integration tests | **LOCAL READY; HOSTED UNVERIFIED** | Same fail-closed runner passes 32/32 using Docker, locked restore, isolated tmpfs and generated schemas. Workflow added; no successful hosted run claimed. Runner must provide Docker/Compose and .NET 9.0.317. | +| Historical fixture repairs | **PASS** | Three obsolete revision fixtures corrected without weakening assertions: diagnostics 18/18, volume 3/3. Stale writes now assert 409 and preservation of the winner/source/history. | +| SQLite retirement | **PLAN READY; REMOVAL NO-GO** | Complete baseline classification; defaults corrected. Remaining legacy coverage, full-fidelity transfer and preservation/restore gates must precede package/branch removal. | +| MariaDB 12.3 LTS migration | **INVESTIGATION READY; MIGRATION NO-GO** | Separate 12.3.3 rehearsal proposed; target image/driver certification, copied-data upgrade, backup/restore and rollback-after-writes remain untested. | +| Phase 9 reacceptance | **NO-GO** | RD21's provider blocker closes; wider manual/device/provider/security/output/release qualifications remain. Preservation remains 57 groups/33 routes, 56 PARTIAL and C11 DEFERRED. | +| Phase 10 readiness | **NO-GO** | Phase 9 not fully reaccepted; implementation explicitly prohibited. | +| Production readiness | **NO-GO** | No production qualification, infrastructure/backup-restore/release acceptance, deployed identity verification or reviewed pinning change. No production operation performed. | + +## Verified scope and accounting + +| Lane | Final distinct results | Limits | +| --- | --- | --- | +| Existing backend Release | 1,123 passed, 0 failed/skipped | Includes 14 configuration cases; retained SQLite/InMemory contracts do not count as MariaDB qualification. | +| MariaDB Docker Compose Release | 32 passed, 0 failed/skipped | Exact official 12.2.2 image; repeated run after bridge-network cleanup fix also passes. Repeats are not added to the count. | +| Native MariaDB browser | 1 passed | Real API, Chromium and SQL client against the same pinned Docker image; controlled network failure, not power-loss testing. | +| Corrected diagnostics | 18 passed | Explicit temporary SQLite browser lane; includes data/sustained fixtures. | +| Corrected volume fixtures | 3 passed | Explicit temporary SQLite lane; separate configuration. | +| Disposable-runner guards | 5 passed | Offline subprocess doubles, including setup/cleanup failure; not database proof. | +| Browser connection guards | 10 passed | Duplicate/alias keys, remote/existing schema and port mismatches rejected. | +| Static checks | Passed | Full frontend typecheck/lint and targeted browser/config TypeScript compilation. | + +The initial real-server run failed: startup omitted three Identity columns. After schema repair, +the writer-lock test exposed dirty tracked entities when Pomelo wrapped error 1205 in +`InvalidOperationException`. Both defects were repaired and covered by real-provider assertions. +The browser then exposed an untranslatable import-history ordering query; ordering/limiting the +tenant-filtered entities before DTO projection repairs the MariaDB path. A later browser failure +used a stale Release binary after a Debug-only rebuild; the Release suite was rebuilt and the final +browser rerun passed, including import-history HTTP 200. These failures remain recorded in validation. + +The final 32 cases exercise Career Profile and Job saves, stale revision rejection, missing/legacy +revision handling, atomic projection/history/job/event updates, independent reads after commits, +controlled concurrent writes and lock timeout recovery, repeated/populated startup, additive RD21 +migration preservation and tenant isolation. They use actual InnoDB persistence with independent TCP +connections. Identity/summarizer doubles in controller fixtures do not replace database behavior; +the separate browser uses the real hosted API. They do not certify every application query or +historically restore data already overwritten before RD21. Existing creation/idempotency and +unrelated Phase 9 reliability qualifications remain outside this bounded repair. + +Production's owner-reported server is `12.2.2-MariaDB-ubu2404`, but its reported configuration ID +differs from the verified official image config. Version parity is established; exact production +image/configuration/environment parity is not. The [image record](image-provenance.json) distinguishes +manifest and config digests. Locked provider versions are Pomelo 9.0.0, EF Core 9.0.14 and +MySqlConnector 2.4.0. Real 12.2.2 results establish this application's tested compatibility, despite +Pomelo's published older tested-server matrix; they do not certify 12.3. + +## Preservation, review and operational limits + +The [SQLite audit](SQLITE_AUDIT.md) classifies 1,602 baseline references in 415 tracked files: +1,169 required historical/preservation references, 420 temporary transition references and 13 +obsolete defaults/guidance references. The obsolete active defaults/guidance were corrected; +SQLite dependencies, compatibility branches, historical migrations and user data remain preserved. +The three fixture changes have exact before/after deltas in [fixture-delta.json](fixture-delta.json). +Previous acceptance counts and reports remain historical, not silently rewritten. + +Independent review found and verified fixes for duplicate connection keys bypassing the browser's +database guard, server reuse and missing actual version verification. The generated test service +now uses the existing bridge network, avoiding leaked per-run networks. Final review has no further +actionable findings. Docker's local stale socket issue was also resolved without resetting Docker +or deleting its persistent data; see [local recovery](DOCKER_LOCAL_RECOVERY.md). + +The intended final architecture is **MariaDB only** for application development, integration, +CI and production. Keep 12.2.2 pinned for the present qualification; rehearse the supported 12.3 LTS +path separately using [the migration gates](MARIADB_12_3_PLAN.md). Retire SQLite in the documented +stages after equivalent coverage and verified preservation, not by deleting existing databases. +No main merge, deployment, production connection/container change or Phase 10 implementation occurred. diff --git a/docs/database/mariadb-standardisation/DOCKER_LOCAL_RECOVERY.md b/docs/database/mariadb-standardisation/DOCKER_LOCAL_RECOVERY.md new file mode 100644 index 0000000..bd4125e --- /dev/null +++ b/docs/database/mariadb-standardisation/DOCKER_LOCAL_RECOVERY.md @@ -0,0 +1,35 @@ +# Local Docker Desktop socket recovery — 24 October 2026 + +The reported `initializing Inference manager ... dockerInference ... file cannot be accessed` +startup failure was reproduced locally. The listener path was a zero-byte Windows reparse-point +socket; removing/moving that leaf failed with Windows error 1920. After preserving its runtime +directory, startup advanced to the same problem with the Secrets Engine's `engine.sock`. +A subsequent failed startup had left a new inference socket, so both socket-only directories +needed to be preserved together after stopping the task-started backend process tree. + +The successful attempt retained these directories as archives and created fresh originals: + +- `%LOCALAPPDATA%\Docker\run.stale-20261023-rd21` +- `%LOCALAPPDATA%\docker-secrets-engine.stale-20261024-rd21` +- `%LOCALAPPDATA%\Docker\run.stale-20261024-rd21-4e4339f5` +- `%LOCALAPPDATA%\docker-secrets-engine.stale-20261024-rd21-805dc9e6` + +Each directory's contents were inspected first: only zero-byte socket reparse points, no ordinary +files or subdirectories. No Docker data directory, image, user container, volume, WSL disk or +production resource was removed or reset. Docker then started successfully: local context +`desktop-linux`, engine `29.7.2`; health checks, pinned MariaDB containers, 32 integration cases and +the native browser recovery case passed. Docker's own updater downloaded an available installer; +this task did not install it or request a Docker upgrade. + +Do not blindly repeat directory moves while Docker is running, archive broader Docker directories, +or perform a factory reset. If this recurs, capture the exact startup error, stop only the affected +local Desktop process tree, verify that each named path still contains only disposable sockets, +and preserve it before replacement. Persistent data or unclear contents need separate review. + +Before Docker recovered, an initial task-owned image extraction filled Docker Desktop's small +bootstrap filesystem. The failed extraction was removed from its verified task-specific temporary +directory and free space restored. The successful fallback used a private 2GB tmpfs and mount +namespace under WSL; it passed the same real MariaDB tests but was labelled separately from Docker +execution. That fallback server was gracefully shut down before retrying Desktop. No preexisting +database or user data was deleted. Raw logs and before/after metadata remain under the ignored +`.artifacts/mariadb/` directory. diff --git a/docs/database/mariadb-standardisation/MARIADB_12_3_PLAN.md b/docs/database/mariadb-standardisation/MARIADB_12_3_PLAN.md new file mode 100644 index 0000000..9de648d --- /dev/null +++ b/docs/database/mariadb-standardisation/MARIADB_12_3_PLAN.md @@ -0,0 +1,56 @@ +# MariaDB 12.3 LTS migration investigation + +Research checked against official sources on 2026-10-23. Recommendation: qualify **12.3.3 LTS** as the next server target in a separate staging change, then seek operator approval for production cutover. The present standardisation work aligns with the owner-verified deployed **12.2.2-MariaDB-ubu2404**; no 12.3 runtime, upgraded production copy, restore rehearsal or deployment is claimed here. + +## Release and support evidence + +| Question | Verified finding | +| --- | --- | +| Current stable 12.3 patch | The Foundation's [release inventory](https://mariadb.org/mariadb/all-releases/) lists 12.3.3 Stable in August 2026. The [Q3 maintenance announcement](https://mariadb.org/mariadb-server-12-3-11-8-11-4-and-10-11-q3-2026-maintenance-releases-and-goodbye-10-6/) confirms 12.3.3. Official pages differ on the exact August day, so this plan relies on the version and month. Recheck for a newer stable patch when scheduling rehearsal. | +| First GA | The [12.3 LTS announcement](https://mariadb.org/mariadb-server-12-3-lts-released/) identifies 12.3.2 as the first GA in May 2026. Do not select the older RC referenced by stale release-note indexes. | +| Maintenance horizon | The Foundation's [maintenance policy and release table](https://mariadb.org/about/#maintenance-policy) list 12.3 Community maintenance through **12 June 2029**; Enterprise and Extended dates are TBC. Current policy provides Community LTS binaries for three years and critical/security source releases for two further years. This is not a promise of five years of Community binaries or a commercial support entitlement. | + +Production currently uses floating `mariadb:latest` according to the owner. A subsequent pull can change the version independently of the application release. Before any planned upgrade, record and preserve the actual source image reference, platform, registry digest and server version; verify the proposed `docker.io/library/mariadb:12.3.3` exists for the deployment architecture, retrieve its official registry manifest/index digest and record the selected platform manifest. Use a verified `version@sha256:...` reference for rehearsal and eventual rollout. No 12.3 digest was retrieved in this investigation, so none is invented here. A container `.Image` configuration ID is not a registry manifest digest. Version/digest verification remains a prerequisite, including for the rollback image. + +## Application and driver assessment + +Repository inspection found `net9.0`, Pomelo **9.0.0**, EF Core Relational **9.0.14** and locked MySqlConnector **2.4.0** in `JobTrackerApi/JobTrackerApi.csproj` and `JobTrackerApi/packages.lock.json`. Pomelo's [9.0.0 release notes](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/releases/tag/9.0.0) allow EF Core 9.0.x, .NET 8+ and MySqlConnector 2.4.0+, but list MariaDB test coverage only through **11.6**, including 11.4/10.11 LTS. They do not certify 12.2 or 12.3 for this application. + +The current [MySqlConnector compatibility table](https://mysqlconnector.net/#server-compatibility) lists MariaDB 12.x (12.3). That driver-level statement is encouraging; it does not prove that this locked older driver, Pomelo SQL generation, EF migration chain and application transaction behavior work together on 12.3. Keep the current dependency set for the first controlled comparison; upgrade a dependency separately only for a verified incompatibility or maintenance need, and rerun the same acceptance lane. Configure Pomelo's MariaDB server version to match the tested target; an old hardcoded version or successful connection is insufficient evidence. + +The [12.3 announcement](https://mariadb.org/mariadb-server-12-3-lts-released/) specifically warns that `innodb_snapshot_isolation` now defaults to **ON**. Record actual source/target `transaction_isolation`, `innodb_snapshot_isolation`, SQL mode, charset and collation instead of assuming defaults. Exercise the production settings with controlled held-reader/writer and overlapping-write tests, transaction abort/recovery and stale-write contracts. Do not silently disable the new setting just to obtain a green test; any override needs a reason, a recorded configuration and its own qualification. + +The present isolated12.2.2 Windows and official Ubuntu-image-filesystem runs both actually reported +`innodb_snapshot_isolation=ON` with `REPEATABLE-READ`; see [runtime provenance](runtime-provenance.json). +Do not assume a source value of OFF from the release announcement. Production's actual isolation, +SQL mode and collation were not inspected, and12.3 itself has not been exercised here. + +## Rehearsal and migration gates + +| Gate | Required proof before production approval | +| --- | --- | +| Freeze inputs | Preserve source image, application commit, configuration inventory, migration history and recovery files. Identify engines/plugins, authentication/TLS, collations and any replication/Galera topology; follow topology-specific guidance if present. Pin the proposed target image/platform and backup clients. | +| Prove recovery first | Restore a consistent **pre-upgrade 12.2.2** recovery set into a separate 12.2.2 instance. Verify application startup, counts, owner boundaries, current/history revisions, attachments, frozen packages, encrypted data/key availability and deletion-tombstone replay. Record elapsed restore time and approved recovery objectives. | +| Upgrade an isolated copy | Follow the official [cross-series upgrade guidance](https://mariadb.com/docs/server/server-management/install-and-upgrade-mariadb/upgrading/platform-specific-upgrade-guides/upgrading-on-linux/upgrading-between-major-mariadb-versions), including clean shutdown and engine/config review. Run and record [mariadb-upgrade](https://mariadb.com/docs/server/clients-and-utilities/deployment-tools/mariadb-upgrade) on the isolated upgraded copy with proper data-directory permissions; verify system tables and table checks. Do not substitute an EF migration for server-system upgrade. | +| Container entrypoint | Review the exact image's upgrade behavior before enabling [MARIADB_AUTO_UPGRADE](https://mariadb.com/docs/server/server-management/automated-mariadb-deployment-and-administration/docker-and-mariadb/mariadb-server-docker-official-image-environment-variables). Its automatic system-database backup is not a complete application recovery set. Never point the candidate image at the only original volume. | +| Application schema | Run the unchanged startup migration/reconciliation chain on fresh 12.3, the upgraded populated copy, and repeated startup. Compare schema/indexes/constraints and `__EFMigrationsHistory`; validate Unicode, JSON/text, timestamps, nulls, unique keys and foreign keys. Retain historical migrations; create a new reviewed migration only for an identified schema need. | +| Application behavior | Run real-server RD21 first-save/stale/overlap/rollback/held-reader-writer tests using independent contexts, tenant/security boundaries and related text writers, then affected browser workflows. Compare 12.2.2 and 12.3.3 using identical fixtures/settings; record exact versions, exits and persisted-state evidence. Confirm failures leave the context/database usable. SQLite and generated SQL remain separate evidence. | +| Target recovery and observation | Back up and restore the 12.3 candidate, validate full recovery again, measure representative query/lock/error behavior, and rehearse the rollback path below. Only then prepare an operator-reviewed maintenance window and production change. | + +The generic upgrade documentation supports investigating a direct 12.2-to-12.3 upgrade; this is an inference about the rehearsal path, not a claim that the repository's populated database has been proven upgradeable. This investigation did not locate a dedicated 12.2-to-12.3 procedure. Recheck exact target release/configuration notes before execution. + +## Backup/deployment gaps found by read-only inspection + +`deploy/deploy.sh:350–365` prefers an arbitrary host `mariadb-dump`, falls back to host `mysqldump`, then uses **floating `mariadb:11`** for the container client. `deploy/deploy.sh:283` also uses that floating image for backup-directory ownership repair. A later migration implementation must select verified source-compatible dump/import tools and remove accidental client-version drift; this plan changes no deployment script. + +Existing dump flags include `--single-transaction --routines --events --quick`. [mariadb-dump documentation](https://mariadb.com/docs/server/clients-and-utilities/backup-restore-and-import-clients/mariadb-dump) limits snapshot consistency to transactional engines and warns against concurrent DDL. It also documents dump-header incompatibility with older import clients. Inventory nontransactional tables and system users/grants/plugins/config separately; a dump of only the application database does not preserve the whole server. Schedule a write/DDL freeze and coordinate filesystem recovery artifacts for the cutover snapshot. + +`verify_sql_backup` checks nonempty gzip, schema text and a dump trailer. Those are useful corruption checks, but an actual restore must prove usability. `docs/infrastructure/backups.md` already leaves current production restore qualification as an operator gate. Preserve application data, uploads/CV artifacts, Data Protection keys, tombstones and required configuration together. If physical backup is chosen, use matching server/backup versions, prepare with the same backup version, and restore into a separate stopped instance with an empty destination; see official [backup/restore guidance](https://mariadb.com/docs/mariadb-cloud/cloud-data-handling/backup-and-restore/mariadb-backup). Retain the original untouched source and protected backup manifests/checksums until the approved retention window ends. + +## Rollback and approval + +MariaDB explicitly states that [in-place downgrade is unsupported](https://mariadb.com/docs/server/server-management/install-and-upgrade-mariadb/downgrading-between-major-versions-of-mariadb). Do not start 12.2.2 against a data directory already upgraded by 12.3. Restore the verified pre-upgrade recovery set into a separate pinned 12.2.2 instance. Before target writes are admitted, this returns to the preserved source state. After target writes, restoring that snapshot would lose acknowledged work: either keep writes frozen through acceptance, or approve and rehearse a logical reverse-transfer/reconciliation strategy before cutover. Do not assume reverse replication or newer-feature SQL will work on the old server. + +The automatic failure path in `deploy/deploy.sh:638–648` restores previous **backend/frontend images only**. It neither downgrades MariaDB nor restores database schema/data; startup EF changes can outlive application rollback. A database upgrade needs a separate recovery decision, operator runbook, write-freeze window, verified backup location and explicit acceptance of any recovery-point loss. Production access, restart, backup execution, server/schema migration and cutover require their own operator authorization. + +**Decision:** recommend 12.3 LTS for staged qualification; production migration is **not ready**. Outstanding gates are official image/digest/platform verification, populated upgrade and server-upgrade checks, exact locked-stack/runtime compatibility, isolation/concurrency proof, complete source/target restore rehearsals, measured downtime/recovery objectives and operator approval. No runtime tests, builds, production operations, image changes or CI/deployment edits were performed for this investigation. diff --git a/docs/database/mariadb-standardisation/PLAN.md b/docs/database/mariadb-standardisation/PLAN.md new file mode 100644 index 0000000..f8c8cfc --- /dev/null +++ b/docs/database/mariadb-standardisation/PLAN.md @@ -0,0 +1,45 @@ +# MariaDB standardisation implementation plan + +> Execute autonomously under the product owner's explicit instruction, using focused independent tasks and final review. No additional design approval or integration menu is required. + +**Goal:** Make MariaDB the standard application database, provide reproducible local/CI persistence tests and qualify the existing RD21 repair on a real server. + +**Baseline:** `0d16a691e0249fe1264bf960de5e59eaa9b87fed`, branch `codex/rd21-mariadb-standardisation`. + +**Architecture:** Reuse Pomelo 9.0.0, EF Core 9.0.14 and the existing startup migration/reconciliation chain. Use a standalone local Compose project with separate persistent development and disposable integration storage. Primary production-version target is owner-verified **12.2.2-MariaDB-ubu2404**, currently running floating `mariadb:latest`. Official 12.2.2 Linux/amd64 manifest `sha256:42a27baaba3e8f3f0159d16381d5a7156661aa91dcc65f663cabb6a6f9503c00` and all image blobs were obtained and verified. Its config digest differs from the owner's running image ID; exact image equality is not claimed. Native 12.2.2 may supply separately labelled local evidence if Docker cannot start. Investigate 12.3.3 LTS as a future staging target; never upgrade production in this task. + +**Constraints:** No main merge, production deployment/migration/database access, live service restart, Phase 10, historical-data deletion or alteration of existing migration history. Do not label SQLite/InMemory or generated SQL as MariaDB runtime evidence. Preserve auth/CSRF/tenant/document boundaries. + +## Tasks and ownership + +1. Coordinator: inspect current configuration, use verified official MariaDB 12.2.2 image/runtime pin, create standalone Compose development/test services, explicit provider configuration and startup tests. Never silently fall back to SQLite. Preserve explicit transitional SQLite access to existing data. Provide safe test setup/reset guardrails and local instructions. +2. Persistence implementer: own `JobTrackerApi.MariaDb.Tests/` only. Create an explicit real-MariaDB integration project, unique disposable database fixture using loopback-only development credentials, actual startup migration/reconciliation, independent contexts and persisted-state assertions. Missing/unreachable server fails this explicit lane, never skips. Cover Career/job revisions, first-save and overlapping writes, atomic rollback/failure recovery, related text writers, tenant isolation, legacy missing revisions and held readers/writers. Do not alter existing production migration files. Report provider inconsistencies with exact failures before fixes. +3. Audit/fixture implementer: own the three obsolete Phase 9 diagnostic/volume fixture sources and new SQLite audit/retirement documentation. Inventory all tracked SQLite references and classify required historical/preservation, temporary transition, or obsolete current guidance/defaults. Repair source revision seeds and stale-write expectations to the correct safety contract without deleting or weakening safety assertions. Keep historical acceptance reports unchanged. Propose staged retirement; no data/package/migration deletion. +4. Coordinator: wire the same integration command to CI without deployment, run isolated actual MariaDB qualification and complete backend/frontend/affected browser/static checks, fix verified provider inconsistencies at their owner, review final diff, update current architecture/setup guidance and repo TODO. Commit/push validated checkpoints and verify remote equality/clean tree/main unchanged. Record all nine owner-requested readiness decisions and remaining blockers. + +## Verification and stopping conditions + +- Capture actual server version, provider/EF versions, migration state and fresh/repeated/populated startup results. +- New tests fail before relevant fixes; pass with independent persisted-state assertions after fixes. Concurrency uses controlled synchronization rather than arbitrary sleeps/retries. +- Test resources must be newly generated `jt_it_*` databases on loopback with dedicated local test credentials. Never reuse development volumes/databases or connection secrets. Cleanup may target only databases created by that fixture/run; retain useful failure artifacts. +- No SQLite dependency removal until its replacement coverage and required data-preservation path exist. Full retirement may remain a staged follow-up. +- RD21 closure requires actual supported MariaDB concurrency, constraints and rollback evidence, plus existing client/browser proof. Other Phase 9/manual/provider/production gates remain independent. +- Review failure behavior for missing/unknown provider, unavailable server, retry/repeated initialization, SQL dialect/type/index differences, and accidental selection of a non-disposable database. + +## Initial findings + +Baseline default/fallback provider: SQLite. MariaDB options hardcoded `11.0.0`. Existing application dependencies: Pomelo `9.0.0`, EF Core `9.0.14`, SQLite `9.0.14`/native `2.1.12`. Historical migration chain includes dialect branches plus startup reconciliation. Repository did not record deployed patch; `deploy/deploy.sh` uses `mariadb:11`. Owner subsequently verified production12.2.2 and image configID `sha256:e0236fc6386e7eacd9359e59d0a078bd7aa0d18280d36d13061121bedeaee903`; this is NOT a pullable registry digest. The initial11.4 candidate/archive was abandoned before runtime tests and provides no qualification. Docker Desktop initially failed creating its inference-manager Unix listener. That local failure was subsequently resolved by preserving verified socket-only runtime directories; see [recovery](DOCKER_LOCAL_RECOVERY.md). No factory reset or production service operation occurred. + +## Completed qualification checkpoint + +- [x] Official pinned12.2.2 Docker image obtained, verified and executed. +- [x] Persistent development service, actual API migrations and row preservation across restart. +- [x] Reproducible disposable integration runner32/32 and CI workflow (hosted execution unverified). +- [x] Provider defects reproduced and minimally repaired; current Release backend1123/1123. +- [x] Native MariaDB browser recovery1/1; canonical target guards10/10; runner guards5/5. +- [x] Three obsolete fixtures repaired; diagnostics18/18 and volume3/3. +- [x] Complete baseline SQLite classification, staged preservation-first retirement and12.3LTS investigation. +- [x] Independent review findings resolved; acceptance and explicit remaining gates recorded. + +Publication is on the dedicated development branch only. The [acceptance record](ACCEPTANCE.md) +contains the nine separate decisions; wider Phase9, Phase10 and production remain NO-GO. diff --git a/docs/database/mariadb-standardisation/README.md b/docs/database/mariadb-standardisation/README.md new file mode 100644 index 0000000..1694911 --- /dev/null +++ b/docs/database/mariadb-standardisation/README.md @@ -0,0 +1,157 @@ +# MariaDB standardisation and RD21 qualification + +MariaDB is the intended application database for development, integration testing, CI and +production. SQLite remains only as an explicit, temporary preservation/legacy-test path. Missing +MariaDB configuration and unknown provider names fail closed; they never select SQLite. + +This work starts at RD21 repair `0d16a691e0249fe1264bf960de5e59eaa9b87fed` on +`codex/rd21-mariadb-standardisation`. The [final acceptance record](ACCEPTANCE.md) separates +runtime, Docker/CI, retirement and release decisions. No main merge or production operation is authorized. + +## Version and image identity + +The product owner verified production **12.2.2-MariaDB-ubu2404**, using floating `mariadb:latest`, +with running image configuration ID +`sha256:e0236fc6386e7eacd9359e59d0a078bd7aa0d18280d36d13061121bedeaee903`. +This is not a pullable registry manifest digest. The repository previously advertised11.0.0 and +used a floating11 client image; those facts did not identify production. + +The standalone Compose database uses the official **Linux/amd64** image: + +```text +mariadb:12.2.2@sha256:42a27baaba3e8f3f0159d16381d5a7156661aa91dcc65f663cabb6a6f9503c00 +``` + +The manifest, configuration and every image layer were downloaded from the official registry and +SHA256/size verified. [Image provenance](image-provenance.json) records the corresponding config +digest `sha256:dec309ca7f95ab98e85fcf56acb9c4f05da59125c09d9e60a521f15f12643d7b` and Ubuntu24.04 +package version. It differs from production's reported image ID: same server patch is not exact +production image equality. Other architectures need their own verified official manifest; do not +reuse this amd64 digest while claiming another platform. + +Use explicit version plus verified digest for a future operator-reviewed production change. +`latest` can move independently of application releases. This task does not change, pull into, +restart, upgrade, downgrade or recreate production. [12.3 LTS investigation](MARIADB_12_3_PLAN.md) +recommends a separate pinned12.3.3 rehearsal, including isolation, driver and recovery gates. + +## Persistent local development + +Prerequisites: working local Docker engine/Compose, pinned .NET9.0.317 and existing frontend dependencies. +From the repository root: + +```powershell +rtk proxy docker compose -f docker-compose.database.yml up -d --wait mariadb-dev +rtk proxy C:/Users/Connor/.dotnet/dotnet.exe run --project JobTrackerApi/JobTrackerApi.csproj +``` + +On other hosts use the installed pinned `dotnet`. The database is loopback-only port33306, +database/user `jobtracker_dev`, development password `jt-development-only`. The root password +`jt-development-root-only` belongs only to this standalone development service. The API's +Development settings match these values; authentication settings remain separately required. +Use local user secrets for non-placeholder auth/admin configuration. Do not copy these credentials +or volumes to production. Environment overrides such as `ConnectionStrings__JobTracker` take precedence. + +The standalone Compose project `jobtracker-local` owns the persistent `mariadb_dev` volume. It is +separate from the production Compose file, networks, `.env` and application data volumes. A fresh +database is initialized by the API's existing migration/reconciliation startup. Repeated/populated +startup must preserve rows. Do not run `down -v` to resolve a schema problem, delete the dev volume, +or point tests at an existing user database. Stop the service without removing data if needed: + +```powershell +rtk proxy docker compose -f docker-compose.database.yml stop mariadb-dev +``` + +There is intentionally no automatic destructive development reset. Export/backup and verify required +data before an independently authorized reset. Existing SQLite files are not opened, imported, +deleted or replaced by selecting the new default. To preserve/read an old database temporarily, +explicitly set `Database__Provider=sqlite` and its existing `ConnectionStrings__JobTracker` path; +do not confuse the Development MariaDB connection string with a SQLite connection string. + +## Disposable MariaDB integration lane + +```powershell +rtk proxy python scripts/test-mariadb-integration.py +rtk proxy python scripts/mariadb-integration.py +``` + +The second command creates a generated `jobtracker-it-` Compose project, allocates an +available loopback port and starts only `mariadb-test` with the pinned image and health checks. +Its data is private tmpfs, never the persistent development volume. The test administrator password +is separately `jt-integration-only`; no production credentials are needed. Each test creates a new +`jt_it_` schema and drops only that fixture's successfully-created schema. Tests initialize +the actual startup schema; they do not patch missing tables with `EnsureCreated`. + +The runner performs locked restore and the complete `JobTrackerApi.MariaDb.Tests` project. Missing, +unreachable or version-mismatched databases fail the explicit lane, never skip or fall back. +Logs, native TRX and command/process outcomes go to `.artifacts/mariadb/integration/`. Cleanup +removes only the generated test service, without `down -v`; a cleanup error fails the runner. +To reset a manually started disposable service, first verify it is the test service with tmpfs +and contains no needed data, then remove only that service: + +```powershell +rtk proxy docker compose -f docker-compose.database.yml --profile integration rm --stop --force mariadb-test +``` + +An isolated existing loopback test server can run the identical project: + +```powershell +$env:JOBTRACKER_MARIADB_TEST_ADMIN='Server=127.0.0.1;Port=33307;User ID=root;Password=jt-integration-only;SslMode=None' +rtk proxy python scripts/mariadb-integration.py --existing-server --output .artifacts/mariadb/explicit-integration +``` + +The fixture rejects remote/non-TCP endpoints, requires exact12.2.2 by default and ignores any selected +admin database in favor of a new schema. Loopback is a guard, never permission to tunnel production +locally. Alternate `JOBTRACKER_MARIADB_TEST_VERSION` values label a separate compatibility run; +they cannot be used to claim12.2.2 parity. The CI workflow uses the Compose command, requires a Docker +daemon/Compose and preserves evidence. A checked-in workflow is not proof of a successful hosted run. + +The ordinary backend project still contains explicitly transitional SQLite/InMemory unit/legacy +contracts. The ordinary browser fixture explicitly selects SQLite until its SQL seed/proof helpers +are ported. Those results remain useful but are never labelled MariaDB integration evidence. + +## Native MariaDB browser recovery lane + +Build the API in Release and the UI static export first. Install the official MariaDB command-line +client locally and set `JOBTRACKER_MARIADB_CLIENT` to its absolute executable path. This lane uses +the pinned test service, never the persistent development database. For a fresh run, use an unused +loopback port (33308 below) and a generated project/schema; preserve the resulting JSON report: + +```powershell +$project='jobtracker-it-browser-'+[Guid]::NewGuid().ToString('N') +$db='jt_it_'+[Guid]::NewGuid().ToString('N') +$env:MARIADB_TEST_PORT='33308' +$env:JOBTRACKER_MARIADB_BROWSER_PORT='33308' +$env:JOBTRACKER_MARIADB_CLIENT=(Get-Command mariadb).Source +$env:MYSQL_PWD='jt-integration-only' +rtk proxy docker compose --project-name $project -f docker-compose.database.yml --profile integration up -d --wait mariadb-test +# Check each exit code before continuing. Only a successful CREATE establishes ownership. +& rtk proxy $env:JOBTRACKER_MARIADB_CLIENT --host=127.0.0.1 --port=33308 --user=root "--execute=CREATE DATABASE $db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" +$env:JOBTRACKER_MARIADB_BROWSER_CONNECTION="Server=127.0.0.1;Port=33308;Database=$db;User ID=root;Password=jt-integration-only;SslMode=None" +$env:PLAYWRIGHT_STATIC_EXPORT='true' +$env:PLAYWRIGHT_PREBUILT_EXPORT='true' +$env:PLAYWRIGHT_JSON_OUTPUT_NAME='../.artifacts/mariadb/browser.json' +Push-Location job-tracker-ui +rtk proxy node node_modules/@playwright/test/cli.js test --config=playwright.mariadb.config.ts --reporter=list,json +Pop-Location +# Remove only this generated disposable container after retaining the test result and logs. +rtk proxy docker compose --project-name $project -f docker-compose.database.yml --profile integration rm --stop --force mariadb-test +``` + +The service's tmpfs discards only this run's test schemas when removed. Never substitute an existing +project/container or the dev service. The config accepts only the shown canonical connection format, +requires the independent SQL reader's port to match and refuses server reuse. The test checks actual +`SELECT VERSION()`, retains drafts across 409/network failures and checks durable SQL state before +and after reviewed retries, refresh and a new login. Run its boundary checks with +`rtk proxy node --test job-tracker-ui/scripts/mariadb-browser-connection.test.mjs`. + +## Records + +- [Implementation plan](PLAN.md), [actual validation](validation.json), [acceptance](ACCEPTANCE.md). +- [All baseline SQLite references/classification](sqlite-references.json), [audit summary](SQLITE_AUDIT.md). +- [Safe staged retirement](SQLITE_RETIREMENT.md), [three fixture deltas](fixture-delta.json). +- [12.3 LTS upgrade/recovery gates](MARIADB_12_3_PLAN.md). + +Historical Phase9 acceptance and the previous RD21 addendum remain historical records. The three +active obsolete fixtures are intentionally corrected under the owner's new instruction; their old +failures, exact deltas and before/after hashes are retained. No SQLite package, compatibility schema +branch, database or migration history has been removed in this stage. diff --git a/docs/database/mariadb-standardisation/SQLITE_AUDIT.md b/docs/database/mariadb-standardisation/SQLITE_AUDIT.md new file mode 100644 index 0000000..0a9453f --- /dev/null +++ b/docs/database/mariadb-standardisation/SQLITE_AUDIT.md @@ -0,0 +1,29 @@ +# Tracked SQLite reference audit + +The machine-readable inventory is [sqlite-references.json](sqlite-references.json). It records every case-insensitive `sqlite` match in tracked text files at baseline `0d16a691e0249fe1264bf960de5e59eaa9b87fed`, with exact file, line and text, grouped classification reasons and per-file hashes. This fixed baseline keeps locations reproducible while the coordinator updates active configuration. It does not read untracked files, databases, exports or credentials. Binary files are excluded by `git grep -I`; case-insensitive matching includes `Sqlite`, `SQLitePCL`, `UseSqlite`, `sqlite3` and provider package names. + +The owner subsequently verified deployed `12.2.2-MariaDB-ubu2404` from floating `mariadb:latest`; local qualification now targets the official `12.2.2` image. A container image ID is not a registry manifest digest. This supersedes the initial 11 LTS proposal; any later 12.3 LTS migration investigation is separate coordinator work. + +| Classification | Meaning and disposition | +| --- | --- | +| `required_historical_or_data_preservation` | Historical evidence and immutable migrations; export/backup/restore paths; domain vocabulary. Preserve. A stored historical SQLite result is never MariaDB proof. | +| `temporary_transition` | Live provider branches/packages and SQLite-based tests, browser harnesses and local tools. Preserve until replacement coverage and user-data migration are qualified. | +| `obsolete` | Active default/fallback or current setup guidance contradicting MariaDB standardisation. Replace guidance/defaults; do not remove the preservation implementation. | + +Concrete minimal coordinator changes at baseline: + +| Location | Required change | +| --- | --- | +| `.env.example:7`, `docker-compose.yml:20`, `JobTrackerApi/Program.cs:100–105` | Select MariaDB explicitly; fail closed for missing/unknown provider instead of silently choosing SQLite. | +| `JobTrackerApi/Services/DatabaseBackupRunner.cs:31–36` | Match provider selection; never infer a SQLite backup path from an invalid provider. | +| `README.md:9`, `deploy/MARIADB.md:4` | Replace SQLite default/fallback wording with MariaDB local setup; retain migration/export instructions. | +| `docs/architecture/overview.md:28`, `docs/configuration/environment-variables.md:9`, `docs/configuration/environments.md:5`, `docs/database/README.md:3` | Align architecture and environment defaults; document explicit transitional SQLite access. | +| `docs/database/migrations.md:3` | Make actual MariaDB startup tests the standard provider qualification. Keep SQLite migration/WAL/backup compatibility facts. | + +CI and Docker files were included in the same full tracked-tree scan. No baseline CI/Dockerfile text directly names SQLite; Compose does. SQLite also enters CI indirectly through the API test project and Playwright startup configuration. A new MariaDB CI lane must be explicit and fail on missing/unreachable MariaDB, while retained SQLite tests remain separate compatibility evidence. + +Active compatibility surface includes API DI, startup reconciliation, dialect branches in controllers/services, EF provider/native packages, immutable migration branches, SQLite persisted tests, Python fixture seeds, browser configurations, deployment export/preview tools and acceptance-run local JWT lookup. Skill-tagger/summarizer strings are domain recognition vocabulary and should continue recognizing SQLite experience. The JSON reason groups distinguish these surfaces without duplicating thousands of source lines in prose. + +The three obsolete revision fixtures are adapted under the owner's later explicit instruction. [fixture-delta.json](fixture-delta.json) records baseline/current hashes and exact unified source deltas. Historical acceptance reports and results stay unchanged, including the three previously recorded unversioned-seed failures. New execution evidence belongs to the coordinator and must be recorded separately. + +Retirement gates: [SQLITE_RETIREMENT.md](SQLITE_RETIREMENT.md). No package, migration, database or historical evidence removal is part of this audit. diff --git a/docs/database/mariadb-standardisation/SQLITE_RETIREMENT.md b/docs/database/mariadb-standardisation/SQLITE_RETIREMENT.md new file mode 100644 index 0000000..b905a15 --- /dev/null +++ b/docs/database/mariadb-standardisation/SQLITE_RETIREMENT.md @@ -0,0 +1,16 @@ +# SQLite retirement with user-data preservation + +MariaDB is the standard target. Explicit SQLite compatibility remains a transition path for existing installations and test coverage; its presence does not qualify MariaDB behavior. This is a staged plan, not authorization to access production, alter existing databases or delete artifacts. + +Owner-verified production baseline: `12.2.2-MariaDB-ubu2404`, currently obtained through floating `mariadb:latest`. Use the official pinned `12.2.2` image for the present isolated rehearsal. Retain the distinction between container image ID and registry manifest digest. A future 12.3 LTS upgrade needs its own migration rehearsal and approval; this plan does not imply that it has run. + +| Stage | Required evidence before advancing | +| --- | --- | +| 1. Inventory | Operator lists each installation, provider/version, DB location, data root, ownership and backup retention without publishing secrets. Distinguish synthetic fixtures from real user data; inventory database, attachments/CV artifacts, account-deletion tombstones, Data Protection keys and frozen/submitted archives. Record schema/migration state and row counts. | +| 2. Preserve and export | Operator-approved consistent snapshot using the supported SQLite backup path, including committed WAL contents; verify restore on an isolated copy. Preserve original DB and recovery files. Review `deploy/sqlite_export.py` coverage against every current table/column and relationship; its partial export of important tables is not a complete migration. Extend transfer tooling only after that review. Produce protected export manifests/counts/checksums without logging personal data. | +| 3. Rehearse MariaDB transfer | Import a copy into a newly isolated MariaDB database using the pinned supported version and normal EF startup. Validate every table/owner relationship, IDs, foreign keys, null/empty behavior, JSON/text/Unicode, timestamps, revisions/history, frozen packages, attachments and Identity projections against the source. Verify referential integrity and restore from the target backup. Rehearse fresh/repeated/populated startup and rollback to the preserved source; never connect both live writers during rehearsal. | +| 4. Prove coverage parity | Map each retained SQLite test/helper scenario to actual MariaDB evidence: independent contexts, first-save races, stale writes, held readers/writers, atomic rollback/recovery, constraints, tenant denial, backup/restore and populated migration reconciliation. Include browser seeds that directly read/write SQLite and acceptance scripts; API-only SQLite tests and generated SQL do not prove this gate. Review dialect/type/index/collation differences. CI must fail rather than skip when the explicit MariaDB lane cannot connect. | +| 5. Approve and cut over | Operator reviews data comparison, restore rehearsal, downtime/write-freeze plan, credentials, backups and rollback window; explicit approval precedes production action. Freeze writes, take final consistent source backup/export, validate transfer again, select MariaDB explicitly and run smoke checks with correct ownership. Preserve original SQLite read-only and retained keys/artifacts. Rollback after new target writes requires a reconciled reverse transfer; switching connections alone would lose those writes. | +| 6. Contract after retention | Only after migration sign-off, observation window and coverage parity: retire active SQLite harness defaults/tools, then provider branches and direct/native packages with dependency review. Keep immutable historical EF migrations and historical evidence unless separately reviewed compatibility policy permits removal. Delete user-data copies only under an operator-approved retention policy with validated recoverability. | + +No stage is assumed complete from standardisation code alone. SQLite fixtures, packages and migration branches remain now. Existing partial export tools are preserved but cannot certify lossless transfer. MariaDB runtime qualification and production cutover are separate decisions. diff --git a/docs/database/mariadb-standardisation/fixture-delta.json b/docs/database/mariadb-standardisation/fixture-delta.json new file mode 100644 index 0000000..3523223 --- /dev/null +++ b/docs/database/mariadb-standardisation/fixture-delta.json @@ -0,0 +1,81 @@ +{ + "schemaVersion": 1, + "baselineCommit": "0d16a691e0249fe1264bf960de5e59eaa9b87fed", + "authorization": "Later explicit owner instruction permits these three source repairs; historical acceptance/results stay unchanged.", + "priorFailures": { + "source": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "diagnostics": { + "line": 85, + "passed": 16, + "failed": 2, + "exitCode": 1, + "cause": "data.spec.ts and sustained.spec.ts unversioned Career seeds expected200/received400" + }, + "volume": { + "line": 86, + "passed": 2, + "failed": 1, + "exitCode": 1, + "cause": "CV-volume Career seed expected200/received400" + }, + "rawEvidence": "docs/redesign/phase-9/rd21-remediation/validation.json", + "disposition": "Actual failures preserved; do not relabel prior runs" + }, + "newExecutions": { + "owner": "coordinator", + "diagnostics": { + "passed": 18, + "failed": 0, + "skipped": 0, + "evidence": ".artifacts/mariadb/browser-historical.json" + }, + "volume": { + "passed": 3, + "failed": 0, + "skipped": 0, + "evidence": ".artifacts/mariadb/browser-volume.json" + }, + "provider": "explicit transitional SQLite; not MariaDB qualification", + "record": "validation.json" + }, + "preservedAssertions": [ + "250 jobs; eight-role long CV;240 reads over>=60000ms;20 navigations;exact final profile", + "100 CV revisions/exact history/stale rejection/additive restore/canonical unchanged", + "100 timeline messages/exact membership/content/tenant denial", + "100 notifications/bounded lists/unread counts/idempotent read/tenant denial" + ], + "strengthenedAssertions": [ + "Equal A/B source snapshots before either writes", + "Each replacement carries its own originally read source revision", + "A commit advances revision and persists first edit", + "Stale B returns exactly409 for Career and job", + "Exact winner snapshots and Career history unchanged after B rejection", + "Lost-first-edit booleans must both be false" + ], + "noWeakening": { + "skipsAdded": false, + "timeoutChanges": false, + "retriesAdded": false, + "historicalResultsModified": false + }, + "files": [ + { + "file": "docs/redesign/phase-9/p9-05/diagnostics/data.spec.ts", + "baselineSha256": "cb85a99f7af8094a341a2c44073e849924f0261ed63be3e643cb510c9f59c1e6", + "updatedSha256": "b33a99c3b280f7cac8ed4294e0a4a0a297f4761708e5414e3bf768f8146a7780", + "delta": "--- 0d16a691e0249fe1264bf960de5e59eaa9b87fed/docs/redesign/phase-9/p9-05/diagnostics/data.spec.ts\n+++ working-tree/docs/redesign/phase-9/p9-05/diagnostics/data.spec.ts\n@@ -9,7 +9,7 @@\n return { 'X-CSRF-TOKEN': csrf, 'X-Session-Context': me.sessionContext as string };\n }\n \n-test('P9 characterize retained RD21 stale writes separately from CV revision safety', async ({ playwright }, info) => {\n+test('P9 RD21 source revisions reject stale writes and preserve acknowledged winners', async ({ playwright }, info) => {\n const admin = await playwright.request.newContext();\n const first = await playwright.request.newContext();\n const second = await playwright.request.newContext();\n@@ -19,31 +19,47 @@\n expect((await admin.post(`${api}/users`, { headers: adminHeaders, data: { email, password, roles: [] } })).status()).toBe(200);\n const a = await login(first, email); const b = await login(second, email);\n const submitted = { version: '1', contact: { fullName: 'Synthetic concurrent owner' }, summary: ['Initial summary'] };\n- expect((await first.put(`${api}/career/profile`, { headers: a, data: { profile: submitted } })).status()).toBe(200);\n- const careerA = (await (await first.get(`${api}/career/profile`)).json()).profile;\n- const careerB = (await (await second.get(`${api}/career/profile`)).json()).profile;\n+ const initialCareer = await (await first.get(`${api}/career/profile`)).json();\n+ expect((await first.put(`${api}/career/profile`, { headers: a, data: { expectedVersion: initialCareer.revision, profile: submitted } })).status()).toBe(200);\n+ const sourceA = await (await first.get(`${api}/career/profile`)).json();\n+ const sourceB = await (await second.get(`${api}/career/profile`)).json();\n+ expect(sourceB).toEqual(sourceA);\n+ const careerA = sourceA.profile; const careerB = sourceB.profile;\n careerA.summary = ['First editor committed summary']; careerB.contact.headline = 'Second editor headline';\n- expect((await first.put(`${api}/career/profile`, { headers: a, data: { profile: careerA } })).status()).toBe(200);\n- const staleCareer = await second.put(`${api}/career/profile`, { headers: b, data: { profile: careerB } });\n- expect([200, 409]).toContain(staleCareer.status());\n- const careerAfter = (await (await first.get(`${api}/career/profile`)).json()).profile;\n+ expect((await first.put(`${api}/career/profile`, { headers: a, data: { expectedVersion: sourceA.revision, profile: careerA } })).status()).toBe(200);\n+ const careerWinner = await (await first.get(`${api}/career/profile`)).json();\n+ expect(careerWinner.revision).toBe(sourceA.revision + 1);\n+ expect(careerWinner.profile.summary).toEqual(careerA.summary);\n+ const careerHistory = await (await first.get(`${api}/career/profile/versions`)).json();\n+ const staleCareer = await second.put(`${api}/career/profile`, { headers: b, data: { expectedVersion: sourceB.revision, profile: careerB } });\n+ expect(staleCareer.status()).toBe(409);\n+ const careerReadback = await (await second.get(`${api}/career/profile`)).json();\n+ expect(careerReadback).toEqual(careerWinner);\n+ expect(await (await first.get(`${api}/career/profile/versions`)).json()).toEqual(careerHistory);\n+ const careerAfter = careerReadback.profile;\n const company = await first.post(`${api}/companies`, { headers: a, data: { name: 'Synthetic stale job fixture' } });\n expect(company.status()).toBe(201);\n const created = await first.post(`${api}/jobapplications`, { headers: a, data: { companyId: (await company.json()).id, jobTitle: 'Original job title', status: 'Saved' } });\n expect(created.status()).toBe(201); const jobId = (await created.json()).id;\n const jobA = await (await first.get(`${api}/jobapplications/${jobId}`)).json();\n const jobB = await (await second.get(`${api}/jobapplications/${jobId}`)).json();\n+ expect(jobB).toEqual(jobA);\n jobA.jobTitle = 'First editor committed title'; jobB.notes = 'Second editor notes';\n- expect([200, 204]).toContain((await first.put(`${api}/jobapplications/${jobId}`, { headers: a, data: jobA })).status());\n- const staleJob = await second.put(`${api}/jobapplications/${jobId}`, { headers: b, data: jobB });\n- expect([200, 204, 409]).toContain(staleJob.status());\n- const jobAfter = await (await first.get(`${api}/jobapplications/${jobId}`)).json();\n+ expect((await first.put(`${api}/jobapplications/${jobId}`, { headers: a, data: { ...jobA, expectedVersion: jobA.version } })).status()).toBe(204);\n+ const jobWinner = await (await first.get(`${api}/jobapplications/${jobId}`)).json();\n+ expect(jobWinner.version).toBe(jobA.version + 1);\n+ expect(jobWinner.jobTitle).toBe(jobA.jobTitle);\n+ const staleJob = await second.put(`${api}/jobapplications/${jobId}`, { headers: b, data: { ...jobB, expectedVersion: jobB.version } });\n+ expect(staleJob.status()).toBe(409);\n+ const jobAfter = await (await second.get(`${api}/jobapplications/${jobId}`)).json();\n+ expect(jobAfter).toEqual(jobWinner);\n const careerLostFirstEdit = careerAfter.summary[0] !== careerA.summary[0];\n const jobLostFirstEdit = jobAfter.jobTitle !== jobA.jobTitle;\n+ expect(careerLostFirstEdit).toBe(false); expect(jobLostFirstEdit).toBe(false);\n await info.attach('phase9-rd21-characterization', { body: JSON.stringify({ id: 'RD21',\n career: { staleStatus: staleCareer.status(), expectedFirstSummary: careerA.summary, actualSummary: careerAfter.summary, lostFirstEdit: careerLostFirstEdit },\n job: { staleStatus: staleJob.status(), expectedFirstTitle: jobA.jobTitle, actualTitle: jobAfter.jobTitle, lostFirstEdit: jobLostFirstEdit },\n- safetyQualification: careerLostFirstEdit || jobLostFirstEdit ? 'FAIL: stale writes can overwrite acknowledged edits' : 'Finite scenario retained prior edits',\n- limitation: 'This passing characterization records observed behavior; it does not accept unsafe stale writes or provide a new revision contract. Creation-intent idempotency remains separate.' }, null, 2), contentType: 'application/json' });\n+ safetyQualification: 'Both stale replacements rejected with 409; exact winner state and Career history retained',\n+ limitation: 'Finite sequential A/B scenario on the configured isolated API; not simultaneous provider contention or creation-intent idempotency proof.' }, null, 2), contentType: 'application/json' });\n } finally { await second.dispose(); await first.dispose(); await admin.dispose(); }\n });\n" + }, + { + "file": "docs/redesign/phase-9/p9-05/diagnostics/sustained.spec.ts", + "baselineSha256": "59a87155e46f27d919549efc402b534ede632aad01ede4194601da4fd6875270", + "updatedSha256": "76db0ac115e4745b67186b116421e2d7c374bd2e8f87a2fd40f04215e7b463c2", + "delta": "--- 0d16a691e0249fe1264bf960de5e59eaa9b87fed/docs/redesign/phase-9/p9-05/diagnostics/sustained.spec.ts\n+++ working-tree/docs/redesign/phase-9/p9-05/diagnostics/sustained.spec.ts\n@@ -29,7 +29,7 @@\n const profile = { version: '1', contact: { fullName: '\u00c3\u2026se Synthetic', email: 'synthetic@example.test' }, summary: ['Documented accessible workflows.'],\n jobs: Array.from({ length: 8 }, (_, index) => ({ id: `p9-role-${index}`, title: `Platform engineer ${index}`, company: 'Nordlys synthetic',\n start: '2017-01', end: '2025-12', bullets: Array.from({ length: 6 }, (_, bullet) => `Evidence ${index}.${bullet}: ${'Documented reliable workflows. Dokumenterte p\u00c3\u00a5litelige arbeidsflyter. '.repeat(3).trim()}`) })) };\n- expect((await page.request.put(`${api}/career/profile`, { headers, data: { profile } })).status()).toBe(200);\n+ expect((await page.request.put(`${api}/career/profile`, { headers, data: { expectedVersion: (await (await page.request.get(`${api}/career/profile`)).json()).revision, profile } })).status()).toBe(200);\n const savedProfile = (await (await page.request.get(`${api}/career/profile`)).json()).profile;\n expect(savedProfile.jobs).toHaveLength(8);\n expect(savedProfile.jobs.map((job: { start: string; end: string; bullets: string[] }) => ({ start: job.start, end: job.end, bullets: job.bullets })))\n" + }, + { + "file": "docs/redesign/phase-9/p9-05/volume/volume.spec.ts", + "baselineSha256": "4510f29298f6391b36d27d2634b1f9355802eafcc310488231014fab799a4108", + "updatedSha256": "9a3abd9f4a8fe558e643bf481dc9a0d1857975e9d532fda6c95e27cf437f7908", + "delta": "--- 0d16a691e0249fe1264bf960de5e59eaa9b87fed/docs/redesign/phase-9/p9-05/volume/volume.spec.ts\n+++ working-tree/docs/redesign/phase-9/p9-05/volume/volume.spec.ts\n@@ -26,7 +26,7 @@\n const account = await owner(playwright);\n try {\n const { api, headers } = account;\n- expect((await api.put(`${base}/career/profile`, { headers, data: { profile: { version: '1', contact: { fullName: 'Volume fixture' }, summary: ['Canonical unchanged'] } } })).status()).toBe(200);\n+ expect((await api.put(`${base}/career/profile`, { headers, data: { expectedVersion: (await (await api.get(`${base}/career/profile`)).json()).revision, profile: { version: '1', contact: { fullName: 'Volume fixture' }, summary: ['Canonical unchanged'] } } })).status()).toBe(200);\n const source = await (await api.get(`${base}/career/profile`)).json();\n const created = await api.post(`${base}/cv/variants`, { headers, data: { name: 'Volume CV', settings: { themeId: 'minimal' } } });\n expect(created.status()).toBe(200); let cv = await created.json(); const id = cv.id;\n" + } + ] +} diff --git a/docs/database/mariadb-standardisation/image-provenance.json b/docs/database/mariadb-standardisation/image-provenance.json new file mode 100644 index 0000000..5787ae6 --- /dev/null +++ b/docs/database/mariadb-standardisation/image-provenance.json @@ -0,0 +1,63 @@ +{ + "verifiedUtc": "2026-10-23T18:50:02.746704+00:00", + "officialRepository": "docker.io/library/mariadb", + "tag": "12.2.2", + "platform": "linux/amd64", + "manifestDigest": "sha256:42a27baaba3e8f3f0159d16381d5a7156661aa91dcc65f663cabb6a6f9503c00", + "configDigest": "sha256:dec309ca7f95ab98e85fcf56acb9c4f05da59125c09d9e60a521f15f12643d7b", + "serverVersionEnvironment": [ + "MARIADB_VERSION=1:12.2.2+maria~ubu2404" + ], + "blobs": [ + { + "digest": "sha256:dec309ca7f95ab98e85fcf56acb9c4f05da59125c09d9e60a521f15f12643d7b", + "bytes": 8764, + "verified": true + }, + { + "digest": "sha256:b40150c1c2717d324cdb17278c8efdfa4dfcd2ffe083e976f0bcedf31115f081", + "bytes": 29732978, + "verified": true + }, + { + "digest": "sha256:9ed055b717831a69ad03c2395a104ab8d08b033dfb39a7081aae4a77eff9960e", + "bytes": 1345, + "verified": true + }, + { + "digest": "sha256:d94e08d2b3cae00353ca2773607a9af0a9c380a59cc24a5ae56060c96b5f024c", + "bytes": 5288087, + "verified": true + }, + { + "digest": "sha256:d96030908d5aff54a5ff19b6ff91be5cae3cc515e4af20f9a4ab578d1222f5a3", + "bytes": 116, + "verified": true + }, + { + "digest": "sha256:d0a6f83789fdbaf1fc1d0594f25bbf3bd8348ee9c19207b0403858f34215d030", + "bytes": 330, + "verified": true + }, + { + "digest": "sha256:59bafaf3e6584086e742293aa889ba0a340d82575ad2e3cad30fbbae270f7f0b", + "bytes": 71776163, + "verified": true + }, + { + "digest": "sha256:bf0bdffb5557248de03433ca4158608cba8d73bac2af7ca033d1bf72517c23d4", + "bytes": 4036, + "verified": true + }, + { + "digest": "sha256:1ac5e0295552633b28897797cb63a7c6d7ee11f340cb888eca719ead5274c046", + "bytes": 8495, + "verified": true + } + ], + "executed": true, + "ownerReportedProductionImageId": "sha256:e0236fc6386e7eacd9359e59d0a078bd7aa0d18280d36d13061121bedeaee903", + "productionImageEquality": false, + "limits": "Official image obtained, blobs verified, and Docker execution qualified. Production config ID differs; no production image equality or production environment qualification claimed.", + "execution": "Local Docker Compose Linux/amd64: 32 persistence cases passed; separately official image filesystem under WSL: 32 passed" +} diff --git a/docs/database/mariadb-standardisation/runtime-provenance.json b/docs/database/mariadb-standardisation/runtime-provenance.json new file mode 100644 index 0000000..5a63147 --- /dev/null +++ b/docs/database/mariadb-standardisation/runtime-provenance.json @@ -0,0 +1,58 @@ +{ + "recordedUtc": "2026-10-23T19:12:19.954085+00:00", + "settings": { + "nativeWindows": { + "version": "12.2.2-MariaDB", + "comment": "MariaDB Server", + "compiledOs": "Win64", + "transactionIsolation": "REPEATABLE-READ", + "snapshotIsolation": "ON", + "lowerCaseTableNames": 1, + "sqlMode": "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", + "characterSetServer": "utf8mb4", + "collationServer": "utf8mb4_uca1400_ai_ci", + "flushLogAtCommit": 1 + }, + "officialLinuxFilesystemUnderWsl": { + "version": "12.2.2-MariaDB-ubu2404", + "comment": "mariadb.org binary distribution", + "compiledOs": "debian-linux-gnu", + "transactionIsolation": "REPEATABLE-READ", + "snapshotIsolation": "ON", + "lowerCaseTableNames": 0, + "sqlMode": "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", + "characterSetServer": "utf8mb4", + "collationServer": "utf8mb4_uca1400_ai_ci", + "flushLogAtCommit": 1 + }, + "dockerCompose": { + "version": "12.2.2-MariaDB-ubu2404", + "transactionIsolation": "REPEATABLE-READ", + "snapshotIsolation": "ON", + "lowerCaseTableNames": 0, + "sqlMode": "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", + "characterSetServer": "utf8mb4", + "collationServer": "utf8mb4_unicode_ci", + "flushLogAtCommit": 1 + } + }, + "linuxExecution": "Verified official OCI layers reconstructed with whiteouts in private2GB tmpfs + mount namespace + chroot under WSL2; not Docker daemon/container execution.", + "productionSettings": "Only owner-provided version/image reference/config ID are known; no production connection or configuration inspection performed.", + "linuxBinaryHashes": "b61497f257d37ecc6424d7c8fe5cf0ae9449b1315368b496483c013cf9bcc032 /tmp/jt_rd21_ram_b01c41b94494448da8c493bf73fe69ab/rootfs/usr/sbin/mariadbd\n9c117da0e04b0983bafb9cd407c6ecc20d2c2dbff17d69ef714706c078b44820 /tmp/jt_rd21_ram_b01c41b94494448da8c493bf73fe69ab/rootfs/usr/local/bin/docker-entrypoint.sh\n", + "launcherSha256": "c56c7ebc18f4ab422bd1df3ca40185fdf4b5ec521ac6d091ebc10a691250d7ec", + "nativeArchiveSha256": "b34bb91f0dd4bd184f420288a12aace2b5fcb20734f2b880075c36150d4641c6", + "cleanupIncident": { + "initialDiskExtractionFailed": true, + "ownedDirectory": "/tmp/jt_rd21_5c7ce1af0d2c4e458b6407550b7b943d", + "removed": true, + "restoredFilesystem": "63MB used/54MB free; normal WSL invocation exits0", + "scope": "Only task-created temporary image extraction removed; no Docker reset, production operation or preexisting database deletion." + }, + "dockerExecution": { + "engineVersion": "29.7.2", + "context": "desktop-linux", + "imageManifest": "sha256:42a27baaba3e8f3f0159d16381d5a7156661aa91dcc65f663cabb6a6f9503c00", + "persistenceCases": 32, + "nativeBrowserCases": 1 + } +} diff --git a/docs/database/mariadb-standardisation/sqlite-references.json b/docs/database/mariadb-standardisation/sqlite-references.json new file mode 100644 index 0000000..192b13f --- /dev/null +++ b/docs/database/mariadb-standardisation/sqlite-references.json @@ -0,0 +1,13368 @@ +{ + "schemaVersion": 1, + "baselineCommit": "0d16a691e0249fe1264bf960de5e59eaa9b87fed", + "scope": "All tracked baseline text files; git grep -n -I -i sqlite BASE --; excludes binary/untracked files and user databases", + "snapshot": "Fixed baseline locations; current changes coordinator-owned", + "trackedFileCount": 3061, + "referenceFileCount": 415, + "referenceCount": 1602, + "classifications": { + "obsolete": 13, + "temporary_transition": 420, + "required_historical_or_data_preservation": 1169 + }, + "reasonGroups": { + "historical_evidence": { + "classification": "required_historical_or_data_preservation", + "reason": "Historical audit/redesign acceptance source or results; preserve provenance, not MariaDB proof.", + "references": 1087 + }, + "migration_history": { + "classification": "required_historical_or_data_preservation", + "reason": "Immutable EF migration history preserves upgrade/recovery paths.", + "references": 34 + }, + "data_preservation": { + "classification": "required_historical_or_data_preservation", + "reason": "Existing SQLite export/preview/backup/restore protects installed data.", + "references": 42 + }, + "domain_vocabulary": { + "classification": "required_historical_or_data_preservation", + "reason": "CV technology vocabulary/synthetic content, not provider selection.", + "references": 6 + }, + "provider_runtime": { + "classification": "temporary_transition", + "reason": "Live SQLite provider/dialect compatibility remains until preservation and MariaDB parity gates pass.", + "references": 70 + }, + "provider_dependencies": { + "classification": "temporary_transition", + "reason": "Provider/native dependency supports retained tests/compatibility; defer removal.", + "references": 41 + }, + "test_coverage": { + "classification": "temporary_transition", + "reason": "Retained SQLite test/browser/helper coverage needs actual MariaDB replacement qualification.", + "references": 304 + }, + "local_tool": { + "classification": "temporary_transition", + "reason": "Local acceptance/fixture tool reads SQLite directly; replace before retirement.", + "references": 5 + }, + "current_guidance": { + "classification": "obsolete", + "reason": "Active default/setup guidance conflicts with MariaDB standardisation.", + "references": 9 + }, + "silent_provider_fallback": { + "classification": "obsolete", + "reason": "Missing/invalid provider silently selects SQLite; fail closed instead.", + "references": 4 + } + }, + "surfaceCoverage": { + "application_config_DI": "Program, env, services/controllers/models", + "migrations": "Immutable EF history", + "tests": "API.Tests and Playwright/helpers", + "CI": "All workflows scanned; no direct baseline SQLite match, indirect API/Playwright usage", + "Docker": "All Dockerfiles/Compose scanned; direct Compose match", + "docs": "Active and historical tracked docs", + "localTools": "deploy, scripts and tools" + }, + "files": [ + { + "file": ".env.example", + "sha256": "66ff5c3d1d157f510d3d29685fbd4464426a4a5a5b659275e87198c415846db2", + "references": 2 + }, + { + "file": "JobTrackerApi.Tests/AccountDataExportTests.cs", + "sha256": "fbdc2921e4efc18352b3f9d74bff7bf2da6dcc4f12217934f28d0f03209cc037", + "references": 4 + }, + { + "file": "JobTrackerApi.Tests/AccountDeletionTests.cs", + "sha256": "1a0bf0e7c6a2ef4c30895d2a214c5d172152b0a2a3fe42f23be64c61e7dab713", + "references": 3 + }, + { + "file": "JobTrackerApi.Tests/AiOperationQueueTests.cs", + "sha256": "4721f0be83071d265dc1dd1d94f3263767adf19af29e4bfda162b994998424aa", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/AiPrivacyPolicyTests.cs", + "sha256": "eac875120f6115f85ba74c701349a5ab347a9fe4bd7a87bbd0ee2928c07c4259", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/AiUsageMeterTests.cs", + "sha256": "d74da4e8a6d334e90cb85806715e56d5e0646ce5b1f002e7d307bc5140f7b3c3", + "references": 3 + }, + { + "file": "JobTrackerApi.Tests/AttachmentConsistencyTests.cs", + "sha256": "b2822333b7c11bcdbde73ca55acecc07aa3940455972ee67629e225bb30116fa", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs", + "sha256": "3ccba5b6c77275f6f0fbb2c26973e57c45523ff93cff604d82d9f0b710bcbadb", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/CareerEvidenceControllerTests.cs", + "sha256": "5009fc9a36aeb74faeb0c8064e0b4bef567468f687e6910a7ae39e3d4131f000", + "references": 4 + }, + { + "file": "JobTrackerApi.Tests/CompanyCreateCompatibilityTests.cs", + "sha256": "b15bbe1b256cae2a5712a954d2f84470d5a9acc1b734143d5879690486b5227c", + "references": 4 + }, + { + "file": "JobTrackerApi.Tests/ConcurrentInitializationTests.cs", + "sha256": "5cec247df455423c2a03a00d35746c2e9d6c6a28186f14ea931ef2025aab4a82", + "references": 4 + }, + { + "file": "JobTrackerApi.Tests/CvAiReadinessTests.cs", + "sha256": "40065c73939bfe887774447d658cdfe3358ce1313aa5b06176607f8aca9d1d25", + "references": 3 + }, + { + "file": "JobTrackerApi.Tests/CvBuilderTests.cs", + "sha256": "f5127f273d639e31014150fc143fae25c50865ededa0fc5b16851efe618c1c6a", + "references": 3 + }, + { + "file": "JobTrackerApi.Tests/CvExtractionCoverageTests.cs", + "sha256": "72e80053067e664e246c4925c7c1cf3aa4c1bf03b3907d2b98e8bbc8be51d0db", + "references": 1 + }, + { + "file": "JobTrackerApi.Tests/CvProcessingOperationTests.cs", + "sha256": "d72fea42a4743091cb982eeb757176dc0b150e635a48f52be24f518ac5fec57e", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "sha256": "22b1f6a2dbfffb88bf11c217c41f3eb84086471da1023023c034a7521a9a21aa", + "references": 7 + }, + { + "file": "JobTrackerApi.Tests/DashboardPreferencesTests.cs", + "sha256": "745c457a6308aef4ca307cd38ec9d427d0d9c08738468cbab902ad7df1404096", + "references": 3 + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "sha256": "3107d265b272775eead9b26e0b56f8560db15f9102f0f421fe7fcfc63ec9bbc3", + "references": 11 + }, + { + "file": "JobTrackerApi.Tests/DocumentsControllerTests.cs", + "sha256": "f16d3d78b072faaea87c376888803ecbf8daec6da62368d89ea78ecd8bc9bac2", + "references": 2 + }, + { + "file": "JobTrackerApi.Tests/EmailDraftPersistenceTests.cs", + "sha256": "f7e725ae991c018f996673075f15e471d0c1aaec3541d3c5815d12ad6017768d", + "references": 3 + }, + { + "file": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "sha256": "088c8b52ff90c44f91d1014966568fa4f5cf245cc6dff89b1cd6f19b56d4fdfd", + "references": 6 + }, + { + "file": "JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs", + "sha256": "4b182a1ce69d89f5866adc49cc0b31dfa89e9b6b33e852405ead9e0d083a0dbb", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/EmailSendAttemptStoreTests.cs", + "sha256": "a9bc147e5b8369a297e8246a53cde29fc234ef2671b1402dd188e8427da34d55", + "references": 4 + }, + { + "file": "JobTrackerApi.Tests/EmailSendControllerTests.cs", + "sha256": "6b76f677d20c87d228e122b7a4a3591d1d729e36d88ce9c520efc7fe5590fee7", + "references": 4 + }, + { + "file": "JobTrackerApi.Tests/JobQueryParityTests.cs", + "sha256": "fd5ff8a7ed9cea356e1778514572380e203ac3806aff11ca334f7e1502a26fcd", + "references": 4 + }, + { + "file": "JobTrackerApi.Tests/JobTrackerApi.Tests.csproj", + "sha256": "6564ff0044af2ce8c55d557b180c57e16e238395424778878b56eb9e3e082c0d", + "references": 1 + }, + { + "file": "JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs", + "sha256": "86ec5a09e3359f25aff7562ebc50a72a2aa741e013687482ca93ad5ada16075f", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "sha256": "5556dd8621dc8e81ace13ab63ff0561fdb5756cc07f9ec90bd7929e0e094aebe", + "references": 38 + }, + { + "file": "JobTrackerApi.Tests/OperationsControllerTests.cs", + "sha256": "0b174f8f28ce98e1a7dacb121e80ca53e851bebced088f9388f7ce716af71800", + "references": 2 + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "sha256": "ffd4b396d2a713f3c9ff681ee4566ff36d676d17c8b9d6611688261c183bd9db", + "references": 16 + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "sha256": "b78c3d1404f86cf21a444f5dc22b156f18efdd59c2b9c03211813ca043e87f1f", + "references": 9 + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "sha256": "cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50", + "references": 14 + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "sha256": "5fb244d50d2378b8d18b14ac260beafc4bfd58190447306244b2916ea808d572", + "references": 16 + }, + { + "file": "JobTrackerApi.Tests/SqliteMigrationHelperTests.cs", + "sha256": "6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b", + "references": 2 + }, + { + "file": "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "sha256": "536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a", + "references": 6 + }, + { + "file": "JobTrackerApi.Tests/StartupSchemaOwnershipTests.cs", + "sha256": "f3156a8a7c208e8a2e6994804fb2f73b0666f728c557133c467d7c0d2ec75e67", + "references": 3 + }, + { + "file": "JobTrackerApi.Tests/StrategySnapshotOperationTests.cs", + "sha256": "843264cf056bfd93cd6dcba633404999bbd1749c27d424cde81bb93f5211cbde", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/UserOperationStoreTests.cs", + "sha256": "a08fe332bfe46ea64050575bdb993f7f441e775eebbff0a7844e317a45a26441", + "references": 1 + }, + { + "file": "JobTrackerApi.Tests/UsersControllerTests.cs", + "sha256": "6af9651f681db19ff8b7e9177b1c45e54d2ae7eec73cd052da493a80c9829ca7", + "references": 5 + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "sha256": "09acd31a3134b518487001120296280a99276c8464f83dd55c7498b16a5f1c63", + "references": 22 + }, + { + "file": "JobTrackerApi/Controllers/AdminSystemController.cs", + "sha256": "ab5e3e4b278cc8224cfa6514e7b56e800ee5e06efcbe96b52c6f7313395b7619", + "references": 1 + }, + { + "file": "JobTrackerApi/Controllers/CareerEvidenceController.cs", + "sha256": "f7c9998d16d963f87ce81442680dba3cc4c37b53b829016bf42d8795751ee87c", + "references": 2 + }, + { + "file": "JobTrackerApi/Controllers/JobApplicationsController.cs", + "sha256": "64aa2daa5ad2ab59e33b0094567905ba4fa72e27153e81b248446f9019fdb90d", + "references": 1 + }, + { + "file": "JobTrackerApi/Controllers/JobDiscoveryController.cs", + "sha256": "1ffb95a866dc821c468df8dfbbec75d4c7b1656bfb791109c43915205f4d6ee6", + "references": 2 + }, + { + "file": "JobTrackerApi/Controllers/OperationsController.cs", + "sha256": "b1dacc6acf74dc3219bb7b5f13517d2e7edd7b9eb93297e8823dc1a90e0cbbd4", + "references": 1 + }, + { + "file": "JobTrackerApi/Controllers/ProfileCvController.Pipeline.cs", + "sha256": "2efa5b9144cc3bc7b6323b654f67cb27ea6aac95cda27862a3c33fd1707b8d12", + "references": 1 + }, + { + "file": "JobTrackerApi/Controllers/ProfileCvController.cs", + "sha256": "018b52a96b229248478e36bb593f18d3eeab82bf81e2c7536b5c1ff276fee680", + "references": 2 + }, + { + "file": "JobTrackerApi/Controllers/SessionsController.cs", + "sha256": "555be479e9be8261ccdfe67a460d006794e23bb00540071f39da9b03621db403", + "references": 2 + }, + { + "file": "JobTrackerApi/Controllers/TwoFactorController.cs", + "sha256": "413b95b217bff645bf7240539abee90a22650c54d6b84439ba5f6f58b048b233", + "references": 1 + }, + { + "file": "JobTrackerApi/JobTrackerApi.csproj", + "sha256": "f2080834b0549b454b33925461ca77e33a063b0927026ec32f79c657778fa081", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260310174114_AddCorrespondence.cs", + "sha256": "3d7b732d01364a9d74c6ddb4e2f2fa1706570f8615968c29c960b6aeffc7a195", + "references": 4 + }, + { + "file": "JobTrackerApi/Migrations/20260311093000_AddAttachmentsAndJobEvents.cs", + "sha256": "326fe813c82a372bf2078da35aced5d597687a82f5bead81d86c7fd2c8d9a883", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260717071417_AddJobEntityAndProspectStages.cs", + "sha256": "ac454ad994ac632d862acf57f2a6a15221912c2edacab7fb9440f2cc956c20a2", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.cs", + "sha256": "37a028d272f8f0dcc9dcea36412668d411ccb3719c9ed6cb7f6f1e96ab22534b", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260718074509_AddCvVariants.cs", + "sha256": "7e19555ae2d5174eac96b1dea2af8a417889bd1e569f695e61268d3cb8e4889a", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260719085904_AddApplicationChecklistItems.cs", + "sha256": "888751348068f15f1ad8b55f8205562bd41f6f551dfd33b5a144bbb180b24cac", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260719120954_AddCoverLetterVersions.cs", + "sha256": "a7f7ab31aa4d1b1ba1b9b5588efade6c02936ef459aa5a453d59ad87ed2634ac", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260719145044_AddInterviewPrepItems.cs", + "sha256": "97063333c7c98f4f3829f6dab3e1a1266c776e0652a4f75523952dc54b0b299f", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260730203422_AddAiUsageMetering.cs", + "sha256": "634ca2c1f40b120de028b980c1880dcb3c7bac9259e9b0ae058ac89d0aadbc90", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260731115022_AddStripeBillingState.cs", + "sha256": "9f1ab2c0ed85986d83df90c3c8352480675ddc426b3c6e53b8067c49d8e3671d", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260802224646_AddUserOperations.cs", + "sha256": "f27a857647de4c46b7e85234df8c056849b776c332c3d6e1f7e3cd0c6c17e750", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260802225941_AddUserNotifications.cs", + "sha256": "392e268090c3fce7922578e25f877756ef4b3d64bafe50c94a323cecae353192", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260815164027_AddAccountDeletionLifecycle.cs", + "sha256": "05d5e1478a5e05a7d3e627ef5d7bc8836ef25613891eb256f2f4d728becee468", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260815175236_AddCrossFeatureAiUsage.cs", + "sha256": "c75955a0bf9a3e3d638f3c7c4cf613383beee8cb5f975f813cde3c3aeca95f2d", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260830122000_AdoptGmailReviewDecisionsSchema.cs", + "sha256": "3a702ae78ea86f820e41d8774702e4eed50fda0ed4d31e0a2d8d2dd57e794940", + "references": 1 + }, + { + "file": "JobTrackerApi/Migrations/20260830133000_AdoptCareerProfileSchema.cs", + "sha256": "13ffb3c1d2fe3f56eea6869b6fa83b2d1f24805e8e10f729ec5a6167cd4ede40", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260830134000_AdoptIdentitySchema.cs", + "sha256": "d9c92d3e9f3bc819dfd00d213c3e3dcf897cd3909a87ad23f31d81951d508f0c", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260830135000_AdoptSubmittedApplicationPackageSchema.cs", + "sha256": "38a5d7acef9b3280ac1c8aaef173451aafbfd3cc651f73f348ba821a0f58b9b0", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260830136000_AdoptCareerEvidenceSchema.cs", + "sha256": "45c2894659d4a144cdcc12a2567ea704dee119e85607ff80a12379bb4f22791c", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20260830137000_AdoptSavedJobSearchSchema.cs", + "sha256": "9aa1867fbc4f05334f20e1f73177e7f3da0f9f43d961845085fb98fb41dab72f", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20261021090000_AddDashboardLayoutPreference.cs", + "sha256": "16682ac34da761065918528571c253f3cafb7a9acc08860374885cb038686b33", + "references": 2 + }, + { + "file": "JobTrackerApi/Migrations/20261023090000_AddJobRevision.cs", + "sha256": "8f3a635abdf56e0c6b0f92abd99c5c28ca11f10f4ac5a24fb29a9cec668d1ba3", + "references": 1 + }, + { + "file": "JobTrackerApi/Models/StructuredCvProfileJson.cs", + "sha256": "477e3b9914b59a22b5e0f50049d483c3d951907d1a3e5b8be94c96209a062718", + "references": 1 + }, + { + "file": "JobTrackerApi/Program.cs", + "sha256": "7f145583424722c0a41843a31deba6798684a8b00ae5565f6cc55f8ea4a98b02", + "references": 5 + }, + { + "file": "JobTrackerApi/Services/AiUsageMeter.cs", + "sha256": "49439175397f6941e53112b91fef80f874e3e5ba04fcdd0a8eefd9dce4b61b1a", + "references": 1 + }, + { + "file": "JobTrackerApi/Services/AiWorkspaceService.cs", + "sha256": "ea3073dc5b6a0e5c38ba554b5225196b6a00f0395b25dad6644dae7e27fe08a2", + "references": 2 + }, + { + "file": "JobTrackerApi/Services/AnalyticsService.cs", + "sha256": "88968cfb23e298a8db0c541fc134d3f6e1a0864443baafa24ec9c70f5faeee11", + "references": 1 + }, + { + "file": "JobTrackerApi/Services/ApplicationAssetsService.cs", + "sha256": "0a64f8f99a9d50ae20f3ee4d8f142b4b2c1f923a05764a13a5c5b5fcc5a49d5f", + "references": 2 + }, + { + "file": "JobTrackerApi/Services/ApplicationIntelligenceService.cs", + "sha256": "4ee426d66e325a03196d88e3a952b337fc0d93847e5b2c9c952997307fb69aee", + "references": 1 + }, + { + "file": "JobTrackerApi/Services/ApplicationWorkspaceService.cs", + "sha256": "38465f6fb05f36d7077b190f434b669447bda55c729e2065b9329d5b1682ced2", + "references": 2 + }, + { + "file": "JobTrackerApi/Services/CareerProfileService.cs", + "sha256": "dc91aca78069feff24eecf796c1fac459af9f5564e61d7918822f45b81807fef", + "references": 2 + }, + { + "file": "JobTrackerApi/Services/CvVariantService.cs", + "sha256": "e9b12b9bb23dee29b72c716a07976a7f2b4d1817999e6a594184b1f60c2b1f2b", + "references": 1 + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "sha256": "e987d314ca11f709c915566fa8076dfc59bb2430b6fdb83e0093a3ab27a56159", + "references": 10 + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "sha256": "def370bd0dbe90260e42800fded99302e56f8ac6b7693e73dd0a60cf0a3f7fd1", + "references": 13 + }, + { + "file": "JobTrackerApi/Services/JobImport/SkillTagger.cs", + "sha256": "fead4230f28ef162cbc744cef80afb08534867c28d21f3823f0bf60ba1ca74a7", + "references": 1 + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "sha256": "9ddfaa68edf84b4d1f0ad695c89d4698df9f05001d7ab796cc294dc205c1cfe7", + "references": 15 + }, + { + "file": "JobTrackerApi/Services/SubmittedApplicationPackageService.cs", + "sha256": "724f8e5d5a4398d64c7248abc2df4de1d4901e55bfd1393c8d8c902788052727", + "references": 1 + }, + { + "file": "JobTrackerApi/Services/TrustedDeviceService.cs", + "sha256": "1ee61ee91d4357403b86ca7e6ad161c026b55759216bddd72b43f88cfb4197ec", + "references": 1 + }, + { + "file": "JobTrackerApi/packages.lock.json", + "sha256": "c18cf71b1b73de2daed06b0a16046bb2b490d1d44aa2754b5bee07533c6fc2e8", + "references": 16 + }, + { + "file": "README.md", + "sha256": "78175773ada92e9de2b601f88631dff9546c1bee2a418130f9cb739b7a24be70", + "references": 1 + }, + { + "file": "deploy/MARIADB.md", + "sha256": "f2566fc66819cc64934f43085938039aa4a3db919c9ae80094186bfb69919eaf", + "references": 8 + }, + { + "file": "deploy/deploy.sh", + "sha256": "59dc55306ef8bdb012b15e51c7675056ffddb0afc26cefd731de035732675a8a", + "references": 14 + }, + { + "file": "deploy/first-production-deployment.md", + "sha256": "9ee6f964d65e16e93ac4b758fbdb87adc66295e322073252214eb9eff75c0099", + "references": 4 + }, + { + "file": "deploy/sqlite_export.py", + "sha256": "17eda2555b26935320923162a2822f7779e5717b9646c89efe2613cbb3f156af", + "references": 6 + }, + { + "file": "deploy/sqlite_preview.py", + "sha256": "bfc960bf596bcc3fa3c31d2a97da0c0edf934fdafd704df185da8e9044975ec1", + "references": 1 + }, + { + "file": "docker-compose.yml", + "sha256": "fcdb33befaeec93d2f15a98a1a41176f1b509404a8e707b515b6f1c9ef328739", + "references": 1 + }, + { + "file": "docs/README.md", + "sha256": "591499b7bb479fa62fe5133e8fc68a2b655c77411d30c1abd8d2cafe65b4ff39", + "references": 1 + }, + { + "file": "docs/_archive/ARCHITECTURE_EVOLUTION.md", + "sha256": "58364a06df5c872a434792e820b69c0562c27bec83fb89503bfaf32f3ad19d5d", + "references": 1 + }, + { + "file": "docs/_archive/MERGE_REQUEST.md", + "sha256": "2e60ff1813baf4f5a9b020ba1f07671eda8de6bb13eebf7071544dd566c91b51", + "references": 1 + }, + { + "file": "docs/_archive/ROADMAP.md", + "sha256": "731f97ba144fd470dd2ccb96ae299d8a82804ca14e717f4fa54d1195261f2451", + "references": 1 + }, + { + "file": "docs/_archive/SECURITY_REPORT.md", + "sha256": "fd8db4dbb3f8267d4338c39ba27586898b8da5bef02fc6a12b6368ac30aa7efd", + "references": 1 + }, + { + "file": "docs/_archive/SYSTEM_OVERVIEW.md", + "sha256": "8ad29c4fba2891b00eeb7036c0978733ffa0f9b7d78c32e5b0bc2f828c48088a", + "references": 5 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "sha256": "d76b15402983570adb6c9ddb1f4ef359d05a950c8f66eb23c8c49feff13825d5", + "references": 9 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/application-discovery-report.md", + "sha256": "5191e7000e1f45f3401173ef0a63a42e9aef49d78cc22727ec5de2bed90ce419", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/application-workspace.md", + "sha256": "85ac3d6138404049137cf0085d57addf6ab31836f03f66d2aa4d8bd03f8251fa", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/current.md", + "sha256": "a348e50f16c0d8082504bf13cc2f8d6e4e6c3b21f0d8f9a95766d68ac8a73e23", + "references": 5 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/durable-operations.md", + "sha256": "67e7a7e711fe7c62ae07740696890de33d4ab1637dd1ea91d923aab584420388", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/notifications.md", + "sha256": "bd9de3bdbc7fa6e767a53b62bf12dcf67eb40540de446a4c8143f6f47f8a5254", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/technical-debt.md", + "sha256": "4a566caa698212cd2c667acb4116596057e19c6434bed64edb7aee6542a2b2b8", + "references": 4 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/README.md", + "sha256": "acc23122d961cb445b8be341967fdabac6c64922abea4d26551abf754763dc47", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "sha256": "6ad7f6b54787e3c20a65e56731ce96f6f9eebbb9dd7cd1caf3ba877795bb926f", + "references": 8 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/findings.md", + "sha256": "f812fb105629522086ab1660f44be6e544a79b2ae3dc1852ef88098a50dcf30d", + "references": 6 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/product-operations.md", + "sha256": "d0df726d5d5e1c3702eb97e75c9ec4caccd77a03adb25b7f1355345cfbd41351", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/resilience.md", + "sha256": "6b808a9cede9e125ecd597448c896c0c4e15630e1f0435e9a5ecf427f85de1de", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/source-index.md", + "sha256": "51c2c650a0a5810a1037547ce304c1a4e44a037e418ca0b818901a3f200c5319", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/threat-data.md", + "sha256": "b841245b370665886b1dfcf742730739d81f0546454d9db1acb45270a5d88622", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/README.md", + "sha256": "b264f7cc7591932f07ee6130215cb85006e6e3d26a64285f8774d9d878347771", + "references": 5 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b02-completion.md", + "sha256": "fd985e9a521af9ac183fcc1c1bc53ef129c2974a6388fd54c76c9b096deb4df0", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b03-completion.md", + "sha256": "feebd24c035f3a2c03b483681efec5837aed63407fa22702c69b1aca4b1481b9", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b04-completion.md", + "sha256": "69d0df158c9bccfeadd562b3bb6d82d2f8814cb12331f0f5a2d5505711aa5fc9", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b06-completion.md", + "sha256": "cbc0eb9fa18856faac98fac7678e59fc4806d49a23ad53acefd2a5ef2d678295", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/evidence.md", + "sha256": "b486ca4a21e29a0d6a17383cdb2f86c56444ede33696cd6c254c549776a11525", + "references": 4 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/implementation-queue.md", + "sha256": "522ca8576919bd194a8b8d1dd2657376bc88d530f66d6d45d4443caf4a0a25b5", + "references": 3 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/verification.md", + "sha256": "3cbec7f68afd1bb5a3ae98ec5f60f73842864e4b01a54ad7449800f497aef68a", + "references": 3 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-progress.md", + "sha256": "66d9f9363e7aa31ee0b51490da5a3afca8393e2f799089f55ce1372adb5e48db", + "references": 6 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "sha256": "1ef895aff4e6412108f081ff325b9346ff8d625340c5e6e6c0e30a7b313a7e5d", + "references": 8 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/ai-001/README.md", + "sha256": "603addc5ddb7a1f91eafe91c5672217d52ec10064f75899bc5f780253e9e3e7f", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/browser-evidence.md", + "sha256": "b9460e7fc228bb37b6cbfae93eb5999bf33d29036125734ef9ac9413e71dc5db", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/repository-inventory.md", + "sha256": "042ff1c7b62a1188db916de325232a30b2bd1d03ab362956efeeb152024cff73", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/runtime-evidence.md", + "sha256": "09a277a5d153716357b8c94eb4c92424959ffee8f6ad4db16cad1a04321d3184", + "references": 5 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/two-user-isolation.md", + "sha256": "09925b0f85386569d49e2224470aeca6abf3ed4e0b128f92e00454dd36895772", + "references": 4 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "sha256": "c01d5a599a8c408c865c7490b4b3102a472cdf859a75f31990058467fac0e019", + "references": 22 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/security-threat-model.md", + "sha256": "2631744efd84f85c79085521abefb22c145a6f2eb398b1aa4b86ccd3ac3b40a4", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/user-journey-audit.md", + "sha256": "ddb8b762fad56bf693f4c29b65ba8ca0f5c696d532cac18c3d2f13bf41efa8af", + "references": 5 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "sha256": "d1bf0695df82d49f4ec796ff332e6fa2a5bc90b97ae0c231a3130f88b3099a0f", + "references": 58 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/career-workspace-branch-assessment.md", + "sha256": "22934869e10ae845d59b3498116d1ecb81ee6b38019a691c6b05f33312c9cb6a", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/career-workspace-implementation-roadmap.md", + "sha256": "ed74e3c328f6ec615bb7f5568e9d86ec85821ba5beb53f8cf330ab2ffeefc7bf", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/cv-builder-product-teardown.md", + "sha256": "5934fda35714be5d086bd3b1d3711eb86aac180812a1dc75ff935a47a6adeee7", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/deployment/backup-restore.md", + "sha256": "3cc85ef84c1083a1c6f9016ff14758608e4dfa361b327a973d905d12aef06a35", + "references": 3 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "sha256": "d746c3093612c418b2de363a00427496f1dfd79ed450aa31305dedabf788db1a", + "references": 15 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/operations/production-backup-verification.md", + "sha256": "ddf2ca8d27afaade3a1e2696248db4f7656d46fca6ae3eeca12622a472a89275", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/phase-0-foundation-report.md", + "sha256": "b770268c36e5c90ef7615b658a747718ed452c0a91731114b4beb7b7f47256ce", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/phase-5-completion-report.md", + "sha256": "f996a3b2013ea44d502f64356fa317b05f0a62986da24fdca2b83e7f023e576d", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/production-readiness-review.md", + "sha256": "fd7e83fa9dad754cb2a1a7786fd74d8aea54c1eee4b7049dbeedf8d5de9b9672", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/production/production-ai-validation.md", + "sha256": "58e60d6622bdc25b1111f90f3f8437d94be54ce3040e8cd6cc4fe0acfccbe76c", + "references": 3 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "sha256": "dd7badcbc86521d2323c3903b429fbc9d855fee9e4fa12d0e4ba8681479f999a", + "references": 14 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-checklist.md", + "sha256": "b082a6d1305c89c9106f370eb6ee6b3e17baa29480976a4caec3f72ef04ca496", + "references": 3 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-final-report.md", + "sha256": "3c918b29fa7a4e1cbd3993e85b7d9f1ce9ef74f75914dc03664db4bbe2e41670", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/todo/work.md", + "sha256": "cd1213a5037cbf18c95b65925145ab8782f46fe993f90b955714856f19c56101", + "references": 4 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ai-003-strategy-snapshot-queue.md", + "sha256": "141839ee6d7a4ecca4d9c40c2c3741ff1378f4421f20f2de5c5123ca7f678395", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ai-004-cv-processing-queue.md", + "sha256": "6fbcf2393dadf1c3d344b6362babac47a13c730bf2acc71ff8a41c59c63ba463", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "sha256": "c33ef00e9013b3f4840a1740c50a4529267c5341e4a7368f0d54b10772b6d670", + "references": 13 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/bg-001-tenant-workers.md", + "sha256": "5952bc97a31559f9956d85a03a63c61e3f2a6ed9e08aecbe4b784c677c0b6970", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "sha256": "9639bde34f53337ab2b48ae6d308bf58c53cbc141316bd43e9ad6665ccb35bd4", + "references": 7 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-002-route-uniqueness.md", + "sha256": "c0577f64ae1674ff56728165333e8bcec4db7e4bbf4d56ece714ab0a5befe8f4", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-018-developer-documentation.md", + "sha256": "d6538c880c6c8f3eb05bee3b8be19384500beb913e91366841a3b4ab61b60218", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-019-schema-ownership.md", + "sha256": "e0e4c30fad679a8dad4932485adba21e0a69521957e3f131a896debb9113ab05", + "references": 6 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "sha256": "27857196b990f76a710e85e99605a9151eec4a826a87d77cee5c55db4edadb11", + "references": 8 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001a-durable-operations.md", + "sha256": "bb4d7f0023d0644054034653a46b35b6928d3d7bf4911602ed02ec4fd56f03fb", + "references": 6 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001b-notifications.md", + "sha256": "81c3324340ce5b95f0741e08881a9cc0f7262dbe67b5fe18eeae42b432541cdf", + "references": 6 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001c-operation-ui.md", + "sha256": "d77386c8b69151368d803aa101de00771e428f628fd6ba32f8280707d415be9f", + "references": 3 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/pol-001-free-pro-entitlements.md", + "sha256": "34d039b46d7f61cf5299676c6c010ec1859e36f250b67be30988680f6df17995", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/pol-002-ai-privacy.md", + "sha256": "831b6d7457175ece5c9faa106db2a152bbd8a092f31283a1c55177bc7ed0e552", + "references": 2 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-004-microsoft-identity.md", + "sha256": "1f72fdbc6925a4b93be087532b299240646ac43734a3a3d8af10a3020c9f8415", + "references": 4 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-005b-email-ownership.md", + "sha256": "e350a96a953a9d6b8b0052317323b7bcebf208dc524ae9a5539c6f36f234b69b", + "references": 5 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-008-attachment-consistency.md", + "sha256": "5fe5460f3004d99c94fe38efa94d861ccf66b5f18564a2fe6d674c4d0bc8376c", + "references": 3 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-009-account-lifecycle.md", + "sha256": "f535897572c98d68913f2f862c253cbb887b2f3b45ac6e80ecff5df488b3e197", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "sha256": "87f4f57b65fb39a365c57965b855cef414e7915c56313d5a490e5609a7d6e9a1", + "references": 23 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "sha256": "960ebf1a4cf50a98815ad3d763c83a1791dc6a8f8e9406380b2d202d9a7bdeb2", + "references": 9 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "sha256": "914e7d170803f73af0995531873b53dc7dc4caf5088e60792937db5abaa8f5a9", + "references": 14 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/session-handoff.md", + "sha256": "798c9574f711b43f898adec21daf051d7ecce8ef00779c49b7a8703ff5edfb05", + "references": 1 + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/job-tracker-ui/README.md", + "sha256": "bf6d6a1a403fae1c3d75295590760ed6d0b66c63f1e0d4b69e0bce314b73e440", + "references": 1 + }, + { + "file": "docs/_archive/s06-acceptance-run.md", + "sha256": "0421c191753bb95ce14da3d07564c720671e5b1f873dd61ed977ef35f24d5306", + "references": 1 + }, + { + "file": "docs/_archive/security-assessments/M013-adversarial-security-assessment.md", + "sha256": "940b300ae01ad8410e78ef98260c710c644ff7bdd8ef667fddf38e774154e928", + "references": 2 + }, + { + "file": "docs/_archive/security-assessments/M014-security-remediation-verification.md", + "sha256": "ce74c1d21f4af9ad73f9db2316ebfc82b82bd636e97961e142f0f51ea5eece68", + "references": 1 + }, + { + "file": "docs/_archive/security-assessments/M015-authorization-replay-report.md", + "sha256": "db37664969d29cceaca9190eda61f10d359a63ec60864f6362866b6b2a51008f", + "references": 2 + }, + { + "file": "docs/_archive/security-assessments/M015-hostile-fixture-setup.md", + "sha256": "3f770171d57d3290b2f470d064900748e0ea7f27fcc2b379f9c797ac44d6b9c6", + "references": 2 + }, + { + "file": "docs/architecture/overview.md", + "sha256": "4244156c015277ca484cfd7fcf66a00088e2b41510145b83e3ae7b4e16c33492", + "references": 2 + }, + { + "file": "docs/audits/2026-09-07/break-jobjakt.mjs", + "sha256": "fe00fe30ef3496e054fb2e9ce0f9883c70340aa0561f4a05a1a0b36c9031f143", + "references": 2 + }, + { + "file": "docs/audits/2026-09-07/evidence/break-results.json", + "sha256": "bccc69965d0505800624151fa046d973f845b109ea7ca770f9da8e44e7f3a468", + "references": 1 + }, + { + "file": "docs/audits/2026-09-07/validation/BoundaryProbes.cs", + "sha256": "6dfd5a112b8efaede36b64477ee3173c35a80f3585cc4324deea9d5762ad6c55", + "references": 3 + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b02-observations.json", + "sha256": "08657251b63a71e2743c11e24d162aa6ab01f14b1d5be01bfebd6d2e1030a22c", + "references": 1 + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b02-test-results.json", + "sha256": "02e6b95da4e539f9b321c3859fa84433784d472520e2983c47755cdb422ed71d", + "references": 1 + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b03-test-results.json", + "sha256": "2bc529556956947568b9e82edebab4c3401f0174e8c65ab90fe1ed176ca815d1", + "references": 4 + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b04-observations.json", + "sha256": "02b1e9562ac412863f9ce0b3804bbb1882bf67578393f40302bb2bcccad5c499", + "references": 1 + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b04-test-results.json", + "sha256": "a471f46f54b6bf16520200e660cb34c3835f2326e83df306a095429f0153ff26", + "references": 1 + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/boundary-results.json", + "sha256": "c3c6652de31d8946ff1a22fa1e3c240637ba416b26bba14d81ac79232ee58a03", + "references": 1 + }, + { + "file": "docs/audits/2026-09-07/validation/probes.mjs", + "sha256": "2555ca86b3f362201103db73a2ba85bfdbb74abd93a815d73d06840606f7d694", + "references": 1 + }, + { + "file": "docs/configuration/environment-variables.md", + "sha256": "2d8725cdaa9bdb4f7418315aca7c2894ba4aa3b19aa347b22f0288e4d1bc88dd", + "references": 2 + }, + { + "file": "docs/configuration/environments.md", + "sha256": "fe967bf1f3edb8195d4019c6431cbcb7ecc5c79ceeb2642d97b4a45752025946", + "references": 1 + }, + { + "file": "docs/database/README.md", + "sha256": "ddb38041bd9720989fcb29b79fe0a5a17ed8023b12222568eaf05004977be796", + "references": 1 + }, + { + "file": "docs/database/backups.md", + "sha256": "bb7bbf4767eb49b1388b5548668a667c26c98f63fe5cd11aab1ff46975dac4a1", + "references": 1 + }, + { + "file": "docs/database/migrations.md", + "sha256": "0a61a12f068eee64c14621addea2352f6c402a9f8cd99527ca6defb5b166f3e5", + "references": 2 + }, + { + "file": "docs/infrastructure/2026-10-20-browser-seeder-portability.md", + "sha256": "af0a975502422167993494cea49ca94c0fadd607b8b14d6b972b5c049c7418f8", + "references": 1 + }, + { + "file": "docs/infrastructure/backups.md", + "sha256": "725ef080e8ab789dd9a314527b5c84d7ccb17e3e4abfe134711408aec63b4662", + "references": 1 + }, + { + "file": "docs/redesign/audit/TEST_FILES.md", + "sha256": "6addd4b004c439ad25bdcc62e3ababb432b1581b924940ec721c2b0330b85684", + "references": 2 + }, + { + "file": "docs/redesign/audit/TEST_INVENTORY.md", + "sha256": "835405bb4ba51db27d1493692f82874d8d3f9d8a550347234df9d98de5f85a3f", + "references": 2 + }, + { + "file": "docs/redesign/phase-2/BASELINE_DEFECTS.md", + "sha256": "292d60f58281c5205f5466efd9696daf48bdcc8136ef2071dd8e466f9208ec5a", + "references": 4 + }, + { + "file": "docs/redesign/phase-2/PRESERVATION_MATRIX.md", + "sha256": "014dc6f47898d2bf2aed6e47e105cf5e031aea20c6ce3b26331e68686d1014a7", + "references": 3 + }, + { + "file": "docs/redesign/phase-2/README.md", + "sha256": "f2a8f151f327cd8fb94d3ace54816c20d3dcf33dcda9509d700fb45fbb972216", + "references": 2 + }, + { + "file": "docs/redesign/phase-2/TRACEABILITY.md", + "sha256": "e4d6bb1402f648ac45e94db77fd4b8c657c855a0556b8ba0c45dd74e79abb444", + "references": 2 + }, + { + "file": "docs/redesign/phase-3/DOCUMENTS_UX.md", + "sha256": "ba208236b88f8bad88c00f97148414faa0fe5b0c8ca041459773d04602f029c1", + "references": 1 + }, + { + "file": "docs/redesign/phase-3/JOB_WORKSPACE.md", + "sha256": "0e8884fa1c62cc41cd1a41b1bb1f98e48757a7fc05c3b3d229c1ab85239bee7c", + "references": 1 + }, + { + "file": "docs/redesign/phase-3/OPEN_DECISIONS.md", + "sha256": "d0a3f8432df8cb2fe066816c82047aafa7b282f5cb5eb4086b4c7f7f8d522798", + "references": 1 + }, + { + "file": "docs/redesign/phase-3/PRESERVATION_IMPACT_MATRIX.md", + "sha256": "334663eaef3a2abb38c330b3d35aba23a1460aeec2eaec0dada1aaad820f6768", + "references": 1 + }, + { + "file": "docs/redesign/phase-3/README.md", + "sha256": "a071792a8d523e5264d78ca6a60117c40b89cb98e6a55c797f7b7f767806527c", + "references": 1 + }, + { + "file": "docs/redesign/phase-4/p4-01/SCAN_RESULTS.json", + "sha256": "ac5c492238a424871ef3d98282856c8cc6ad029bb39e5ff8b3d08c492ad97e30", + "references": 1 + }, + { + "file": "docs/redesign/phase-4/p4-02/README.md", + "sha256": "91578e913e99e80e9cada85de7f1bc4f7e08b604ca61251c28e4e8782995b2d4", + "references": 3 + }, + { + "file": "docs/redesign/phase-4/p4-03/README.md", + "sha256": "fadf9ac8aa76eff418d8416a527283c1be266a57590fbe4cc7a0759334dbed05", + "references": 1 + }, + { + "file": "docs/redesign/phase-4/p4-04/README.md", + "sha256": "e1c0809585dc2231476a18b8415b95c4ef9ed055e7ec26a02f38a35dd8a9d1e0", + "references": 5 + }, + { + "file": "docs/redesign/phase-4/p4-04/SCAN_RESULTS.json", + "sha256": "7aaefe3d4c64d013fe10ef9aee3dcbab0bdfca91755f64f7131feaf94a991aff", + "references": 1 + }, + { + "file": "docs/redesign/phase-4/p4-05/README.md", + "sha256": "8147811670e579d1d2dc70cbfd442ac45acf6064a2393042a9a70f87ba5a7f3a", + "references": 1 + }, + { + "file": "docs/redesign/phase-4/p4-06/PRESERVATION_ACCEPTANCE.md", + "sha256": "1f765551edb8156f92f6834b2e3c568cb4f9fd2153fa65a1757694fece934107", + "references": 2 + }, + { + "file": "docs/redesign/phase-4/p4-06/README.md", + "sha256": "544344917ccb86e41794bd49ae3c2e148177d9305ab4a72f6c388e1334263328", + "references": 4 + }, + { + "file": "docs/redesign/phase-5/OPEN_BLOCKERS.md", + "sha256": "19356258ea7bad53507fda71d39adc33e6d4243babee20b02530b97f9f06395c", + "references": 3 + }, + { + "file": "docs/redesign/phase-5/PRESERVATION_IMPACT.md", + "sha256": "e10512e47a30a6347d43240638f9f338bdd608c78d46b7122cf6948efd49fb05", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/READINESS_GATES.md", + "sha256": "e6c7f21edae1828c6b49711b9430feeadfaac2e514cab6c674e7286447bc1a98", + "references": 2 + }, + { + "file": "docs/redesign/phase-5/VISUAL_ACCEPTANCE.md", + "sha256": "a1b3a612bdd43757e2723f16f44c7f502ad6655dc8c2b2f44afd4d59b3d434f3", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-00/README.md", + "sha256": "70acce9270ed782f90623a7cc97e0dda2c46c28a72b90fed5dfb62f1cc8294a0", + "references": 4 + }, + { + "file": "docs/redesign/phase-5/p5-00/RESULTS.json", + "sha256": "f5b648d640543378c9675f24707baccd99c79b5e23c575e138139d075c06a481", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-01/README.md", + "sha256": "7c82480196f044bb71935fa2e24c4dd2c5f0446d423e30dc4fe204be99b9ae98", + "references": 2 + }, + { + "file": "docs/redesign/phase-5/p5-02/README.md", + "sha256": "256236efb9cd927cae04a3227946787c4624f04aa439772a8059ac763b06c2f1", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-03/README.md", + "sha256": "da77ab08685ef8e222bfd35018e25373562fb91a2925a634d1ef192d1e6fe423", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-04a/README.md", + "sha256": "f4ae490939faef4d69b545908c6aaa3d95a6b492891f37ae5cd33eefa8dc1bb3", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-04b-readiness/README.md", + "sha256": "5452d7aafd52435cec634251a556b911e540773f638bbade6da8962d8af18cc4", + "references": 3 + }, + { + "file": "docs/redesign/phase-5/p5-06/README.md", + "sha256": "0e81a74bc1d59d72876bf449a7bf67f2c999cd4b5be6e2f4f5e435388ee6cb7d", + "references": 2 + }, + { + "file": "docs/redesign/phase-5/p5-08a/evidence/visual-manifest.json", + "sha256": "24b0db4092f054649af4f361c43ee8198c467fca47715acebb492a8755c3f900", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "sha256": "cf15c399c65aed33a79993cf093546c2447a0298add269254c656cad52118053", + "references": 7 + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/evidence/visual-manifest.json", + "sha256": "d968816ea2cdafecdce54dc8f586b225a563cdd0a5c191868f320ff813fdfcde", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-08b/README.md", + "sha256": "bf88189d1abaffe706dedf58e848d9b3a68a1aa07bc08e63918ebe2840ee3fcd", + "references": 3 + }, + { + "file": "docs/redesign/phase-5/p5-08b/evidence/visual-manifest.json", + "sha256": "bdea9aba4b991ffc80d80e615ef0b9e675a880c668e4d956898cd6c383fcc054", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-09-readiness/README.md", + "sha256": "7816321059af2452b976651396813c43ae953436daddbe6213e63b11921a24e5", + "references": 4 + }, + { + "file": "docs/redesign/phase-5/p5-09-readiness/evidence/visual-manifest.json", + "sha256": "562e8a1fdb19919b579332f93720c604469a4089efe0ea119e55c5ea8f52a40a", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "sha256": "83663f57969c1b312fd0b7bc61356c785ef11e87b83a2a715fb77dee2cfd8f8b", + "references": 10 + }, + { + "file": "docs/redesign/phase-5/p5-13-semantic-qualification/README.md", + "sha256": "8f44e6d9bc10fd2899d55c531d2e17929769e23ea5f2516caba53a5864104995", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/EXECUTION_PLAN.md", + "sha256": "fd3efb37286e5787eaddb4474f8f5a3ed93d9f4abb12fd5ead7f66c06a52ed48", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/MANUAL_ACCEPTANCE.md", + "sha256": "66c69fddb0e4c219f670e9bd2e8efbdb38086e5e6309e5d3f34f05ed3140ecfb", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md", + "sha256": "e1af575d89b1af1c679da83c61a01372af550a73e4b0849d028fe13cbd6dd7dd", + "references": 6 + }, + { + "file": "docs/redesign/phase-5/p5-15/READINESS_DEBT.md", + "sha256": "2c1d9ff85e1e8284baf1656223a2952755ca1c3c26778fb49939462b138d5b9c", + "references": 6 + }, + { + "file": "docs/redesign/phase-5/p5-15/README.md", + "sha256": "dc3189554f3bc0a5149146babfcefc26c463d74091f659f60960874882d7103c", + "references": 3 + }, + { + "file": "docs/redesign/phase-5/p5-15/SLICE_INVENTORY.md", + "sha256": "907ab32ec35af163e91ad09d1536f120936ffece7eb541c78643d7c2bbbd4783", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "sha256": "ac981dc3d29921e2961c4711c9e3fe86a02fd83be5ebc2202eef3ec55960bba7", + "references": 8 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md", + "sha256": "1e01c8ade68355aea109cfe51085575f047fd3f7a44c17c12bc913fb5dd442da", + "references": 5 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/README.md", + "sha256": "8f57a51168e6006fc11507d40eac845dd159e56b4e030e436131936a34250d72", + "references": 6 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/README.md", + "sha256": "7c46298b6bdafe2383ab7c328a91931e7b8ad9c4184c7842bcaf952229add3a3", + "references": 3 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/evidence/auth-proof.json", + "sha256": "e478da8a8e264cbb962de27368e49715b1f98cb7d0a0b7a13a0a5247b294ed01", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/README.md", + "sha256": "2b7b45344a8dfa8d9a7534a8d0d561617d1ab958fd9968924d347cff517b26a6", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "sha256": "8c3a56c3eaf18421b826641aa9aab23c2f03035c2a4bf0db11f9c4d1886fd3b8", + "references": 9 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "sha256": "d2e90ac96728048524ce92ac39e6c29e5ddd5f76fa51fd7bfeed8433fea41445", + "references": 18 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/README.md", + "sha256": "6e102c673954c83ce85ddaed7c5c7c32ce02e9696e79ff99c86ee76a79d544d9", + "references": 6 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/evidence/rules-proof.json", + "sha256": "695eac52ee20383da8aaab42bbf6b78eb6c3afd66bc9a4a5c354f5e186808f21", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "sha256": "075c78aaed465b5863a288d4ade860f2b318b7b22b520279c985f6ef85eeae13", + "references": 18 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/repository-validation.json", + "sha256": "6f234a674cd49196be77f12d1c61a7bbfa4c199c8b5581ff236bb170d2e5a867", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-proof.json", + "sha256": "035eea6bc2df29aa42a0f0cc72d0ecac49115c6c06e99e0b0d7c75bef236d8fa", + "references": 5 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/validation.json", + "sha256": "3eaab1c41a9ffe2b0edb69178dc6be2ae76966c39f49b8e1794cced97184a4aa", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/MANUAL_ACCEPTANCE.md", + "sha256": "433d5452ba58864add58cc72de17a488edb8e9cc36caffbe3485513c27787bae", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/README.md", + "sha256": "559e718158b75767ec416807f9352e0a91ba46f83d26115ce21790892b4512b2", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/TEST_COVERAGE.md", + "sha256": "287938456de9099ff99d31772b545581d35001abb5a217ab32ee48d7f5259caf", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/evidence/native-issues.json", + "sha256": "54eda04457b877b049978789b0abcd4f813e301e689f7dd50b6326b50560bbcc", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-03/README.md", + "sha256": "cd0b89e88ce2cb11fccfce65968f252d962e01a1562da01f4f99bdb742ee1dd3", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-04/DEBT_DISPOSITION.md", + "sha256": "ba37025ba01983e66b63a87b655202a8af6c35e895147d2cebc7eccd48a7d9ae", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-05/README.md", + "sha256": "d923a89b082e755779d2a1aad8058fee304946131e043a9a90eea7c812582047", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-06/README.md", + "sha256": "3b25195107fbb2e89d1c2e670e796af2adbb55b18bc4cf77c3d918d0f5e5e717", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/production-release-decision/README.md", + "sha256": "17886f76303556c5ea6142b508f58af056924e5724796d942482d0bfade7a865", + "references": 1 + }, + { + "file": "docs/redesign/phase-5/release-readiness/PRESERVATION_REVIEW.md", + "sha256": "46ee3640d2eede51976b4332c432b87d22902c383cf6637348681fb42ddcae2b", + "references": 3 + }, + { + "file": "docs/redesign/phase-5/release-readiness/README.md", + "sha256": "637df98a8021d7c7f6bb2e78c040c489deb7df8c7a14245fa062c4c9e0117041", + "references": 1 + }, + { + "file": "docs/redesign/phase-6/COMMITS.md", + "sha256": "5f204076a3c693ae23a7a453a24fa44db6b72184b920e92a60f4ccad3090fc7f", + "references": 1 + }, + { + "file": "docs/redesign/phase-6/p6-01/README.md", + "sha256": "ff92cc3d90cd3f69499d3eb53e9fdba8e6eedef18ce507d3b467dd49864f4fef", + "references": 1 + }, + { + "file": "docs/redesign/phase-6/p6-04/README.md", + "sha256": "a145926bdadb691815deba8485312e8fabf0956214ffbd76d46e8f069e45782b", + "references": 1 + }, + { + "file": "docs/redesign/phase-6/p6-04/evidence/performance.json", + "sha256": "d74d2e9d0731ffd95c54d2699ddc594f5e0ff604d7fbe7ccc03e99aa6bdf2a33", + "references": 1 + }, + { + "file": "docs/redesign/phase-6/p6-05/PRESERVATION.md", + "sha256": "74a89feee12b95b3091f7ee1f501d4b2c4713e59a74dcd5b91a70a153d7133a7", + "references": 1 + }, + { + "file": "docs/redesign/phase-6/p6-05/README.md", + "sha256": "275393aba2bb69ef174290b4d2eade8aefc3f5a9dbce332a3bf316ee8783867f", + "references": 2 + }, + { + "file": "docs/redesign/phase-6/p6-05/evidence/backend-validation.json", + "sha256": "e899206edc1236b808f664b545217fa9c044c1fc378e203ae14e4bb3039dd5d5", + "references": 3 + }, + { + "file": "docs/redesign/phase-6/p6-05/evidence/validation.json", + "sha256": "39c85e7807e4f86bb2b6ff8959f0ee3c9d5cefe4e34cb20d74bd6bb3ef3967bb", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/COMMITS.md", + "sha256": "9fff07b5d384bc5994e21c085d62535d3de30aa07d61f58e4b295288dfdf0618", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "sha256": "128cd68f5ccb1708e955ca249065de075407aa21ec3f5d322b6c4f3284e6a1a7", + "references": 7 + }, + { + "file": "docs/redesign/phase-7/PRESERVATION.md", + "sha256": "a8dc1752e34db1562ebcdf76a3acf88c92e3e8c3ee136c737bbbd92a30da71cf", + "references": 6 + }, + { + "file": "docs/redesign/phase-7/README.md", + "sha256": "7ae68c2af4625c90105962aa76d6e60921a7cc02b6cb78a89f81f15b2d061d99", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-00/evidence/baseline.json", + "sha256": "1c1ac4df1cd53f360ab7e3a1f6b169d68e03b9d95d47e966975372b2b12217fb", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-01/evidence/account-results.json", + "sha256": "766c053e35bc45abc111b7e51ea358c3a59fe61151adf9dd3f9df496282799dd", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-01/evidence/public-auth-results.json", + "sha256": "2ee4046f001d1c1071580bea1593ca6bb1d36fb67d3cdec8784cc15ec6f5c431", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-02/README.md", + "sha256": "bd4cce7337b80ef6d729a2f8c4885c6996fc3111278a6092598897dd8b093256", + "references": 5 + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/career-results.json", + "sha256": "1f67cfc3b6d2f34143261bf81a466a28289f21bdbf105ac8ea0b45b4f8446951", + "references": 5 + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "sha256": "57a311629bebb49a6ff31078a8f730224e21e93a05ac65dd067f3542c6937645", + "references": 28 + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/onboarding-results.json", + "sha256": "e7cd700b34ac3c18086303cad770e68502b388286dec371a4ca5a8b9b6cfb1cf", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-03/README.md", + "sha256": "77ee62ba56c49ab70bc82653395d93ece66c284143b2c50f61acbd0a8ee6de63", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-03/evidence/editor-results.json", + "sha256": "d75670e573af9b5fa3bb921628396dd86c6ea38d07d61dc7b4a8ec9633d06d8a", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-03/evidence/import-history-results.json", + "sha256": "950b5e4ace4a7e8ad07b67fb494fcfe0faca8b8f91bae3ad0e6ab7b30028f6fd", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-03/evidence/source-id-results.json", + "sha256": "fdde360d26f9394ee5d265ba9ac68ec65405a6946c010d5b7b004c9a380ca595", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-05/README.md", + "sha256": "c175bb0ff03baebedf06917c30d6225b03b28a40c3958695107946e7c1767088", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "sha256": "899054aa3068eeca17a5737db318e643bae06705e134e2488f9e58b1f3acb543", + "references": 21 + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "sha256": "ad9ddce2be0050f41dc5400644ab038c4dc04cced3de11d98ca27d05caccdf42", + "references": 22 + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/entry.json", + "sha256": "3d7e7bb8793a7630ca8a1cbbc02bdc2b643f618411eb28939264d114cc53d34e", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "sha256": "99671a67fdae54ff51b021d9ffd1cfd3193663ac3aef1ea99c14a89a113ffa73", + "references": 14 + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "sha256": "4f92dcf5c950223a94eefe9d682d25f052bd570ca8d1ef337212ee20b2097935", + "references": 17 + }, + { + "file": "docs/redesign/phase-7/p7-06/COMPOSE.md", + "sha256": "a4dd90851c5ec22084f68f98188635dab12c20ce3555fbc794955e9d5b2f2f8e", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-06/INBOX.md", + "sha256": "f8a53802c745b5223e5f36c10790ac5874c53ce20f120f78d583a61084dd4261", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-06/README.md", + "sha256": "c4600945d15edc66f18afbcae97582629009c5da8e701ea16c563e8c73fed136", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-06/evidence/compose-results.json", + "sha256": "c98d8561d1179c773344de0b11dd863c17cc746ec7066cd8193c84f3d343cba3", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-06/evidence/inbox-results.json", + "sha256": "20a9d66a6785be8cc877265096b98ecc4fabde105b3bb84b7e5d5f73850deab0", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-07/CONTRACT.md", + "sha256": "e47d79a359f7152189e5ceb2ff8b2157d659d3119b4a8e896007d4fdf8eb9be2", + "references": 5 + }, + { + "file": "docs/redesign/phase-7/p7-07/README.md", + "sha256": "722bc4a3f45c0625a241881e0195c58a2762f27b75dab450671bd31d521ee4fa", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/contract-results.json", + "sha256": "58bf7d5767e7f8f4584709bb8851cea6c993eb01c5d27855c1e7ed1106a2fcd1", + "references": 4 + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/entry.json", + "sha256": "749704f885b31b9080853fb55dd11c31e34615cf8ac5a7c68c6761d848573db4", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "sha256": "905a9a8b08b4b69ed4005365fa179945a5392bfba84de99259043010acb79686", + "references": 16 + }, + { + "file": "docs/redesign/phase-7/p7-08/README.md", + "sha256": "4fece4003e442704a807cc2e3aff7b95407a69da9a4b491eccda2ed4ed8896b5", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-08/UTC_TRANSPORT.md", + "sha256": "2395dbf159a7adb59f0037884541da875f19fafe51406089e9a7185de84bce9c", + "references": 5 + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "sha256": "05997c5c1f7eb0dd1fad11f067cb0f90a7af1aa3c271d72b308d34cd5eec774f", + "references": 26 + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "sha256": "0c758430b12cae2d7a45cbd13690b386cf1ce1c47110c223fa1f510172d1a947", + "references": 30 + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/utc-results.json", + "sha256": "2d70a1d15fd11baa218991a8a81f0fe8f5bd34cc8286d385dca4938c40b31804", + "references": 6 + }, + { + "file": "docs/redesign/phase-7/p7-09/COMPANY_CREATE_COMPATIBILITY.md", + "sha256": "8f3a2bcfb13bd033e860a095da33df8be9e6d144731814a78d6543e61eb6931d", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-12/CURRENT_FAILURES.md", + "sha256": "781256aa95b34d1baf7b12e3193eb84762adf4725e8065d887b7dcbf18366c66", + "references": 4 + }, + { + "file": "docs/redesign/phase-7/p7-12/FINAL_ACCEPTANCE.md", + "sha256": "6839f3108fbd6a70c466e13b257989641a1d7699511bcc1bf2ea29df22169328", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-12/FIXTURE_ISOLATION.md", + "sha256": "b9ce372f7801102c387112671689117b9e708ae2223a3192885e49535b00a376", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-12/README.md", + "sha256": "731a0cfc2055aa6997e5b7f3cb40dc213342dbb5b57531e3b892884ab6713bee", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-12/SOURCE_COMMITS.md", + "sha256": "77519821542a72743a0740712b5508f1a8532d090b108894b6ca041dd5cdb99c", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-12/SQLITE_CONCURRENCY.md", + "sha256": "b3f56e1229f3e0f27a410bc5d9785449fdd41a31e207a07ca364d32cc1b8b304", + "references": 5 + }, + { + "file": "docs/redesign/phase-7/p7-12/TERMINAL_CONSUMERS.md", + "sha256": "e2d5b5bc4c9463e57f829c0a6084d391fad8e392619b23a1d4ac50028f183705", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-12/USERS_PAGINATION.md", + "sha256": "c7fea07ed3906191ddddb5db591259c2d4f5130ad01694d3fb555f230758e589", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/completed-unit-gates.json", + "sha256": "470e793406aae8bc995b253fa86ec9602c48b0db0ce81c53f028a586df80f1de", + "references": 2 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/consumer-entry.json", + "sha256": "02cd89fe380660936379def537ed254beb32b7a8a11accd795a895a264f534ff", + "references": 4 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/entry.json", + "sha256": "a7dee2fe73ef730a9b4798b639b39016f3baf6880af0388a04b5ea88d7e95e80", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-entry.json", + "sha256": "66ded0bb7c732ebc2172ae2333ad112a93b6111a3d1fec04773fd5a02572128d", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-regression.json", + "sha256": "f03664023573c3362ee2c3c282b9b2e653bc602b83158c316179cbfcf7142c51", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/lock-observation.json", + "sha256": "a84421e099addef6811c5f7dd330113355bc975c8b99df72fa7f3b416c783fb8", + "references": 1 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/patched-entry.json", + "sha256": "75278a3bd09eeb0f1043fc74396eb96d69be6514378f49a1857388c292f5b44f", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "sha256": "e37ef86bc93f3c4b2866ad8e04158d46c45ddbacfcfb5c8dae2cf09459dbe3a5", + "references": 24 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/successor-entry.json", + "sha256": "89143fcc45e98d321498b69c81a6a20dea114108932ee1aa56def56978f779b0", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/test-counts.json", + "sha256": "5a05c11c6a76ed341ef65dade458249711f4134d8712d0957bf6044df666e461", + "references": 3 + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/wal-entry.json", + "sha256": "eceab14cf4abc49131cedca434a5ce30d1d2b3f1dcaf62f639364fb44dd3c41f", + "references": 4 + }, + { + "file": "docs/redesign/phase-8/README.md", + "sha256": "afd9e16cfd9f25bfa7e71ee5daee93e631ed73f78034a037a3ec71e717ac8d1b", + "references": 1 + }, + { + "file": "docs/redesign/phase-8/p8-01/README.md", + "sha256": "8217fc102192b2ecfebe1a86b69ee91266a560ba3cea3d42114a0b8a7c2f4ddb", + "references": 1 + }, + { + "file": "docs/redesign/phase-8/p8-03/BACKEND.md", + "sha256": "7861c174179ac0f42b24e6e7e1c859a4931a51407182b2119c680e87dee6882c", + "references": 5 + }, + { + "file": "docs/redesign/phase-8/p8-04/README.md", + "sha256": "db131e17dbaa803284442effa335d3899390d1067fc4cd98560a475f9b5aff08", + "references": 1 + }, + { + "file": "docs/redesign/phase-8/p8-05/FINAL_ACCEPTANCE.md", + "sha256": "f22dad60d0152ee0b884a21270867dd7413f397bf28514f3fc0ac7183f71d6ba", + "references": 1 + }, + { + "file": "docs/redesign/phase-8/p8-05/evidence/source-manifest.json", + "sha256": "adb3cb6e3edd2ab2ade990e5cb3ca60a1c9ba794bc82ac362d5806baa4643f04", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/PRESERVATION.md", + "sha256": "d0244967806aa8f00ce9a49e2a1c003000db4a0b90c7e3100537f767ec79a4c7", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/REQUEST.md", + "sha256": "fbbda894325515f795d0d6c7282cffb1cc5d3a916d3406c905dc0ff824f9dd5f", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/RISKS.md", + "sha256": "ac21185ab6c87d0c03abed243d61541bc5bad3fab2fc5b8c060dd0f4a45f808b", + "references": 3 + }, + { + "file": "docs/redesign/phase-9/p9-00/BASELINE.md", + "sha256": "8b57c52dedbdba88af877849e8889f8dbeb315db16ed685e7ee2c9b76d3f8b0e", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "sha256": "8b40f56aa4e475e63870333b0183d8b002c11b8876a5831b3f450ed82faf1ed8", + "references": 22 + }, + { + "file": "docs/redesign/phase-9/p9-00/discovered-cases.json", + "sha256": "a81c02986f50a7e70efd2a8991081cc1be104095dee17cb40a7ca439102dde3c", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-00/inventory.json", + "sha256": "453da3a4ed82a55230d77fb4c9c38447bcce6a93dac060558cbc13def0149d56", + "references": 6 + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-admin-fixture.json", + "sha256": "277da6cabddc94d831c2ca851a4f72602fc625120a3796eba3c5e1cf819f676b", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-cta.json", + "sha256": "e8e936b2d433765c49b6dff7b0f4fce93c2ea0b96455715d328fa50c781112d9", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-worker-isolation.json", + "sha256": "287bb2dd95c189f15eb7246624d87db1c2bd12be54b74f066916a3788f1e0346", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest.json", + "sha256": "d5ee241cfdcc139322780237ffd8291ebb5f041c195a29e249dbca256ccaa3f5", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/p9-01/ordinary-cases.json", + "sha256": "f07818607fbba284c8d15a30bd7ae2051a402b872ce6171193630b2f7b513d75", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-04/RD21_CONCURRENCY_ISSUE.md", + "sha256": "e54094608ad76bc35f4a3db299a24123c7bb00bf465de10573b2e32313cdbaa2", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/p9-04/README.md", + "sha256": "20b2be8bf94783b5adef0a223b8a8e1f2f238e5315655862d44bbb805d509e0c", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-05/README.md", + "sha256": "99d62e644543b28ec00d6ee6ab61af1298e800c79d8a365d8c890b561272079a", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-05/diagnostics/sustained.spec.ts", + "sha256": "59a87155e46f27d919549efc402b534ede632aad01ede4194601da4fd6875270", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-05/performance.json", + "sha256": "ac669954245af89bfd8f098aba8bfe63190e5c0485a3dde978eb4442afc199c2", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-05/volume-results.json", + "sha256": "437d804834d9e4b9005dcff920634a2b455b63ca0e134c2a69a5c8c3c5497019", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-05/volume/README.md", + "sha256": "01f45ae4419e310ae970762e1896fec12b2fb19cb68e63db5f7f93d9c39e2959", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-05/volume/volume.spec.ts", + "sha256": "4510f29298f6391b36d27d2634b1f9355802eafcc310488231014fab799a4108", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-06/README.md", + "sha256": "508990ff6bc31e25d4a8d1b6d9bba7319c45795c94507cae10d82580ee96c010", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/p9-07/FINAL_ACCEPTANCE.md", + "sha256": "c7888ddc05291c786eb3b1b677fadbcfef5ffa46cce7cc296fffca91a2cc7912", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/preservation.json", + "sha256": "65b809f6046a175370757c629ca29b6578059516db69c5bd294d27c44bbc8db2", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "sha256": "d1524dfd405fef653cc6be9c6af2340337398deaac99b9f502de1325ece3e2c9", + "references": 9 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/PLAN.md", + "sha256": "384de0d17e4cba4970d8e3245b32705ada73b9fd750f20fb57549af025333f14", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/PRESERVATION.md", + "sha256": "0f61dd244f15b317177400ef098f0dd7f0c14f164e39282c89bacbd6debec2c0", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/README.md", + "sha256": "89c2010bc060f273b9743916018f730dc78f853600df7df467004964af832f9b", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/RELATED_REVIEW.md", + "sha256": "dc4daccd6ab2ad7f7175de3fffdd677dd4db899407f331e2115725a07495b432", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/REQUEST.md", + "sha256": "a3a28c48d461c6383cc61fe50d851fdd460665fc546063a1149dcb37cc2ee5ed", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/REVIEW_RULINGS.md", + "sha256": "3b69ffcc5199650a0afe98524c9b44ddade0ff64a9c1780cbe44afc153e2f3e5", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ROOT_CAUSE.md", + "sha256": "e26477f4543f66720a2d34d0e57dd072d15680c8245f7e3859e1c00b2010fa8c", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/SAVE_CONTRACT.md", + "sha256": "a0a25dea1e121a69a3a765892ecb7f10cda27ed1d5609c74e0414cc6acf02a28", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/before-regressions.json", + "sha256": "348d2e0f595b585982b962d1a7dea8a0c99780d119e951d06dfe4ffadf5d84df", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/browser-observations.json", + "sha256": "347f06ac0992e8b0a7b4db6191aec9b706e6b4736e0c08452e482a2bdede2e2b", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/persistence.spec.ts", + "sha256": "3a41ff274fff9e29522698ce08c79e3b23a9b9c197f24e252b20e43d76d1497c", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py", + "sha256": "da08c21c5a1f39075a45d1ff92c863ec8fe8d401d0c90ec80b45898e65729d7c", + "references": 6 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/sustained.spec.ts", + "sha256": "d7c03d76021f546031cb2a2645fc99f0db9eb43ee0ad861fdc91a77c207726cb", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/preservation.json", + "sha256": "12666536ea13aa47537e65b1cb496c7476c69164d997f133beb8e0aa588e419b", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/final-fix-report.md", + "sha256": "b5d2cd401c7123183e6dc7387206be741e66d0a3c5cdd17538f580e2a30d602e", + "references": 3 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/final-re-review.md", + "sha256": "5cadd1b516959b91eb4299699b587772795de939c019b58cc4cd70ba1203271a", + "references": 2 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/progress.md", + "sha256": "35bd657a0dbe29c5f36607865a3c12331a2706f2814fa51a2b73399dd5cb7459", + "references": 5 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/task-1-review.md", + "sha256": "1b06ba42c758238c4b16b231d7bfc584b1c87d2e79b7c3269dc4b6c591d30a70", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/task-2-review.md", + "sha256": "0dfeca81ac2a70bc53b72e84a6e716f2f677a91e45fc2e63c79c72e1e30c4e1a", + "references": 1 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/source-manifest.json", + "sha256": "035ea0f2dd81801437e2acdcb5cf75198c8c248d63fe641d1ab963093e04f009", + "references": 4 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "sha256": "e8f6b891f3a4f8ac1e22fd44133ad63f676bc16ddc788be73fb0bb063746fd01", + "references": 25 + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/volume/volume.spec.ts", + "sha256": "9a3abd9f4a8fe558e643bf481dc9a0d1857975e9d532fda6c95e27cf437f7908", + "references": 1 + }, + { + "file": "docs/roadmap/known-issues.md", + "sha256": "024074504791447dfc01c2b0a33c7ebb107cafa80193b2c99f07eca23e922db3", + "references": 1 + }, + { + "file": "docs/roadmap/todo.md", + "sha256": "9a0817da4307c195ce2354d4791d4e0894b79b038fd58f94f7a1e7b0800a6fe3", + "references": 4 + }, + { + "file": "docs/testing/browser.md", + "sha256": "5f448240e38bc5059157070bebe68cc0143465ed9e2c04c0d39d994d3d7acd99", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "sha256": "ffab6b9f8a31fdba30e1ab70a55807defed44951878d4a634ada82001ebe39fd", + "references": 26 + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "sha256": "1a786c3b6794f15234426b0ae956ef300f0c55aee990ac2cb427b6191555af45", + "references": 22 + }, + { + "file": "job-tracker-ui/e2e/phase7-application-forms.spec.ts", + "sha256": "ea1674524342e302f3209cb5378b7f387a3077aff896b1408488c4e70888c864", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-career-editor.spec.ts", + "sha256": "4cafb5dc0fc152a6cc6a99629229d2a2aa58d60c39f42ed9b01f5abb0edb8e7c", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-career-import-review.spec.ts", + "sha256": "049af99e579783cc700ba50f25bc75b911954bfcb5bbd7b692afebdc677f0fdd", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-career-overview.spec.ts", + "sha256": "ee8564c4b16ca01db96c8f23b9c2cf67881ae675c3203f95b5b1f57d00c040bc", + "references": 3 + }, + { + "file": "job-tracker-ui/e2e/phase7-career-source-ids.spec.ts", + "sha256": "b481d21a616680ad6f926c000d9a161fa0dfbfff1ee2a4997a76d60b65637fb2", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-companies.spec.ts", + "sha256": "44937bc1e0471e3ce76e947b3b462b818701a93ccfc8f746632c640dec4a0f6a", + "references": 3 + }, + { + "file": "job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts", + "sha256": "5cb7a8f67926eb8abaf87e740eef5192921a52d39d14cbdad556476d4e818f0d", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-correspondence-read.spec.ts", + "sha256": "5bedf8e8d62b2482afe27883fb2b3d77981eaab0f3abfc3f265122b55c19938e", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-discovery.spec.ts", + "sha256": "8d18edaad34462517eca31cf334dfd894dc0f1ab0a9ffce3440bf9716bd1ab8d", + "references": 2 + }, + { + "file": "job-tracker-ui/e2e/phase7-documents-contract.spec.ts", + "sha256": "aca359ec044332ed688bd108352c28d6f4c960c8201dd4a7853b6281d341f483", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-documents.spec.ts", + "sha256": "7e211cec73cac319f4c8dfb8feb9defd53bf738bf7142b811395db6fcb2fac44", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-job-import.spec.ts", + "sha256": "c16a82463eeeeee52430fff4cf71139586225c150db8cee1f1c572c9e17635b2", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-notifications.spec.ts", + "sha256": "49c25105ec6ce51a2e1f117afb345bd8045803a3aa44a65ac3c01f03edb458f3", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-offers.spec.ts", + "sha256": "b4a33fd4cccdc6cb50fc4667f430b82f3dd7fedc3c6f95453b0dde7719febcef", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-operations.spec.ts", + "sha256": "ee95162d9fa18a46885a55eaeb4171d8bc910b488743015286e4cd20a54f8c3f", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-reminders.spec.ts", + "sha256": "d44acacdab18749183000630001714f1aa603bddc89f2178437f5cc3e847c371", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/phase7-settings-preferences.spec.ts", + "sha256": "6269a229d0caecc5b248490bfd7e1c820220494c278f204cca3085db2096f9cc", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/redesign-preservation.spec.ts", + "sha256": "7b8a99a286ae3d599c6fcfafbcf4bf62acd59cfd43a79dd2b040243d505769a2", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/responsive-accessibility-audit.spec.ts", + "sha256": "73694aefa8c04a01c294dde0cab399748c452f12d72d37f7b8a69c0d2ec99301", + "references": 1 + }, + { + "file": "job-tracker-ui/e2e/saved-search-repair.spec.ts", + "sha256": "d18d064da6ebba4ba9096076c061addfdf103c9ed4cc504d07e3263a494d61f8", + "references": 1 + }, + { + "file": "job-tracker-ui/playwright.auth-recovery.config.ts", + "sha256": "e1398a2ca5da83ae4fcb5f7486025ad57972d1c8c9e59f5045cc0fc4771ffb46", + "references": 1 + }, + { + "file": "job-tracker-ui/playwright.cv-ai.config.ts", + "sha256": "656db4a7910adc37b907c68a0c6a92477b6d3a5295f2b11e5410efc2fae79661", + "references": 3 + }, + { + "file": "job-tracker-ui/playwright.rate-limits.config.ts", + "sha256": "a13a8376e4761fd110107c75617b7814c005e743c10234e6d378fd1ac817771b", + "references": 1 + }, + { + "file": "scripts/s06-acceptance-data.sh", + "sha256": "3d6fe787908ffe291bb336dfbcddae91857b9800e6ee3b5f2a4d523dc98c375f", + "references": 2 + }, + { + "file": "scripts/s06-acceptance-run.sh", + "sha256": "a2cac63b06ea0c10152905e0ce0b965f7cd2319457b9614ffc8bbc04fb505d5d", + "references": 3 + }, + { + "file": "tools/hostile-fixture-db/Program.cs", + "sha256": "290fe9a274a6c6c6f34dfd6fe088e77f94a0650f853d3b60f7e3ff691989c495", + "references": 2 + }, + { + "file": "tools/summarizer/app.py", + "sha256": "6a35211b8d7b76361d8b65d3027bce62598b10adf505a847f28eb8f19487ed10", + "references": 2 + }, + { + "file": "tools/summarizer/tests/test_app.py", + "sha256": "6993e09e22e215833ae049e1a568f664906f667708af4d7289964e92d9f2989e", + "references": 2 + } + ], + "references": [ + { + "file": ".env.example", + "line": 7, + "text": "DATABASE_PROVIDER=sqlite", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": ".env.example", + "line": 8, + "text": "# Required for mariadb/mysql; ignored for sqlite.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi.Tests/AccountDataExportTests.cs", + "line": 14, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AccountDataExportTests.cs", + "line": 138, + "text": " SqliteConnection.ClearAllPools();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AccountDataExportTests.cs", + "line": 173, + "text": " SqliteConnection.ClearAllPools();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AccountDataExportTests.cs", + "line": 205, + "text": " .UseSqlite($\"Data Source={Path.Combine(root, \"account-export-tests.db\")}\")", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AccountDeletionTests.cs", + "line": 8, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AccountDeletionTests.cs", + "line": 308, + "text": " .UseSqlite($\"Data Source={Path.Combine(root, \"deletion-tests.db\")}\")", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AccountDeletionTests.cs", + "line": 322, + "text": " SqliteConnection.ClearAllPools();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiOperationQueueTests.cs", + "line": 5, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiOperationQueueTests.cs", + "line": 151, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiOperationQueueTests.cs", + "line": 155, + "text": " private Fixture(SqliteConnection connection, ServiceProvider provider, SyntheticHandler handler)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiOperationQueueTests.cs", + "line": 164, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiOperationQueueTests.cs", + "line": 180, + "text": " services.AddDbContext((_, options) => options.UseSqlite(connection));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiPrivacyPolicyTests.cs", + "line": 6, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiPrivacyPolicyTests.cs", + "line": 128, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiPrivacyPolicyTests.cs", + "line": 132, + "text": " private Fixture(SqliteConnection connection, ServiceProvider services, AiPrivacyPolicy policy)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiPrivacyPolicyTests.cs", + "line": 141, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiPrivacyPolicyTests.cs", + "line": 154, + "text": " services.AddDbContext((_, options) => options.UseSqlite(connection));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiUsageMeterTests.cs", + "line": 4, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiUsageMeterTests.cs", + "line": 97, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AiUsageMeterTests.cs", + "line": 101, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AttachmentConsistencyTests.cs", + "line": 7, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AttachmentConsistencyTests.cs", + "line": 316, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AttachmentConsistencyTests.cs", + "line": 323, + "text": " private Fixture(SqliteConnection connection, string root, JobTrackerContext db, AppPaths paths, AttachmentStorage storage)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AttachmentConsistencyTests.cs", + "line": 340, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/AttachmentConsistencyTests.cs", + "line": 344, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs", + "line": 8, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs", + "line": 380, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs", + "line": 385, + "text": " private Fixture(SqliteConnection connection, ServiceProvider provider, IConfiguration configuration)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs", + "line": 395, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/BackgroundWorkerTenantTests.cs", + "line": 403, + "text": " services.AddDbContext((_, options) => options.UseSqlite(connection));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CareerEvidenceControllerTests.cs", + "line": 7, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CareerEvidenceControllerTests.cs", + "line": 38, + "text": " public async Task List_orders_owned_evidence_by_actual_timestamp_with_sqlite()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CareerEvidenceControllerTests.cs", + "line": 40, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CareerEvidenceControllerTests.cs", + "line": 44, + "text": " await using var db = new JobTrackerContext(new DbContextOptionsBuilder().UseSqlite(connection).Options, current.Object);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CompanyCreateCompatibilityTests.cs", + "line": 8, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CompanyCreateCompatibilityTests.cs", + "line": 81, + "text": " private sealed class Fixture(SqliteConnection connection, JobTrackerContext db) : IAsyncDisposable", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CompanyCreateCompatibilityTests.cs", + "line": 97, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CompanyCreateCompatibilityTests.cs", + "line": 101, + "text": " var db = new JobTrackerContext(new DbContextOptionsBuilder().UseSqlite(connection).Options, currentUser.Object);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/ConcurrentInitializationTests.cs", + "line": 5, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/ConcurrentInitializationTests.cs", + "line": 113, + "text": " .UseSqlite($\"Data Source={path}\")", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/ConcurrentInitializationTests.cs", + "line": 130, + "text": " var builder = new DbContextOptionsBuilder().UseSqlite($\"Data Source={_path}\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/ConcurrentInitializationTests.cs", + "line": 137, + "text": " SqliteConnection.ClearAllPools();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvAiReadinessTests.cs", + "line": 11, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvAiReadinessTests.cs", + "line": 24, + "text": " public readonly SqliteConnection Connection = new(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvAiReadinessTests.cs", + "line": 39, + "text": " Db = new(new DbContextOptionsBuilder().UseSqlite(Connection).Options, current.Object);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvBuilderTests.cs", + "line": 4, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvBuilderTests.cs", + "line": 390, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvBuilderTests.cs", + "line": 392, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvExtractionCoverageTests.cs", + "line": 30, + "text": " \"JobTrack\\nFull-stack job-application tracker (React, ASP.NET Core, SQLite, Docker).\\n\\n\" +", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvProcessingOperationTests.cs", + "line": 10, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvProcessingOperationTests.cs", + "line": 209, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvProcessingOperationTests.cs", + "line": 214, + "text": " private Fixture(SqliteConnection connection, string tempRoot, ServiceProvider provider)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvProcessingOperationTests.cs", + "line": 223, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvProcessingOperationTests.cs", + "line": 264, + "text": " services.AddDbContext((_, options) => options.UseSqlite(connection));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "line": 4, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "line": 13, + "text": " private static JobTrackerContext Context(SqliteConnection connection, string owner = \"revision-owner\")", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "line": 17, + "text": " return new JobTrackerContext(new DbContextOptionsBuilder().UseSqlite(connection).Options, principal.Object);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "line": 27, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "line": 54, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "line": 70, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/CvRevisionReadinessTests.cs", + "line": 121, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DashboardPreferencesTests.cs", + "line": 275, + "text": " public JobTrackerContext Db() => new(new DbContextOptionsBuilder().UseSqlite(connection).Options, Mock.Of());", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DashboardPreferencesTests.cs", + "line": 288, + "text": " builder.Configuration.AddInMemoryCollection(new Dictionary { [\"Data:Root\"] = directory, [\"Database:Provider\"] = \"sqlite\", [\"ConnectionStrings:JobTracker\"] = connection, [\"Auth:AdminEmail\"] = \"\", [\"Auth:AdminPassword\"] = \"\" });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DashboardPreferencesTests.cs", + "line": 295, + "text": " builder.Services.AddDbContext(x => x.UseSqlite(connection).AddInterceptors(readObserver));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 2, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 20, + "text": " SqliteConnection.ClearAllPools();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 28, + "text": " using var connection = new SqliteConnection(connectionString);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 36, + "text": " private SqliteDatabaseBackupRunner CreateRunner(string connectionString, int retainCount = 14)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 37, + "text": " => new(connectionString, Path.Combine(_root, \"backups\"), retainCount, NullLogger.Instance);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 50, + "text": " await using var verify = new SqliteConnection($\"Data Source={backupPath}\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 61, + "text": " await using var source = new SqliteConnection(connectionString);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 72, + "text": " await using var backup = new SqliteConnection($\"Data Source={backupPath};Mode=ReadOnly;Pooling=False\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 100, + "text": " var stale = Path.Combine(backupsRoot, $\"{SqliteDatabaseBackupRunner.BackupFilePrefix}stale{i}.db\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 107, + "text": " var remaining = Directory.GetFiles(backupsRoot, $\"{SqliteDatabaseBackupRunner.BackupFilePrefix}*.db\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DatabaseBackupRunnerTests.cs", + "line": 121, + "text": " var file = Path.Combine(runner.BackupsRoot, $\"{SqliteDatabaseBackupRunner.BackupFilePrefix}x.db\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DocumentsControllerTests.cs", + "line": 397, + "text": " public string DatabaseFile { get; } = Path.Combine(root, \"documents.sqlite\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/DocumentsControllerTests.cs", + "line": 416, + "text": " builder.Services.AddDbContext(options => options.UseSqlite($\"Data Source={Path.Combine(root, \"documents.sqlite\")};Pooling=False\").AddInterceptors(commands));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftPersistenceTests.cs", + "line": 4, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftPersistenceTests.cs", + "line": 16, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftPersistenceTests.cs", + "line": 18, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "line": 11, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "line": 243, + "text": " public async Task Draft_DTO_timestamps_keep_UTC_shape_and_exact_ticks_after_SQLite_roundtrips()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "line": 386, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "line": 389, + "text": " private Fixture(SqliteConnection connection, DbContextOptions options)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "line": 402, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "line": 404, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs", + "line": 9, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs", + "line": 71, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs", + "line": 77, + "text": " private Fixture(SqliteConnection connection, ServiceProvider provider, JobTrackerContext db, UserManager users)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs", + "line": 87, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailOwnershipIntegrationTests.cs", + "line": 95, + "text": " services.AddDbContext((_, options) => options.UseSqlite(connection));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendAttemptStoreTests.cs", + "line": 4, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendAttemptStoreTests.cs", + "line": 114, + "text": " private sealed class Fixture(SqliteConnection connection, DbContextOptions options, int jobId, int otherJobId) : IAsyncDisposable", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendAttemptStoreTests.cs", + "line": 123, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendAttemptStoreTests.cs", + "line": 125, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendControllerTests.cs", + "line": 10, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendControllerTests.cs", + "line": 174, + "text": " private sealed class Fixture(SqliteConnection connection, DbContextOptions options, JobTrackerContext db, int jobId) : IAsyncDisposable", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendControllerTests.cs", + "line": 182, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/EmailSendControllerTests.cs", + "line": 184, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/JobQueryParityTests.cs", + "line": 9, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/JobQueryParityTests.cs", + "line": 16, + "text": "// Real SQLite: EF InMemory cannot prove LIKE, relational ordering or tenant joins.", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/JobQueryParityTests.cs", + "line": 38, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/JobQueryParityTests.cs", + "line": 40, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/JobTrackerApi.Tests.csproj", + "line": 18, + "text": " ", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs", + "line": 9, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs", + "line": 148, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs", + "line": 156, + "text": " SqliteConnection connection,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs", + "line": 173, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs", + "line": 178, + "text": " new DbContextOptionsBuilder().UseSqlite(connection).Options,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 5, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 21, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 46, + "text": " public async Task Blank_sqlite_chain_reaches_latest_and_is_idempotent()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 48, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 57, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 61, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 85, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 177, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 219, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 256, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 292, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 357, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 369, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 436, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 450, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 496, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 512, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 553, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 567, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 622, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 637, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 693, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 712, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 745, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 759, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 807, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 821, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 862, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 874, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 919, + "text": " SELECT COUNT(*) FROM sqlite_master", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 931, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 1039, + "text": " SELECT COUNT(*) FROM sqlite_master WHERE type = 'index' AND name IN (", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 1060, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 1124, + "text": " SELECT COUNT(*) FROM sqlite_master WHERE type = 'index' AND name IN (", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 1140, + "text": " private static JobTrackerContext Context(SqliteConnection connection)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 1145, + "text": " new DbContextOptionsBuilder().UseSqlite(connection).Options,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 1149, + "text": " private static async Task ScalarAsync(SqliteConnection connection, string sql)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/MigrationChainTests.cs", + "line": 1156, + "text": " private static async Task ExecuteAsync(SqliteConnection connection, string sql)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/OperationsControllerTests.cs", + "line": 123, + "text": " public async Task Operation_and_notification_DTOs_preserve_all_UTC_instants_after_SQLite_roundtrips()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/OperationsControllerTests.cs", + "line": 239, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(_connectionString).Options;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 11, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 21, + "text": " private static JobTrackerContext Context(SqliteConnection connection, IInterceptor? interceptor = null)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 25, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 64, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 93, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 112, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 137, + "text": " await using (var setupConnection = new SqliteConnection($\"Data Source={path};Pooling=False\"))", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 148, + "text": " await using var connection = new SqliteConnection($\"Data Source={path};Pooling=False\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 159, + "text": " await using var verifyConnection = new SqliteConnection($\"Data Source={path};Pooling=False\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 184, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 206, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 227, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 257, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 280, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 309, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21CareerPersistenceTests.cs", + "line": 339, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 10, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 19, + "text": " private static JobTrackerContext Context(SqliteConnection connection, string owner = \"rd21-owner\")", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 23, + "text": " return new JobTrackerContext(new DbContextOptionsBuilder().UseSqlite(connection).Options, current.Object);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 38, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 115, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 142, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 175, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 200, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/Rd21JobPersistenceTests.cs", + "line": 259, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 8, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 19, + "text": "public sealed class SavedJobSearchSqliteTests(ITestOutputHelper output)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 24, + "text": " await using var fixture = await SqliteFixture.CreateAsync();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 33, + "text": " await using var fixture = await SqliteFixture.CreateAsync();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 69, + "text": " await using var fixture = await SqliteFixture.CreateAsync();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 93, + "text": " await using var fixture = await SqliteFixture.CreateAsync(owner: null);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 106, + "text": " public async Task Saved_search_filters_run_state_alert_toggle_dismiss_and_delete_survive_sqlite_readback()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 108, + "text": " await using var fixture = await SqliteFixture.CreateAsync();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 159, + "text": " await using var fixture = await SqliteFixture.CreateAsync();", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 189, + "text": " private sealed class SqliteFixture(SqliteConnection connection, JobTrackerContext db, JobDiscoveryController controller,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 197, + "text": " public static async Task CreateAsync(string? owner = \"owner-1\")", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 199, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 208, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connection)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs", + "line": 216, + "text": " return new SqliteFixture(connection, db, controller, discovery, cache, sql);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 13, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 22, + "text": "public sealed class SqliteDateTimeOffsetCompatibilityTests", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 25, + "text": " public async Task Tailoring_and_submission_capture_work_on_native_sqlite()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 27, + "text": " await using var fixture = await SqliteFixture.CreateAsync(\"user-1\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 120, + "text": " await using var fixture = await SqliteFixture.CreateAsync(\"user-1\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 154, + "text": " await using var fixture = await SqliteFixture.CreateAsync(\"user-1\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 195, + "text": " public async Task Usage_and_extraction_run_endpoints_work_on_sqlite()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 197, + "text": " await using var fixture = await SqliteFixture.CreateAsync(\"user-1\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 303, + "text": " private sealed class SqliteFixture : IAsyncDisposable", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 305, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 310, + "text": " private SqliteFixture(SqliteConnection connection, JobTrackerContext db, AppPaths paths, string tempRoot)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 318, + "text": " public static async Task CreateAsync(string owner)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 320, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 324, + "text": " var db = new JobTrackerContext(new DbContextOptionsBuilder().UseSqlite(connection).Options, currentUser.Object);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 327, + "text": " var tempRoot = Path.Combine(Path.GetTempPath(), $\"jobtracker-sqlite-tests-{Guid.NewGuid():N}\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs", + "line": 331, + "text": " return new SqliteFixture(connection, db, new AppPaths(config, environment.Object), tempRoot);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteMigrationHelperTests.cs", + "line": 3, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteMigrationHelperTests.cs", + "line": 8, + "text": "public sealed class SqliteMigrationHelperTests", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "line": 6, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "line": 14, + "text": "public sealed class SqliteStartupConcurrencyTests", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "line": 20, + "text": " await using var connection = new SqliteConnection(database.ConnectionString);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "line": 46, + "text": " await using var connection = new SqliteConnection(database.ConnectionString);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "line": 96, + "text": " [\"Database:Provider\"] = \"sqlite\",", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs", + "line": 107, + "text": " builder.Services.AddDbContext(options => options.UseSqlite(connectionString)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StartupSchemaOwnershipTests.cs", + "line": 3, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StartupSchemaOwnershipTests.cs", + "line": 15, + "text": " using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StartupSchemaOwnershipTests.cs", + "line": 19, + "text": " new DbContextOptionsBuilder().UseSqlite(connection).Options,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StrategySnapshotOperationTests.cs", + "line": 8, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StrategySnapshotOperationTests.cs", + "line": 113, + "text": " private readonly SqliteConnection _connection;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StrategySnapshotOperationTests.cs", + "line": 118, + "text": " private Fixture(SqliteConnection connection, ServiceProvider provider, Mock summarizer)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StrategySnapshotOperationTests.cs", + "line": 127, + "text": " var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/StrategySnapshotOperationTests.cs", + "line": 149, + "text": " services.AddDbContext((_, options) => options.UseSqlite(connection));", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/UserOperationStoreTests.cs", + "line": 277, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(_connectionString);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/UsersControllerTests.cs", + "line": 17, + "text": "using Microsoft.Data.Sqlite;", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/UsersControllerTests.cs", + "line": 63, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/UsersControllerTests.cs", + "line": 68, + "text": " .UseSqlite(connection)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/UsersControllerTests.cs", + "line": 159, + "text": " await using var connection = new SqliteConnection(\"Data Source=:memory:\");", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/UsersControllerTests.cs", + "line": 164, + "text": " .UseSqlite(connection)", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 5, + "text": " \"Microsoft.Data.Sqlite\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 11, + "text": " \"Microsoft.Data.Sqlite.Core\": \"9.0.14\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 12, + "text": " \"SQLitePCLRaw.bundle_e_sqlite3\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 13, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\"", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 134, + "text": " \"Microsoft.Data.Sqlite.Core\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 139, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\"", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 174, + "text": " \"Microsoft.EntityFrameworkCore.Sqlite\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 179, + "text": " \"Microsoft.EntityFrameworkCore.Sqlite.Core\": \"9.0.14\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 184, + "text": " \"SQLitePCLRaw.bundle_e_sqlite3\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 185, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 189, + "text": " \"Microsoft.EntityFrameworkCore.Sqlite.Core\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 194, + "text": " \"Microsoft.Data.Sqlite.Core\": \"9.0.14\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 200, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 421, + "text": " \"SQLitePCLRaw.bundle_e_sqlite3\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 426, + "text": " \"SQLitePCLRaw.lib.e_sqlite3\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 427, + "text": " \"SQLitePCLRaw.provider.e_sqlite3\": \"2.1.10\"", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 430, + "text": " \"SQLitePCLRaw.core\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 438, + "text": " \"SQLitePCLRaw.lib.e_sqlite3\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 443, + "text": " \"SQLitePCLRaw.provider.e_sqlite3\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 448, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\"", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 563, + "text": " \"Microsoft.EntityFrameworkCore.Sqlite\": \"[9.0.14, )\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi.Tests/packages.lock.json", + "line": 568, + "text": " \"SQLitePCLRaw.lib.e_sqlite3\": \"[2.1.12, )\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/Controllers/AdminSystemController.cs", + "line": 171, + "text": " var provider = (_cfg[\"Database:Provider\"] ?? \"sqlite\").Trim().ToLowerInvariant();", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/CareerEvidenceController.cs", + "line": 25, + "text": " // SQLite cannot order DateTimeOffset; retain SQL ownership filtering before sorting.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/CareerEvidenceController.cs", + "line": 26, + "text": " var rows = db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/JobApplicationsController.cs", + "line": 513, + "text": " // Avoid referencing nullable/possibly-missing columns in legacy SQLite DBs", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/JobDiscoveryController.cs", + "line": 61, + "text": " // SQLite cannot order DateTimeOffset; sort owned summaries after SQL filtering/counts.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/JobDiscoveryController.cs", + "line": 62, + "text": " var searches = db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/OperationsController.cs", + "line": 63, + "text": " // SQLite drops DateTime.Kind; these fields retain their stored UTC ticks.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/ProfileCvController.Pipeline.cs", + "line": 560, + "text": " var expired = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/ProfileCvController.cs", + "line": 233, + "text": " var runs = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/ProfileCvController.cs", + "line": 336, + "text": " var artifact = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/SessionsController.cs", + "line": 44, + "text": " // Equality-only in the DB query, then filter/sort DateTimeOffset client-side: SQLite's EF", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/SessionsController.cs", + "line": 45, + "text": " // Core provider cannot translate \">\" or ORDER BY over DateTimeOffset to SQL (\"SQLite does", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Controllers/TwoFactorController.cs", + "line": 233, + "text": " // SQLite/Pomelo cannot translate DateTimeOffset ORDER BY to SQL (same issue as the", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/JobTrackerApi.csproj", + "line": 19, + "text": " ", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/JobTrackerApi.csproj", + "line": 25, + "text": " ", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/Migrations/20260310174114_AddCorrespondence.cs", + "line": 20, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260310174114_AddCorrespondence.cs", + "line": 34, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260310174114_AddCorrespondence.cs", + "line": 45, + "text": " // startup reconciliation. Include them for new databases so the later SQLite", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260310174114_AddCorrespondence.cs", + "line": 74, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260311093000_AddAttachmentsAndJobEvents.cs", + "line": 19, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260311093000_AddAttachmentsAndJobEvents.cs", + "line": 48, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260717071417_AddJobEntityAndProspectStages.cs", + "line": 37, + "text": " // On SQLite this is a table rebuild; EF carries over every column it knows about, and", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260717071417_AddJobEntityAndProspectStages.cs", + "line": 71, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260717222917_AddCareerProfileRelationalChildren.cs", + "line": 10, + "text": " // Deliberately a no-op. Scaffolded against SQLite, so on MariaDB it emitted an unbounded", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260718074509_AddCvVariants.cs", + "line": 14, + "text": " // string columns, which succeeds on SQLite but throws on MariaDB (\"BLOB/TEXT column used in key", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260719085904_AddApplicationChecklistItems.cs", + "line": 10, + "text": " // Deliberately a no-op. Scaffolded against SQLite, so on MariaDB this would emit TEXT datetimes", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260719085904_AddApplicationChecklistItems.cs", + "line": 16, + "text": " // StartupInitializationExtensions, which carries correct DDL for both SQLite and MySQL. This", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260719120954_AddCoverLetterVersions.cs", + "line": 10, + "text": " // Deliberately a no-op. Scaffolded against SQLite, so on MariaDB it would emit a TEXT", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260719145044_AddInterviewPrepItems.cs", + "line": 10, + "text": " // Deliberately a no-op. Scaffolded against SQLite, so on MariaDB it would emit TEXT datetimes", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260730203422_AddAiUsageMetering.cs", + "line": 10, + "text": " // Intentionally a no-op: StartupInitializationExtensions owns idempotent SQLite/MariaDB", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260731115022_AddStripeBillingState.cs", + "line": 14, + "text": " // StartupInitializationExtensions owns provider-safe, idempotent SQLite/MariaDB DDL.", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260802224646_AddUserOperations.cs", + "line": 14, + "text": " // This table is EF-owned. The migration branches explicitly because SQLite-scaffolded", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260802225941_AddUserNotifications.cs", + "line": 15, + "text": " // the SQLite-scaffolded TEXT types, and do not duplicate it in startup reconciliation.", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260815164027_AddAccountDeletionLifecycle.cs", + "line": 101, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260815175236_AddCrossFeatureAiUsage.cs", + "line": 82, + "text": " .Annotation(\"Sqlite:Autoincrement\", true),", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830122000_AdoptGmailReviewDecisionsSchema.cs", + "line": 12, + "text": "/// missing MariaDB table while retaining SQLite rows created by startup reconciliation.", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830133000_AdoptCareerProfileSchema.cs", + "line": 26, + "text": " migrationBuilder.Sql(SqliteDdl);", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830133000_AdoptCareerProfileSchema.cs", + "line": 34, + "text": " private const string SqliteDdl = \"\"\"", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830134000_AdoptIdentitySchema.cs", + "line": 22, + "text": " : SqliteDdl);", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830134000_AdoptIdentitySchema.cs", + "line": 30, + "text": " private const string SqliteDdl = \"\"\"", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830135000_AdoptSubmittedApplicationPackageSchema.cs", + "line": 14, + "text": " migrationBuilder.Sql(ActiveProvider.Contains(\"MySql\", StringComparison.OrdinalIgnoreCase) ? MySqlDdl : SqliteDdl);", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830135000_AdoptSubmittedApplicationPackageSchema.cs", + "line": 23, + "text": " private const string SqliteDdl = \"\"\"", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830136000_AdoptCareerEvidenceSchema.cs", + "line": 13, + "text": " ActiveProvider.Contains(\"MySql\", StringComparison.OrdinalIgnoreCase) ? MySqlDdl : SqliteDdl);", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830136000_AdoptCareerEvidenceSchema.cs", + "line": 16, + "text": " private const string SqliteDdl = \"\"\"", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830137000_AdoptSavedJobSearchSchema.cs", + "line": 10, + "text": " protected override void Up(MigrationBuilder b) => b.Sql(ActiveProvider.Contains(\"MySql\", StringComparison.OrdinalIgnoreCase) ? MySql : Sqlite);", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20260830137000_AdoptSavedJobSearchSchema.cs", + "line": 12, + "text": " private const string Sqlite = \"\"\"", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20261021090000_AddDashboardLayoutPreference.cs", + "line": 22, + "text": " if (ActiveProvider.Contains(\"Sqlite\", StringComparison.OrdinalIgnoreCase))", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20261021090000_AddDashboardLayoutPreference.cs", + "line": 24, + "text": " // These independent columns need no table rebuild (SQLite 3.35+ supports DROP COLUMN).", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Migrations/20261023090000_AddJobRevision.cs", + "line": 20, + "text": " if (ActiveProvider.Contains(\"Sqlite\", StringComparison.OrdinalIgnoreCase))", + "classification": "required_historical_or_data_preservation", + "reason": "migration_history" + }, + { + "file": "JobTrackerApi/Models/StructuredCvProfileJson.cs", + "line": 17, + "text": " \"python\", \"ruby\", \"sql\", \"mysql\", \"postgresql\", \"postgres\", \"sqlite\", \"javascript\", \"typescript\",", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Program.cs", + "line": 100, + "text": " var provider = (cfg[\"Database:Provider\"] ?? \"sqlite\").Trim().ToLowerInvariant();", + "classification": "obsolete", + "reason": "silent_provider_fallback" + }, + { + "file": "JobTrackerApi/Program.cs", + "line": 105, + "text": " provider = \"sqlite\";", + "classification": "obsolete", + "reason": "silent_provider_fallback" + }, + { + "file": "JobTrackerApi/Program.cs", + "line": 120, + "text": " options.UseSqlite(cs, sqlite =>", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Program.cs", + "line": 122, + "text": " sqlite.MigrationsAssembly(\"JobTrackerApi\");", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Program.cs", + "line": 183, + "text": "builder.Services.AddSingleton();", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/AiUsageMeter.cs", + "line": 99, + "text": " if (db.Database.IsSqlite())", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/AiWorkspaceService.cs", + "line": 202, + "text": " return _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/AiWorkspaceService.cs", + "line": 246, + "text": " var variant = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/AnalyticsService.cs", + "line": 46, + "text": " // across the SQLite/MySQL providers this app runs on, so pull just the DateApplied", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/ApplicationAssetsService.cs", + "line": 116, + "text": " var attached = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/ApplicationAssetsService.cs", + "line": 185, + "text": " var evidence = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/ApplicationIntelligenceService.cs", + "line": 209, + "text": " var attached = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/ApplicationWorkspaceService.cs", + "line": 82, + "text": " var variant = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/ApplicationWorkspaceService.cs", + "line": 100, + "text": " var lastAi = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/CareerProfileService.cs", + "line": 161, + "text": " Microsoft.Data.Sqlite.SqliteException sqlite => sqlite.SqliteErrorCode == 19", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/CareerProfileService.cs", + "line": 162, + "text": " && sqlite.Message.Contains(\"UNIQUE constraint failed: CareerProfiles.OwnerUserId\", StringComparison.Ordinal),", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/CvVariantService.cs", + "line": 68, + "text": " var variants = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 1, + "text": "using Microsoft.Data.Sqlite;", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 16, + "text": " public sealed class SqliteDatabaseBackupRunner : IDatabaseBackupRunner", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 20, + "text": " private readonly ILogger _logger;", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 27, + "text": " public SqliteDatabaseBackupRunner(IConfiguration cfg, AppPaths paths, ILogger logger)", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 31, + "text": " var provider = (cfg[\"Database:Provider\"] ?? \"sqlite\").Trim().ToLowerInvariant();", + "classification": "obsolete", + "reason": "silent_provider_fallback" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 36, + "text": " provider = \"sqlite\";", + "classification": "obsolete", + "reason": "silent_provider_fallback" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 40, + "text": " IsSupported = provider == \"sqlite\";", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 46, + "text": " public SqliteDatabaseBackupRunner(string connectionString, string backupsRoot, int retainCount, ILogger logger)", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 59, + "text": " _logger.LogWarning(\"Automated backups only support the SQLite provider. Configure external backups for MySQL/MariaDB.\");", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DatabaseBackupRunner.cs", + "line": 68, + "text": " await using (var connection = new SqliteConnection(_connectionString))", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 45, + "text": " var sqlite = db.Database.IsSqlite();", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 46, + "text": " var count = await db.Database.SqlQueryRaw(BuildSql(sqlite, true, sort), parameters).ToListAsync(ct);", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 47, + "text": " var rows = await db.Database.SqlQueryRaw(BuildSql(sqlite, false, sort), parameters).ToListAsync(ct);", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 52, + "text": " private static string BuildSql(bool sqlite, bool count, string sort)", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 59, + "text": " var answers = HasAnswers(sqlite);", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 147, + "text": " SELECT documents.*, {{DateTicks(sqlite)}} AS DateSortTicks {{filtered}}", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 168, + "text": " private static string HasAnswers(bool sqlite)", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 170, + "text": " string Position(string needle, string value) => sqlite ? $\"INSTR({value}, '{needle}')\"", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 176, + "text": " var notes = sqlite ? \"COALESCE(j.Notes, '')\" : \"CONVERT(COALESCE(j.Notes, '') USING utf8mb4) COLLATE utf8mb4_bin\";", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 179, + "text": " var legacy = Position(legacyPrefix, $\"LOWER({notes})\" + (sqlite ? \"\" : \" COLLATE utf8mb4_bin\"));", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 184, + "text": " private static string DateTicks(bool sqlite)", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 187, + "text": " if (sqlite)", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/DocumentsIndexService.cs", + "line": 189, + "text": " // Split whole seconds from seven fractional digits; SQLite's fractional date arithmetic rounds.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/JobImport/SkillTagger.cs", + "line": 27, + "text": " (\"SQL\", new Regex(@\"\\bSQL\\b|\\bPostgreSQL\\b|\\bMySQL\\b|\\bSQLite\\b|\\bMS\\s*SQL\\b|\\bT-?SQL\\b\", RegexOptions.IgnoreCase | RegexOptions.Compiled), 5),", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 14, + "text": " // SQLite-dialect schema helpers. Promoted from local functions to class-level statics so a", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 22, + "text": " cmd.CommandText = \"SELECT 1 FROM sqlite_master WHERE type='table' AND name=$name LIMIT 1;\";", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 134, + "text": " // A migration scaffolded against SQLite bakes SQLite type names into its DDL (\"TEXT\" for", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 260, + "text": " // Apply EF migrations on startup (SQLite dev DB lives in the repo).", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 267, + "text": " var provider = (app.Configuration[\"Database:Provider\"] ?? \"sqlite\").Trim().ToLowerInvariant();", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 268, + "text": " var useSqliteBootstrap = provider is not \"mysql\" and not \"mariadb\";", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 271, + "text": " if (useSqliteBootstrap) db.Database.ExecuteSqlRaw(\"PRAGMA journal_mode = WAL;\");", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 285, + "text": " if (useSqliteBootstrap)", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 425, + "text": " // Ensure data folder exists before creating/opening SQLite files.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 571, + "text": " // Historical Phase 4/5 migrations were scaffolded against SQLite, so on MariaDB", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 659, + "text": " // FollowUpAt is `text` on MariaDB (the migration was scaffolded against SQLite, which", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 697, + "text": " if (useSqliteBootstrap)", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 709, + "text": " // not need SQLite's per-migration reconciliation. Reconciling between its", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 844, + "text": " cmd.CommandText = \"SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name IN ('JobApplications', 'RuleSettings');\";", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/StartupInitializationExtensions.cs", + "line": 851, + "text": " var runtimeProvider = (app.Configuration[\"Database:Provider\"] ?? \"sqlite\").Trim().ToLowerInvariant();", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/SubmittedApplicationPackageService.cs", + "line": 69, + "text": " var variant = _db.Database.IsSqlite()", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/Services/TrustedDeviceService.cs", + "line": 29, + "text": " // SQLite/Pomelo cannot translate DateTimeOffset relational comparisons (>) to SQL, so the", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 64, + "text": " \"Microsoft.EntityFrameworkCore.Sqlite\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 70, + "text": " \"Microsoft.EntityFrameworkCore.Sqlite.Core\": \"9.0.14\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 75, + "text": " \"SQLitePCLRaw.bundle_e_sqlite3\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 76, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 115, + "text": " \"SQLitePCLRaw.lib.e_sqlite3\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 238, + "text": " \"Microsoft.Data.Sqlite.Core\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 243, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\"", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 278, + "text": " \"Microsoft.EntityFrameworkCore.Sqlite.Core\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 283, + "text": " \"Microsoft.Data.Sqlite.Core\": \"9.0.14\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 289, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 470, + "text": " \"SQLitePCLRaw.bundle_e_sqlite3\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 475, + "text": " \"SQLitePCLRaw.lib.e_sqlite3\": \"2.1.10\",", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 476, + "text": " \"SQLitePCLRaw.provider.e_sqlite3\": \"2.1.10\"", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 479, + "text": " \"SQLitePCLRaw.core\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 487, + "text": " \"SQLitePCLRaw.provider.e_sqlite3\": {", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "JobTrackerApi/packages.lock.json", + "line": 492, + "text": " \"SQLitePCLRaw.core\": \"2.1.10\"", + "classification": "temporary_transition", + "reason": "provider_dependencies" + }, + { + "file": "README.md", + "line": 9, + "text": "- SQLite by default; MariaDB/MySQL for server deployments", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "deploy/MARIADB.md", + "line": 4, + "text": "- SQLite for local/dev fallback", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "deploy/MARIADB.md", + "line": 39, + "text": "## 4. SQLite to MariaDB migration notes", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/MARIADB.md", + "line": 41, + "text": "- `deploy/sqlite_export.py` exports the important SQLite tables into JSON", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/MARIADB.md", + "line": 42, + "text": "- `deploy/sqlite_preview.py` lets you inspect the exported payload quickly", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/MARIADB.md", + "line": 47, + "text": "2. Back up SQLite DB file", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/MARIADB.md", + "line": 48, + "text": "3. Export SQLite data:", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/MARIADB.md", + "line": 49, + "text": " - `python deploy/sqlite_export.py /path/to/jobtracker.db sqlite-export.json`", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/MARIADB.md", + "line": 51, + "text": " - `python deploy/sqlite_preview.py sqlite-export.json`", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 28, + "text": "# sqlite and a MariaDB host silently got a volume tar instead of a dump, with a", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 185, + "text": " echo \" Set to 'mariadb' (or 'mysql') for a MariaDB deployment, or 'sqlite'.\"", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 195, + "text": " sqlite)", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 198, + "text": " echo \"DATABASE_PROVIDER is not a recognised value. Use mariadb, mysql or sqlite.\"", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 291, + "text": " if [ \"$provider\" = \"sqlite\" ]; then", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 292, + "text": " # SQLite lives in the jobtracker_data volume. Tar it from a throwaway container", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 293, + "text": " # so the host needs no sqlite tooling and no knowledge of the volume layout.", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 300, + "text": " echo \"SQLite data volume '${volume}' does not exist. Aborting deploy.\"", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 306, + "text": " local target=\"$BACKUP_DIR/jobtracker-sqlite-${BACKUP_STAMP}.tar.gz\"", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 307, + "text": " echo \"Backing up SQLite data volume '${volume}' to ${target}\"", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 315, + "text": " echo \"SQLite volume backup FAILED. Aborting deploy.\"", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 466, + "text": " echo \"Archive ${target} contains no jobtracker.db — it is not a SQLite data backup. Aborting deploy.\"", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 506, + "text": " # exports or Data Protection keys stored in /data. SQLite already archives this", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/deploy.sh", + "line": 508, + "text": " if [ \"$provider\" != \"sqlite\" ]; then", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/first-production-deployment.md", + "line": 22, + "text": " The provider chooses the backup: `mariadb`/`mysql` gives a `.sql.gz` dump, `sqlite` gives a", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/first-production-deployment.md", + "line": 47, + "text": " mean \"sqlite\", which silently produced the wrong backup; it now stops the deploy", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/first-production-deployment.md", + "line": 90, + "text": "**Check the filename, not just that a file appeared.** A `jobtracker-sqlite-.tar.gz` on a", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/first-production-deployment.md", + "line": 270, + "text": "| SQLite volume backup, and its failure paths | ✅ valid archive verified; a volume with no `jobtracker.db`, and a volume name that does not exist, both abort |", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/sqlite_export.py", + "line": 3, + "text": "import sqlite3", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/sqlite_export.py", + "line": 21, + "text": "def export_db(sqlite_path: str, output_path: str) -> None:", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/sqlite_export.py", + "line": 22, + "text": " conn = sqlite3.connect(sqlite_path)", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/sqlite_export.py", + "line": 23, + "text": " conn.row_factory = sqlite3.Row", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/sqlite_export.py", + "line": 29, + "text": " except sqlite3.Error:", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/sqlite_export.py", + "line": 37, + "text": " print('Usage: sqlite_export.py ')", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "deploy/sqlite_preview.py", + "line": 17, + "text": " print('Usage: sqlite_preview.py ')", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "docker-compose.yml", + "line": 20, + "text": " - Database__Provider=${DATABASE_PROVIDER:-sqlite}", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "docs/README.md", + "line": 8, + "text": "- `JobTrackerApi/` is an ASP.NET Core 9 API using EF Core 9, ASP.NET Identity, JWT/cookie authentication, SQLite by default, and MariaDB/MySQL as the server option.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/_archive/ARCHITECTURE_EVOLUTION.md", + "line": 45, + "text": "4. Use PostgreSQL for hosted multi-tenant deployment; retain SQLite for self-hosted/single-user deployments.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/MERGE_REQUEST.md", + "line": 27, + "text": "- `feat:` automated daily SQLite backups (`VACUUM INTO`, retention, startup catch-up) — prod previously", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/ROADMAP.md", + "line": 15, + "text": "| Q2 | **Automated production DB backup** (scheduled SQLite `VACUUM INTO`/copy to `exports/` with retention; document restore) | eng | ▲ | S–M | ▽ | Prod currently has *no working automated backup* (backup endpoint is Windows-DPAPI-only, prod is Linux) |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/SECURITY_REPORT.md", + "line": 69, + "text": "`SqliteDatabaseBackupRunner` runs `VACUUM INTO ''`. The target is", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/SYSTEM_OVERVIEW.md", + "line": 39, + "text": " DB[(SQLite default
or MariaDB/MySQL)]", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/SYSTEM_OVERVIEW.md", + "line": 82, + "text": "**Backend**: ASP.NET Core net9.0, EF Core 9 (SQLite default; Pomelo MySQL/MariaDB switchable via `Database:Provider`), ASP.NET Identity Core (users/roles), JWT bearer auth (local + Google policy scheme), built-in RateLimiter, DataProtection (file-system keys), Playwright (CV PDF export).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/SYSTEM_OVERVIEW.md", + "line": 131, + "text": "- SQLite file lives at `DataRoot/jobtracker.db` (WAL mode); migrations applied automatically at startup (`StartupInitializationExtensions`, 62 KB — also seeds admin, creates Identity tables where `dotnet ef` unavailable, ignores `PendingModelChangesWarning`).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/SYSTEM_OVERVIEW.md", + "line": 211, + "text": "- **Backend**: xUnit integration-style tests via `TestHostFactory`; notable coverage: authorization (`JobApplicationsAuthorizationTests`, `OwnershipGuardTests`, hostile fixture DB project), auth/system, Gmail, CV corpus harness, summarizer, SQLite migration helper, production config.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/SYSTEM_OVERVIEW.md", + "line": 265, + "text": "- **Single point of data**: SQLite in a Docker volume; backups are manual/Windows-only; no automated off-host backup.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 72, + "text": "- `sqlite` — local development and small single-instance deployments; persist and back up the data volume.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 142, + "text": "fell back to `sqlite` on a MariaDB host, so the deploy tarred the data volume, printed", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 199, + "text": "`DATABASE_PROVIDER` deliberately has **no default**. An unset value used to mean \"sqlite\"; it now", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 213, + "text": " - `sqlite` → data volume archive, `jobtracker-sqlite-.tar.gz`", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 218, + "text": " `jobtracker-sqlite-*.tar.gz`, the environment is wrong — that is the exact failure this check exists", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 224, + "text": "- **SQLite volume resolution:** compose prefixes volume names with the project name, so the script", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 236, + "text": "| SQLite | non-empty; valid gzip; the archive actually contains `jobtracker.db` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 283, + "text": "Restoring a **SQLite** deployment instead:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/deploy/README.md", + "line": 288, + "text": " -e ARCHIVE_NAME=jobtracker-sqlite-20260719T153941Z.tar.gz \\", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/application-discovery-report.md", + "line": 180, + "text": "- **Database:** SQLite default; MariaDB/MySQL switchable via `Database:Provider`. 10 migrations.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/application-workspace.md", + "line": 97, + "text": "never duplicates. Custom items have a `NULL` `SystemKey`; both SQLite and MariaDB treat NULLs as", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/application-workspace.md", + "line": 132, + "text": "SQLite-scaffolded migration would emit `TEXT` datetimes and a PK without `AUTO_INCREMENT` on MariaDB —", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/current.md", + "line": 46, + "text": " DB[(SQLite default
or MariaDB/MySQL)]", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/current.md", + "line": 91, + "text": "**Backend:** ASP.NET Core net9.0, EF Core 9 (SQLite default; Pomelo MySQL/MariaDB via `Database:Provider`), ASP.NET Identity Core, JWT bearer (smart policy scheme: local + Google), built-in RateLimiter, DataProtection (file-system keys), Playwright (PDF export).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/current.md", + "line": 249, + "text": "- SQLite lives at `DataRoot/jobtracker.db` (WAL); migrations and legacy-schema reconciliation run at startup through `StartupInitializationExtensions`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/current.md", + "line": 358, + "text": "- **Backend:** xUnit integration-style via `TestHostFactory`. 36 test files. Notable: `JobApplicationsAuthorizationTests`, `OwnershipGuardTests`, `ImapServiceSsrfGuardTests`, `ProductionConfigTests`, `AttachmentFlagsRecomputeTests`, `CvCorpusHarnessTests`, `SqliteMigrationHelperTests`, `JobPipelineTests`, plus a `tools/hostile-fixture-db` project.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/current.md", + "line": 361, + "text": "- **Browser smoke:** Playwright drives login/session cookies, saved-job creation, Career Workspace routing, and anonymous public-CV rendering/PDF download against isolated API/SQLite and Next.js processes. CI installs Chromium and runs all four flows.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/durable-operations.md", + "line": 17, + "text": "`20260802224646_AddUserOperations` is EF-owned and intentionally absent from `StartupInitializationExtensions`. Its `Up` branches by provider: native SQLite DDL from the model and explicit bounded MariaDB `varchar`/`char`, `datetime(6)` and `int` DDL. Common indexes are generated by the active provider. This incrementally reduces the dual-ownership risk from JT-019 while preserving clean MariaDB types.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/notifications.md", + "line": 13, + "text": "Migration `20260802225941_AddUserNotifications` is EF-owned and absent from startup reconciliation. SQLite uses native scaffolded types; MariaDB uses bounded `char`/`varchar` and `datetime(6)` columns with a foreign key that sets `OperationId` null if operation history is deleted.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/technical-debt.md", + "line": 28, + "text": "- Pinned SQLitePCLRaw 2.1.12 so the native SQLite runtime is no longer in the high-severity", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/technical-debt.md", + "line": 30, + "text": "- Made fresh SQLite startup reconcile schema-owned columns between historical EF migrations, so", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/technical-debt.md", + "line": 31, + "text": " strict SQLite identifier handling no longer breaks the later table rebuild.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/architecture/technical-debt.md", + "line": 47, + "text": "| P1 | EF migrations and startup reconciliation still share historical schema ownership. Blank SQLite EF migration, populated upgrade, and fresh/restarted MariaDB now pass, but the two mechanisms remain tightly coupled. | Keep the compatibility bootstraps and provider-specific ordering covered by `MigrationChainTests`. Consolidate ownership only through an expand/verify/contract migration after a production restore rehearsal; do not rewrite applied migration history. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/README.md", + "line": 8, + "text": "This is a dated assessment and executable overhaul plan. Application code, production configuration and existing databases were not changed. Tests used new synthetic local accounts and temporary SQLite databases. No production deployment, external provider integration test, email delivery, payment, dependency download, or live host inspection was performed. The adversarial harness blocks remote browser requests; the existing browser suite was run as written and is not an all-process network-isolation guarantee. The original August audit remains a historical record; its closed findings are not automatically reopened here.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/README.md", + "line": 39, + "text": "The frontend is React 19/MUI 7/React Router 7 in a Next.js 16 static-export shell. ASP.NET Core targets .NET 9 with EF Core 9. **SQLite and MariaDB/MySQL are supported; PostgreSQL is not configured.** PostgreSQL pool/index/search requests therefore translate into equivalent provider-specific reviews, not a recommendation to migrate databases. Redis and a general message broker are absent.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 12, + "text": "- **N — Not currently evidenced/deployed:** an optional technology should not be added solely to satisfy a heading. SQLite/MariaDB replace PostgreSQL-specific assumptions; Redis and a general broker are absent.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 50, + "text": "| 33 | Database evolution strategy | S/R | [Assessment](resilience.md#time-and-compatibility-policy) — Additive/backfill/contract stages proposed; current nontransactional SQLite migration warning observed separately. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 122, + "text": "| 105 | Migration rehearsal | S/R | [Assessment](product-operations.md#operational-ownership-and-alerts) — Fresh local SQLite startup migrates with warnings; interrupted/large/MariaDB migration rehearsal remains. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 209, + "text": "| 192 | Test isolation | O/R | [Assessment](verification.md#normal-verification) — Fresh synthetic SQLite and serial backend settings used; CI parallel/shared-resource isolation remains. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 227, + "text": "| 210 | Fail-fast configuration | S | [Assessment](threat-data.md#data-classification) — Empty/unknown provider can silently select SQLite in app startup, F19. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 280, + "text": "| 263 | Connection-pool behaviour | R | [Assessment](resilience.md#transaction-and-background-work-review) — Needs runtime verification: MariaDB pool exhaustion/waits/timeouts; SQLite differs; PostgreSQL absent. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 283, + "text": "| 266 | Index migration safety | R | [Assessment](resilience.md#transaction-and-background-work-review) — Needs runtime verification: index build lock/disk/time on realistic MariaDB and SQLite shape. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/coverage.md", + "line": 400, + "text": "| 383 | Query-plan testing | R | [Assessment](product-operations.md#performance-capacity-and-cost-model) — Needs runtime verification: realistic SQLite/MariaDB EXPLAIN plans and worst-owner data. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/findings.md", + "line": 15, + "text": "**Passing/staging/detection:** replay five tabs against SQLite and MariaDB, including delayed responses and restore. One writer wins; others retain their drafts. Count conflicts and version-integrity failures without logging CV text. Expand schema first, ship compatible readers/writers, then require preconditions; test an older open frontend. Medium scope; do not refactor all controllers at once.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/findings.md", + "line": 105, + "text": "**Source:** daily SQLite backup uses `VACUUM INTO` (`DatabaseBackupRunner.cs:68`), a useful consistent DB snapshot. In contrast, SQLite pre-deploy backup tars the live data volume (`deploy.sh:314`) and validation checks archive shape/DB presence, not a restored database. DB/WAL/files may change during tar. MariaDB SQL backup and file-volume archives also need a coordinated recovery point. Automatic previous-image restoration at `deploy.sh:638` does not reverse migrations. No actual corrupt backup is claimed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/findings.md", + "line": 153, + "text": "## F19 — P2: application startup silently falls back to SQLite", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/findings.md", + "line": 155, + "text": "**Source:** `Program.cs:95–115` replaces a configured provider with SQLite when the connection string is missing and treats unknown providers as SQLite. Deployment validation is stronger, but starting the production API by another path can create an apparently empty database. Fix provider/connection validation in application startup, preserving deliberate development SQLite defaults. Test production missing/invalid provider/connection plus explicit SQLite and MariaDB choices. Small scope; no migration required.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/findings.md", + "line": 171, + "text": "**Root cause/scope:** job fields use DateTime without a durable timezone/offset contract; SQLite materialization loses Kind, and `ApplicationCalendarController.cs:129` treats unspecified values as UTC. The application also uses server-local time for reminder scheduling. This affects externally scheduled follow-ups and needs a date/time boundary fix, not a display-format patch.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/findings.md", + "line": 173, + "text": "**Failing tests:** replay the four `DST calendar instant` cases in the harness on SQLite and MariaDB with server timezone UTC and Europe/Oslo. Preserve the same instant through POST, DB round-trip, JSON and ICS. Test date-only deadlines separately and reject or explicitly resolve nonexistent/ambiguous local times.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/product-operations.md", + "line": 109, + "text": "Suggested scaling triggers: sustained DB CPU >70% plus missed latency targets; pool utilization >80% with connection waits; queue wait exceeds user-facing SLO for 15 minutes; disk forecast under 30 days; backup/restore exceeds target; repeated PDF admission saturation. Tune alert thresholds against baseline and avoid paging for every transient failure. First inspect query plans on the actual SQLite/MariaDB provider; SQL text or InMemory tests do not establish production query cost.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/resilience.md", + "line": 11, + "text": "| SQLite / MariaDB | Writes, auth/session checks and reads fail; active AI worker can stop host F20 | Provider defaults; observed SQLite command timeout 30s; no central transient-DB policy | Preserve forms, show service unavailable/reference; bounded worker recovery; never retry ambiguous writes without key | Readiness failures + sustained DB errors; real outage needs runtime verification |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/resilience.md", + "line": 130, + "text": "F21's four live HTTP/SQLite/ICS failures are concrete; the fix must distinguish **calendar date**, **absolute instant**, and **local recurring time with timezone**. Current use of DateTime, UTC timestamps and server-local reminders mixes those meanings. UTC is suitable for security events and leases. Date-only job deadlines must not shift with timezone. Recurring wall-clock behavior, if offered, needs an explicit zone and gap/fold policy. Do not add recurring reminders merely to justify a scheduling platform.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/source-index.md", + "line": 21, + "text": "| [JobTrackerApi/Services/DatabaseBackupRunner.cs](../../../JobTrackerApi/Services/DatabaseBackupRunner.cs) | F12 — SQLite snapshot primitive |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/threat-data.md", + "line": 13, + "text": " A --> D[(SQLite or external MariaDB)]", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/threat-data.md", + "line": 155, + "text": "| Local SQLite scheduled backups | Data-root backups | Default 14 retained snapshots | Old snapshots pruned | Local host loss still loses these; off-host complete sets needed |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/README.md", + "line": 22, + "text": "Fresh verification: **149 backend tests passed** in two disjoint targeted runs (70 + 79); **13 interview frontend tests passed**; standalone TypeScript failed with the exact original error. Independent probes used synthetic SQLite databases, real local HTTP endpoints, two browser tabs, the real PDF exporter with three inert child executables, and a real .NET host with a one-shot database fault. Existing original full-suite/build results are historical evidence, not new executions. No live Stripe, SMTP, DNS rebinding, production host, production database, external website or cloud metadata endpoint was contacted.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/README.md", + "line": 32, + "text": "**Confirmed. Retain P1.** The HTTP stale save returned 200 and replaced the newer state. Two independently preloaded real SQLite contexts both saved revision 1; the final row was Writer B/revision 2 and history was **[1, 2, 2]**. This is recoverable only in part: settings snapshots exist, but variant names are not included in those snapshots, and duplicate revision numbers make restore identification ambiguous.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/README.md", + "line": 98, + "text": "**Mostly confirmed. Retain P1 as a release/recovery gate.** The [daily runner](../../../../JobTrackerApi/Services/DatabaseBackupRunner.cs#L68) uses SQLite `VACUUM INTO`, a consistent database snapshot. The pre-deploy [live-volume tar](../../../../deploy/deploy.sh#L314) is not equivalent; concurrently changing DB/WAL/files have no demonstrated common recovery point. MariaDB's transactional SQL dump does not make separate file archives transactionally consistent. No corrupt backup was reproduced or alleged.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/README.md", + "line": 122, + "text": "**Mostly confirmed. Downgrade P1 → P2 for the currently implemented workflow.** Offset-bearing input lost offset information after SQLite reload; the reproduced spring value exported 09:00Z instead of 07:00Z, and the two autumn offsets collapsed. However, the **UTC input control preserved 07:00Z**. This is not evidence that every production UTC event shifts. Server timezone affects DateTime parsing; production timezone/provider behavior was not exercised.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/README.md", + "line": 155, + "text": "| F19 provider fallback | Source confirms silent SQLite fallback for a missing connection or unknown provider. Keep P2 with a release-startup gate: production misconfiguration should fail closed. No proof the deployed instance points at the wrong database. R01. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b02-completion.md", + "line": 9, + "text": "Observed before the fix: **HTTP 200**, A remained `Private A`, and B became `A draft must never enter B`. The expected safe assertion failed. This confirms the original browser result independently through the real API, authentication/session middleware, controller, Identity and isolated SQLite database. [Retained before/after facts](evidence/b02-observations.json).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b03-completion.md", + "line": 70, + "text": "Final browser verification passed **all 17 tests**, with real public/Code PDFs taking approximately **1.3/1.4 seconds** in the exporter. Earlier development-server runs also encountered navigation timeouts and axe contrast failures on transient API-status chips; final production-static browser coverage passed without accessibility changes. The first static run passed 15/17: an account-switch test raced B02's intermediate `/login` navigation against its final `/login?sessionChanged=1` redirect, and a separate Code-PDF setup failed before rendering with SQLite Error 5 (`database is locked`) in `CareerProfileController.Put`'s existing profile/Identity projection. The account-switch test now waits for the final URL and visible login input before starting a new navigation; B02 application behavior is unchanged. The SQLite failure did not repeat and was not altered under B03; its projection/concurrency contract remains D02. The subsequent full run passed 17/17 with zero retries/flaky outcomes. This rerun does not prove the existing SQLite race is resolved.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b03-completion.md", + "line": 123, + "text": "**Acceptance: all ten B03 criteria pass locally.** All four real generation paths enter one singleton pool before expensive work; configured process/owner bounds hold across endpoints, sessions and accounts. Immediate refusal eliminates waiting/backlog cancellation problems. Permanent process tests prove ordinary exceptions, cancellation and timeout release after exit, with repeated recovery; unconfirmed termination disables replacement work. Invalid configuration fails host startup. Final broader regression/build results are healthy subject to the explicitly pre-existing TypeScript gate and observed SQLite fixture race. Process-local scaling and deployment containment limits are documented above. No schema or architectural stop condition was encountered, and no later ticket was implemented.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b04-completion.md", + "line": 52, + "text": "[HTTP tests](../../../../job-tracker-ui/rate-limit-tests/isolation.spec.ts) use real local API middleware, authentication/session cookies, bearer tokens, owner checks and synthetic SQLite data, with [test-only configuration](../../../../job-tracker-ui/playwright.rate-limits.config.ts). They add nine scenarios:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/b06-completion.md", + "line": 38, + "text": "| Database | External MariaDB/MySQL or volume-backed SQLite; no DB service/port in this Compose | Unchanged | External DB listener/network requires operator verification |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/evidence.md", + "line": 30, + "text": "| Independent .NET boundary harness | Completed with observations | [boundary-results.json](evidence/boundary-results.json). Fake HTTP transport, real EF SQLite contexts, actual exporter with inert child processes, real hosted worker with a synthetic one-shot command fault. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/evidence.md", + "line": 41, + "text": "| Two preloaded SQLite contexts | Writer B wins, current revision 2, history `[1,2,2]`. | MariaDB concurrency behavior or a safe duplicate-history migration. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/evidence.md", + "line": 47, + "text": "| Calendar controls | Non-UTC offsets lost after SQLite reload; UTC 07:00Z preserved; date-only becomes timed midnightZ. | Production timezone/provider configuration or a promised timed scheduling product. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/evidence.md", + "line": 98, + "text": "- MariaDB reproductions of the new revision/timezone probes; existing SQLite/test coverage cannot certify provider equivalence.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/implementation-queue.md", + "line": 36, + "text": "| **R01b Production DB configuration validation** | S. Provider-selection code in `Program.cs` and startup tests. | Fail startup for an unknown production provider or missing required configured connection. Preserve deliberate dev SQLite defaults and valid explicit SQLite/MariaDB. Assert no fallback database is created on rejected startup. | Integrate after Batch 0 `Program.cs` mutations. No schema; rejecting an existing invalid environment can prevent boot, so validate deployed inputs first. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/implementation-queue.md", + "line": 37, + "text": "| **R02 Consistent recovery-set creation** | M. `deploy.sh`, existing backup runner/scripts, isolated fixture and operator documentation. | Replace live SQLite tar as the DB consistency mechanism; coordinate file inventory/checkpoint or a short write pause, manifest/checksums and incomplete-set marking. Preserve keys/tombstone recovery. For MariaDB, coordinate the file set with the consistent SQL dump. | No new app schema. Can develop synthetic fixture in parallel with Batch 0. A backup that is only present is not yet verified. Keep previous verified sets. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/validation/implementation-queue.md", + "line": 50, + "text": "| **D01 CV variant revision protocol** | M. CV variant model/service/controller/editor, context migration and CV tests. | Expected revision/conditional update, transactional history, distinct conflict response and retained draft. Reconcile duplicate revision labels preserving every snapshot, then enforce uniqueness. Include restore-versus-save, stale name/settings and old-client handling. Prove with two contexts and SQLite/MariaDB. | B02 + R03. Establish request/response convention before D02/D03. One cohesive vertical change; keep templates/layout/AI tooling outside the diff. Additive rollout first; old unconditional writers must be rejected or refreshed when enforcement starts. Do not revert to an old writer without a compatibility plan. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/verification.md", + "line": 9, + "text": "Backend checks used test fixtures and synthetic local data. The normal browser suite starts its own temporary SQLite API on port 5302 and UI on 3300. The additional harness starts an independent temporary SQLite API on 5402 and a production static export on 3400. Fixtures use reserved `example.test` addresses, a clearly synthetic password, a short fictional profile and harmless formula text. Existing development/production databases were not migrated or reset. Fresh temporary test databases do run application migrations.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/verification.md", + "line": 126, + "text": "The additional API log was inspected for warning/error categories. Fresh SQLite migration produced EF warnings 30200 and 20410 for `AddJobEntityAndProspectStages`: a table rebuild/SQL ordering warning and nontransactional `PRAGMA foreign_keys = 0`, with partial-migration recovery implications. Fresh startup completed; interruption/replay was not tested. Data Protection warning 35 said no XML encryptor was configured for the synthetic local key. These are actionable migration/key-custody evidence, not proof that production has identical conditions. No recurring normal-request `fail:`/exception category was observed in that log. Verbose development SQL includes schema/content field names; it is not shipped as a public diagnostic artifact.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/2026-09-07/verification.md", + "line": 134, + "text": "1. After fixes, real SQLite and MariaDB revision/idempotency/quota/date tests; concurrent authorization/deletion and shared-account operations.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-progress.md", + "line": 106, + "text": "- Executed default-SQLite paths identified as risky by source inspection.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-progress.md", + "line": 118, + "text": "- Confirmed default-SQLite API failures, ambiguous routes, inert tenant-scoped workers, non-atomic attachment/file operations, and client-only notification preferences.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-progress.md", + "line": 274, + "text": "- Rehearsed SQLite database and full-data-root restoration with disposable data.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-progress.md", + "line": 286, + "text": "- SQLite restore passes; files/keys/config are separate; MariaDB needs external backup; no RPO/RTO or routine restore proof; workers fail silently; startup reconciler is risky complexity.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-progress.md", + "line": 319, + "text": "- Missing route-table, default-SQLite HTTP, worker-context, account-lifecycle, accessibility, and Python CI gates.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-progress.md", + "line": 450, + "text": "- Historical EF-only clean SQLite migration remains blocked before the new migration; the new SQL/defaults and model snapshot pass inspection.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 91, + "text": "- Migration-test fresh SQLite/MariaDB and representative legacy rows with null/duplicate/ambiguous legacy values. Assert no legacy row is silently assigned or merged.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 456, + "text": "### P1-1 — Restore SQLite/MariaDB parity for Career and Application Workspace", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 460, + "text": "- **Acceptance criteria:** CV variants/runs, AI history/usage and workspace return correct owner/empty/non-owner results on SQLite and MariaDB.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 515, + "text": "- **Findings/scope:** JT-014/JT-016; route uniqueness, SQLite HTTP journeys, worker context, two-user auth, Python tests/audit, `tsc --noEmit`, minimum accessibility checks.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 526, + "text": "- **Findings/scope:** JT-013; SQLite/MariaDB DB, attachments/CV artifacts/exports, key ring, secrets/config, RPO/RTO, off-host retention.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 563, + "text": "**Status (2026-08-30): complete.** All 49 model tables have an executable, disjoint creation-owner classification and are migration-owned. All 35 formerly startup-created tables—including authentication/Identity, email-provider connections, CV persistence/history, job-workspace AI notes, workflow documents, durable interview preparation, and the complete Career Profile aggregate—moved through additive provider-aware migrations with legacy-row preservation, downgrade/retry safety, startup-DDL removal, fresh SQLite chain proof, and generated MariaDB SQL. The reconciler now performs guarded compatibility repair only. See `docs/verification/jt-019-schema-ownership.md` and V-194–V-208.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 567, + "text": "- **Acceptance criteria:** every schema mutation has one owner; fresh/upgrade/repair matrices pass on SQLite/MariaDB; startup does no undocumented DDL.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/audit-remediation-backlog.md", + "line": 576, + "text": "**Status (2026-08-30): repository scope complete.** The frontend/root/deployment/architecture sources now match Next.js 16, React Router 7, .NET 9, locked installs, current ports, and the implemented SQLite/MariaDB provider matrix. Clean install, lint, full frontend/backend tests, production build/TypeScript and locked NuGet restores pass; see `docs/verification/jt-018-developer-documentation.md` and V-193. A separate clean-machine/production operator rehearsal remains deployment evidence, not an undocumented implementation gap.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/ai-001/README.md", + "line": 9, + "text": "All execution used synthetic local SQLite data and fake handlers. No model, provider, browser or production service was invoked.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/browser-evidence.md", + "line": 14, + "text": "The Career Workspace assertion proves only the shell rendered; it does not prove every downstream panel loaded. Later direct API checks confirmed that CV-list and application-workspace endpoints fail under default SQLite.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/repository-inventory.md", + "line": 18, + "text": "| Data layer | EF Core 9; SQLite default or Pomelo MariaDB/MySQL | Identity and tenant-owned job, profile, CV, correspondence, attachment, AI, and workflow state |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/repository-inventory.md", + "line": 47, + "text": "- `deploy/README.md` recommends PostgreSQL, but the application implements SQLite and MariaDB/MySQL providers only.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/runtime-evidence.md", + "line": 5, + "text": "Environment: local Development configuration, compiled Release API, Next development server, disposable SQLite data root under the current user's temporary directory. No production service, real mailbox, paid AI provider, or personal data was used.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/runtime-evidence.md", + "line": 19, + "text": "| `GET /api/cv/variants` | A and empty B | 500 | EF SQLite cannot translate the `DateTimeOffset` ordering. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/runtime-evidence.md", + "line": 66, + "text": "The built-in SQLite backup runner created `jobtracker_backup_20260802_184234.db` from the disposable database. A read-only copied snapshot passed `PRAGMA integrity_check` and matched the current database:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/runtime-evidence.md", + "line": 78, + "text": "Conclusion: SQLite database snapshotting works. Complete recovery additionally requires file storage, the Data Protection key ring, deployment secrets/configuration, and a documented restore procedure. MariaDB/MySQL backup is intentionally unsupported by the in-process runner and was not available for rehearsal.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/runtime-evidence.md", + "line": 82, + "text": "Release API, disposable SQLite database with one job, ten requests after warm-up:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/two-user-isolation.md", + "line": 5, + "text": "Scope: disposable local SQLite environment only. User A and User B used synthetic `@audit.invalid` identities. No production data or credentials were used.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/two-user-isolation.md", + "line": 16, + "text": "| CV variants | Browser blocked | Copied A variant ID returned 404, but B's own list returned 500 | Owner predicate/filter exists; list blocked by SQLite translation | Partial: protection inspected and direct ID passed; list broken |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/two-user-isolation.md", + "line": 17, + "text": "| Application workspace | Browser blocked | B copied A ID returned 404; A request returned 500 | Owner predicate exists; owner path blocked by SQLite translation | Partial |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/evidence/two-user-isolation.md", + "line": 21, + "text": "| AI results | Browser blocked | History endpoint returned 500 | Owner predicates and query filter exist | Blocked by SQLite translation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 16, + "text": "4. Default documented SQLite fails important Career/Application Workspace endpoints.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 34, + "text": "| Database | EF Core 9; SQLite default, Pomelo MariaDB/MySQL optional | Identity and tenant-owned application data |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 36, + "text": "| Background work | Seven API hosted services | SQLite backup, rules, reminders, daily export, enrichment, AI probe, CV queue |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 44, + "text": "The browser talks through nginx to one ASP.NET API. The API owns authentication, EF, file storage, external providers, all hosted work, and startup migrations/reconciliation. Tenant roots carry `OwnerUserId`; request-time EF filters deny on null and match the authenticated user. The AI sidecar is private to the backend in Compose and can route to local or cloud models. SQLite stores metadata while attachments, CV artifacts/exports, backups, avatars and Data Protection keys live in a shared data root.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 59, + "text": "- SQLite uses `VACUUM INTO`; the disposable database and full-data-root restore rehearsal passed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 80, + "text": "| SQLite restore | Database and full-data-root rehearsal pass |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 92, + "text": "| 4 | JT-003 | High | Default SQLite breaks Career/Application Workspace APIs |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 145, + "text": "### JT-003 — Default SQLite breaks Career/Application Workspace APIs", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 150, + "text": "- **Reproduction:** run documented/default SQLite API; authenticate; request CV variants, extraction runs, AI history/usage, or workspace. Owner and empty B both reproduced 500s.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 151, + "text": "- **Evidence:** EF SQLite cannot translate relational ordering/comparison over `DateTimeOffset`; sibling services already document/materialise around this limitation, but these paths do not.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 154, + "text": "- **Recommended remediation:** apply the existing repository pattern: constrain/shape in SQL where supported, materialise bounded owner-scoped sets, then order/compare locally for SQLite; or map compatible UTC storage consistently. Fix shared query roots, not individual responses.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 156, + "text": "- **Acceptance criteria:** all reproduced endpoints return correct 200/404 for owner/empty/non-owner on SQLite and MariaDB.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 157, + "text": "- **Regression tests:** HTTP integration tests against fresh SQLite with zero/one/many rows; provider-parity suite for affected queries.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 290, + "text": "- **Reproduction:** disposable SQLite DB snapshot and full-data-root restore rehearsal.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 292, + "text": "- **Existing mitigations:** daily catch-up SQLite snapshots/retention; deploy scripts take provider-aware backups and gate deployment; deployment docs warn to verify restore.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 305, + "text": "- **Evidence:** no route-table ambiguity gate, no affected SQLite HTTP journey, no hosted-service/no-HttpContext integration, no Python tests/audit in CI, no typecheck/accessibility gate.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 306, + "text": "- **Existing mitigations:** broad deterministic suites, four isolated browser smokes, dependency audits for NuGet/npm, fresh SQLite in several tests.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 308, + "text": "- **Recommended remediation:** add minimum HTTP integration tests for core routes on fresh SQLite, route ambiguity startup test, two-owner worker tests, browser assertions for downstream data/error absence, Python test/audit, and standalone typecheck.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 373, + "text": "- **Reproduction:** source/migration inspection; fresh SQLite startup passed; MariaDB not available.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 379, + "text": "- **Acceptance criteria:** fresh/upgrade/partially repaired SQLite and MariaDB matrices pass; startup performs no undocumented schema mutation.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 480, + "text": "Genuinely browser-tested: login, saved-job manual creation, Career Workspace shell rendering, and anonymous public CV/PDF. The wider manual journey was blocked by the missing browser client. Serious failures are default-SQLite Career/Application APIs, duplicate timeline/interview routes, verification/session lifecycle, and inert workers. Complete classification and step/result records are in `user-journey-audit.md`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/full-application-audit.md", + "line": 496, + "text": "SQLite snapshot and restored API/file access passed when DB, attachments and keys were restored together. Database-only recovery is incomplete. MariaDB requires external backup; no safe instance existed for rehearsal. RPO/RTO, off-host encrypted retention, key/config recovery and recurring restore evidence are absent. See JT-013.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/security-threat-model.md", + "line": 14, + "text": " A --> D[(SQLite or MariaDB/MySQL)]", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/user-journey-audit.md", + "line": 31, + "text": "| UJ-11 | Job workspace, notes, deadlines, contacts and follow-ups | User A owns job 1 | Open workspace; expect overview/assets/activity/AI and linked subpanels | `/workspace` returned 500 under default SQLite. `/timeline` and `/interview-prep` returned 500 due duplicate routes; checklist/analysis/match returned 200. | Running API | Fail | Failed requests: workspace/timeline/interview-prep 500 | JT-003, JT-004 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/user-journey-audit.md", + "line": 34, + "text": "| UJ-14 | Career Profile and CV import review | User with synthetic CV/profile | Create/edit profile; import CV; review diffs; accept selected, reject others, edit before acceptance; preserve existing data | Profile/diff/pipeline backend and frontend tests are broad and approval is explicit. No manual browser run. CV run/list endpoints contain default-SQLite failures. | Mocked services / code-inspected; blocked browser | Partial/fail | `GET /api/profile-cv/runs` 500 in local runtime | JT-003, JT-014 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/user-journey-audit.md", + "line": 36, + "text": "| UJ-16 | Deterministic match and AI assistance | User A with job/profile; cloud/local AI not configured | View match; generate suggestion; accept/reject/edit; handle empty/malformed/delay/failure; never auto-apply | Deterministic match returned 200. Mocked tests show AI results are suggestions/history and user approval is required. Usage/history fail on SQLite; no paid provider invoked. | Running API for match / mocked AI / blocked provider | Partial | `/api/ai/usage` and AI history 500 | JT-003, JT-022 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/user-journey-audit.md", + "line": 41, + "text": "| UJ-21 | Settings/preferences/AI controls | Authenticated user | Persist real preferences; enable/disable AI; select/understand provider/privacy; show usage | Theme/language/table settings persist client-side. Notification checkboxes only update localStorage and do not govern server reminders. AI usage returns 500 on SQLite; no global per-user AI disable/provider choice. | Code-inspected / running API for usage | Fail/partial | AI usage 500 | JT-003, JT-012, JT-022 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/user-journey-audit.md", + "line": 65, + "text": "1. Default SQLite breaks CV lists/runs, AI history/usage, and the application workspace.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 40, + "text": "| V-032 | Authenticated `curl.exe` requests to `/api/cv/variants`, `/api/profile-cv/runs`, `/api/jobapplications/1/ai/history`, `/api/ai/usage`, `/api/jobapplications/1/workspace`, `/timeline`, and `/interview-prep` | Repository root | Exercise default SQLite career/application workspace APIs | FAIL — listed DateTimeOffset paths and the two ambiguous routes returned 500 | Sibling checklist/analysis/match paths returned 200 | Application-related |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 41, + "text": "| V-033 | Reset synthetic job fields in disposable SQLite; restart Release API; query row after hosted-service initial delays | Repository root / `JobTrackerApi` | Verify rules/enrichment workers see tenant data | FAIL — old Applied status and null tags/summary remained | Runtime agrees with deny-on-null query-filter execution path | Application-related |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 42, + "text": "| V-034 | Copy built-in SQLite backup to a new disposable restore path; `PRAGMA integrity_check`; start a second API with restored DB plus copied `Attachments/` and `keys/`; request `/health`, login, job, and attachment | Repository root / `JobTrackerApi` | Safe restoration rehearsal | PASS/PARTIAL — DB integrity/counts and restored application/file access passed | Complete recovery requires files/keys/config outside DB; MariaDB unavailable | Environmental/provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 46, + "text": "| V-038 | Ten warm `curl.exe` samples for `/health`, paged jobs, and companies; compute mean/p95 | Repository root | Safe local API timing baseline | PASS — 11.3/17.8/6.5 ms means respectively | One-row SQLite dataset; no capacity claim | N/A |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 55, + "text": "| V-047 | `dotnet ef migrations script 20260731115022_AddStripeBillingState 20260802205800_AddPendingEmailChange --project JobTrackerApi\\JobTrackerApi.csproj --startup-project JobTrackerApi\\JobTrackerApi.csproj --no-build` with SQLite and MariaDB design-time configuration; `dotnet ef database update ...` against disposable SQLite | Repository root | Validate SEC-005B migration SQL and safe upgrade | PASS/PARTIAL — provider SQL and upgrade pass; fresh empty migration chain fails before SEC-005B | Pre-existing `AddJobEntityAndProspectStages` expects missing `LastReminderEmailSentAt`; MariaDB execution unavailable | Application CORE-001 / provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 59, + "text": "| V-051 | SEC-004 focused/full backend/frontend tests and dual-provider migration scripts | Repository root | Canonical Microsoft identity regression and migration verification | PASS/PARTIAL — 34 focused, 507 backend, 152 frontend; SQLite upgrade/unique rehearsal and SQLite/MariaDB SQL pass | No real Microsoft token/account, MariaDB execution, browser or production inventory | Provider/environment limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 61, + "text": "| V-053 | `dotnet test ... --filter \"FullyQualifiedName~SqliteDateTimeOffsetCompatibilityTests\"` | Repository root | Execute CORE-001 against real SQLite and generate MariaDB/Pomelo ordering/range SQL | PASS — 3/3; owner-scoped ordering, range, usage, workspace, artifact and isolation paths pass | MariaDB SQL generation only; no server connection | Provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 63, + "text": "| V-055 | Isolated `dotnet run --no-launch-profile ... --environment=Development -- --urls=http://127.0.0.1:5303`; synthetic registration/login and HTTP matrix | Repository root | Fresh default-SQLite startup and affected API/runtime isolation | PASS — empty variants/runs/history/usage 200, missing workspace 404, owner workspace 200, User B workspace 404/variants empty | Browser and MariaDB unavailable; no external calls or real data | Environmental/provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 68, + "text": "| V-060 | Isolated SQLite API on 5304; synthetic owner/User B/anonymous GET matrix for timeline, interview board and brief; exact listener shutdown | Repository root | Prove ambiguity removal and authorization at runtime | PASS — each owner 200, other user 404, anonymous 401; exact PID 23904 stopped and port closed | No browser, MariaDB or production smoke | Environmental/provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 71, + "text": "| V-063 | Isolated SQLite API on 5305; synthetic User A upload/list/download/rename/delete and User B direct-ID denial; exact listener shutdown | Repository root | SEC-008 runtime and tenant isolation | PASS — owner operations 200/204, User B 404, final owner list empty; exact PID 4592 stopped and port closed | Browser, MariaDB and production inventory unavailable | Environmental/provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 76, + "text": "| V-068 | Isolated API on 5306 with disposable SQLite data and all four worker switches false; health/no-export check; exact PID shutdown | Repository root | BG-001 safe startup without worker side effects | PASS — health 200, no export directory, exact PID 44980 stopped, port closed | No browser, production canary, SMTP or AI provider | Environmental/provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 78, + "text": "| V-070 | `dotnet ef migrations has-pending-model-changes`; generated SQLite/MariaDB migration up/down scripts | Repository root | OPS-001A model/migration parity | PASS — snapshot current; both providers create/drop; MariaDB has bounded types/eight `datetime(6)` and no unbounded text | MariaDB generation only | Provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 79, + "text": "| V-071 | Disposable existing SQLite `database update`, downgrade and re-upgrade | Repository root | OPS-001A upgrade/rollback rehearsal | PASS | Synthetic local database only | N/A |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 81, + "text": "| V-073 | `dotnet test JobTrackerApi.Tests\\JobTrackerApi.Tests.csproj --no-restore --filter FullyQualifiedName~UserOperationStoreTests` | Repository root | OPS-001B terminal notification, owner-state and rollback checks | PASS — 9/9 | Real file-backed SQLite; no email/worker | N/A |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 82, + "text": "| V-074 | `dotnet ef migrations script 20260802224646_AddUserOperations 20260802225941_AddUserNotifications ...` and reverse for SQLite/MariaDB | Repository root | OPS-001B provider-safe up/down SQL | PASS after correction — bounded MariaDB/SQLite create/drop scripts retained | First MariaDB attempt used the wrong connection-string key and emitted SQLite SQL; invalid output was overwritten and not treated as evidence; MariaDB not executed | Verification setup corrected / provider limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 83, + "text": "| V-075 | Disposable SQLite notification upgrade, downgrade and re-upgrade; `dotnet ef migrations has-pending-model-changes ... --no-build` | Repository root | OPS-001B safe additive migration and model parity | PASS — all transitions succeeded; no pending model changes | Synthetic copy of OPS-001A evidence database only | N/A |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 85, + "text": "| V-077 | Focused operation controller/store tests; full backend suite | Repository root | OPS-001C owner APIs, safe DTOs, mutations and regressions | PASS — 12/12 focused; 544/544 full | Direct controller tests use real SQLite | N/A |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 87, + "text": "| V-079 | Isolated API on 5310; two disposable users; synthetic SQLite operation/notification rows; authenticated/anonymous direct HTTP matrix | Repository root | OPS-001C runtime authorization, CSRF and lifecycle | PASS — owner detail/cancel/read/dismiss/retry 200/204; four copied cross-owner paths 404; anonymous 401; listener stopped | Initial launch inherited local connection; exact synthetic users/sessions were removed with zero-count proof. Lowercase raw GUID seed was replaced before the passing matrix | Verification setup corrected |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 88, + "text": "| V-080 | Evidence tree/key inspection; exact generated Data Protection key deletion; listener and local synthetic-account count checks | Repository root | Prevent secret/test-data leakage and confirm cleanup | PASS — key absent; no 5308/5309/5310 listeners; local pre-existing DB has zero synthetic accounts | Disposable synthetic SQLite evidence/backups retained | N/A |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 92, + "text": "| V-084 | `dotnet test ... --filter \"...AccountPlansTests|...ProEntitlementAuthorizationTests|...BackgroundWorkerTenantTests|...ProfileCvControllerTests|...JobApplicationsEndpointBehaviorTests\"` | Repository root | Free/Pro/Admin/downgrade, stable 403, worker recheck and core behavior | PASS — 74/74 final | Interim runs exposed a missing test `using`, absent role services and an outdated SQLite expectation; fixtures were corrected without weakening behavior | Test-fixture maintenance resolved |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 94, + "text": "| V-086 | Full backend `dotnet test`; full frontend `npm test -- --runInBand`; `npm run build`; `git diff --check` | Repository root / `job-tracker-ui` | POL-001 regression and patch hygiene | PASS — backend 568/568; frontend 47/47 suites, 157/157; build passed; no whitespace errors | First backend full run had one outdated direct-controller expectation; corrected to Pro because the test targets SQLite aggregation, then full rerun passed. Line-ending notices only | Test expectation resolved |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 102, + "text": "| V-094 | `dotnet ef migrations has-pending-model-changes`; migration script; disposable clean `dotnet ef database update` | `JobTrackerApi` | Validate model/migration defaults and clean application path | PARTIAL — no pending model changes; new SQLite SQL correctly uses AI enabled `1` and external consent `0`; clean chain failed before the new migration | SQLite idempotent scripts are unsupported; historical `AddJobEntityAndProspectStages` expects a reconciler-added column (pre-existing EF-only blank-chain defect) | Existing application-related migration-chain limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 137, + "text": "| V-106 | `dotnet test --no-restore --filter \"FullyQualifiedName~CvProcessingOperationTests|FullyQualifiedName~ProfileCvControllerTests|FullyQualifiedName~SqliteDateTimeOffsetCompatibilityTests|FullyQualifiedName~AiOperationQueueTests\"`; `npm.cmd test -- --runInBand --forceExit src/profile-page.test.tsx`; `npm.cmd run build` | Backend tests / `job-tracker-ui` | Verify 202/dedup/owner/retry/provenance/review gate and durable Career Profile UI | PASS — backend 40/40; frontend 10/10; production build | Synthetic CV and fake provider only; Jest existing force-exit/open-handle notice | N/A |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 166, + "text": "| V-132 | `EmailSendAttemptStoreTests`; backend build/full tests; `dotnet ef migrations has-pending-model-changes`; SQLite/MariaDB up/down scripts; disposable SQLite upgrade/insert/rollback; cleanup verification | Repository root | Verify inert tenant send ledger, idempotency/state safety, additive provider migration and rollback | PASS — focused 3/3; backend 608/608; model current; bounded provider SQL; SQLite unique index/FK/sample row/rollback pass; temp files removed | First MariaDB script exposed SQLite-scaffolded types and was rejected; explicit provider branch corrected it. One parallel test/build attempt contended on compiler output; serial test passed. MariaDB SQL generated only, not executed | Provider/runtime limitation and corrected verification setup |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 168, + "text": "| V-134 | Focused `EmailSendControllerTests|EmailSendAttemptStoreTests|EmailControllerTests`; full backend; staged diff/secret-name/whitespace review | Repository root | Verify explicit confirmation, bounded input, owner isolation, canonical idempotency, rate-limited provider admission, correspondence/audit transaction and failed/uncertain behavior | PASS — focused 12/12; full backend 619/619; no whitespace errors or secret values. Provider called once across duplicate requests; cross-tenant/unconfirmed/malformed requests never reserve or deliver | SQLite and fake provider only. No real provider/email/network/browser/production execution. Crash-abandoned `sending` reconciliation remains | External provider/runtime limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 170, + "text": "| V-136 | Focused `EmailSendAttemptStoreTests|EmailSendControllerTests`; full backend; provider-dependency search; `git diff --check` | Repository root | Verify restart recovery, stale/fresh boundary, pending-failed versus sending-uncertain classification, two-owner notification isolation, idempotency and absence of provider retries | PASS — focused 10/10; full backend 620/620; repeated recovery 0/0; each owner sees one content-free notification; recovery code has no provider/SMTP dependency; no whitespace errors | Real SQLite and manual clock; no process kill, MariaDB, provider, email or production runtime. Five-minute scan performance is unmeasured on a large ledger | Runtime/performance limitation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 173, + "text": "| V-139 | Focused `BackupControllerTests|BackgroundWorkerTenantTests|EmailSendAttemptStoreTests`; full backend; staged diff/secret/content-field review | Repository root | Verify owner-readable content-free send-attempt exports and hard-job-delete cascade isolation | PASS — focused 16/16; full backend 622/622; encrypted and daily exports include one owner attempt without payload hash; real SQLite deletes only the target job's attempt; `aff34cc` pushed | Complete account deletion/files/backups/retention remain SEC-009; no production export or deletion occurred | Deliberately bounded lifecycle increment |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 177, + "text": "| V-143 | Focused correspondence-inbox Jest; focused Gmail unlink API tests; full backend/frontend; production build; `git diff --check` | Repository root / `job-tracker-ui` | Verify canonical-hub Gmail unlink confirmation, provider-copy disclosure and cross-user isolation | PASS — hub 8/8; unlink API 2/2 including real-database User A/User B denial; backend 623/623; frontend 50/50 suites and 193/193 tests; build/TypeScript pass; `1dabbeb` committed | Mocked UI and local SQLite only; no provider message was deleted and no provider/network/production action occurred | Browser/provider/production verification remains |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 180, + "text": "| V-146 | `EmailDraftPersistenceTests`; full backend; backend build; `dotnet ef migrations has-pending-model-changes`; SQLite/MariaDB up/down script generation; disposable full-chain SQLite migration rehearsal; staged diff review | Repository root | Verify an inert owner-filtered email-draft persistence boundary, job lifecycle, additive dual-provider migration and rollback | PASS/PARTIAL — two-owner real-SQLite isolation/cascade passes; backend 625/625; build has 0 warnings/errors; model current; SQLite and MariaDB up/down SQL are bounded and reversible; `14b396a` pushed | Full-chain disposable SQLite apply is blocked before the new migration by pre-existing `AddJobEntityAndProspectStages` blank-chain drift (`LastReminderEmailSentAt` is referenced before creation); MariaDB SQL generated but not executed; no API/UI/provider/content logging added | Draft persistence verified; historical migration blocker remains JT-019 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 182, + "text": "| V-148 | Focused `EmailDraftsControllerTests`; full backend; backend build; staged diff review | Repository root | Verify bounded authenticated draft CRUD, owner/job isolation and optimistic revision conflicts without provider side effects | PASS — focused 4/4; backend 629/629; build 0 warnings/errors; incomplete autosave, validation, unknown provider, foreign job/direct ID/update/delete denial, stale update/delete conflicts and owned delete pass on real SQLite; `a9bb22e` pushed | Synthetic content/local database only; no UI/browser/provider/send/production action | API boundary verified; UI recovery remains |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 183, + "text": "| V-149 | Focused draft API/export/persistence tests; full backend; EF model-current; SQLite/MariaDB up/down migration scripts; staged diff review | Repository root | Prevent refresh-restored drafts from receiving a new delivery identity | PASS — focused 9/9, backend 629/629 and model-current pass; creation assigns a canonical UUID, edits preserve it, exports include it, all-owner list remains tenant-filtered, and reversible provider SQL is generated; `80b5532` pushed | MariaDB SQL generated only; historical JT-019 still blocks full blank SQLite chain; no UI/provider/send/production action | UI safety prerequisite verified |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 185, + "text": "| V-151 | Focused `EmailDraftsControllerTests`; full backend; focused/full correspondence-inbox Jest; production build; staged diff review | Repository root / `job-tracker-ui` | Verify persisted delivery identity rotates only after the matching definitive failure | PASS — draft API 5/5; backend 630/630; inbox 12/12; frontend 50 suites/197 tests; build pass; no ledger row/refused, failed/rotated, stale/refused and foreign/not-found paths pass; `29de263` pushed | Synthetic SQLite and mocked UI only; two npm commands were initially run from repository root and failed environmentally before correct-directory reruns passed; no provider/send/production action | Durable failed-attempt rotation verified locally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 201, + "text": "| V-167 | Failing Career round-trip reproduction; affected/full backend; focused Career/Profile Jest; persistence-consumer and diff review | Repository root / `job-tracker-ui` | Preserve every reviewed Career text value across save/get/version/projection/import use without weakening extraction cleanup or write bounds | PASS — pre-fix location became `Oslo, Norway and` and the test failed; post-fix affected backend 112/112, backend 642/642 and Career/Profile UI 17/17 pass. Website path/query, remote location, free-form date, custom language and incomplete WIP entry round-trip; oversized website is rejected explicitly | Local SQLite/JSDOM only; no real private CV/model/provider/production data. One initial Jest command used nonexistent paths and was corrected; the correct files passed | Reviewed/extracted normalization boundary verified locally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 203, + "text": "| V-169 | Legacy-vs-dedicated workspace trace; failing package DTO/UI regressions; focused/full backend and frontend; optimized build; authenticated Playwright application journey; diff review | Repository root / `job-tracker-ui` | Close JOBS-002 application-package parity, marker encapsulation, dirty navigation, focus return, responsive/theme/history/error and tenant-safety gaps | PASS — focused backend 30/30, focused frontend 28/28 plus route/focus 6/6, backend 647/647, frontend 54 suites/227 tests, build and Playwright 7/7. Chromium covers keyboard row entry, Back/Forward, saved refresh, dirty-edit cancel, focus return, missing job and long data at 375/768/1440 in explicit light/dark with zero overflow. Cross-owner workspace read and draft write return not found | Synthetic local SQLite/account/browser only; no production/provider/private data. Two targeted browser iterations corrected locators, and a transient SQLite company-create 500 led to bounded idempotent setup retry; behavior assertions were not weakened. Existing GSI and Jest open-handle warnings remain | JOBS-002 repository/browser scope verified; production/native assistive-device gates remain |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 208, + "text": "| V-174 | Real-SQLite two-owner export fixture; manifest/checksum/file/redaction assertions; recent-session/rate-limit API tests; focused/full frontend and backend; optimized build; Chromium ZIP response | Repository root / `job-tracker-ui` | Deliver a complete user-readable export without exposing secrets or another tenant | PASS — focused backend/API 11/11, backend 650/650, frontend focused 4/4 and full 58 suites/234 tests, builds pass. Every manifest checksum/size matches; owned attachment/CV/avatar/generated/daily files are included; secret and other-owner sentinels are absent; Chromium receives HTTP 200 `application/zip` with `PK` signature | Synthetic data/files only; no production/private/provider access. Export reports backups/logs/external retention instead of claiming erasure. One initial InMemory-only test missed SQLite DateTimeOffset translation; the test moved to real SQLite and the query boundary was corrected | SEC-009 readable export verified locally; deletion/retention/restore remain |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 209, + "text": "| V-175 | Account-deletion threat-path review; real-SQLite lifecycle/controller tests; focused/full backend/frontend; optimized build; EF parity and MariaDB script generation; disposable Chromium startup/application suite | Repository root / `job-tracker-ui` | Deliver a production-inert, owner-isolated, retryable live-account deletion lifecycle without implying backup/provider erasure | PASS — focused backend 21/21, backend 657/657, frontend focused 8/8 and full 58 suites/237 tests, optimized build, no pending EF changes, bounded MariaDB script and Chromium 9/9. Tests prove disabled gate, exact/recent confirmation, immediate lockout, idempotence, owner-isolated row/file purge, quarantine failure safety, tombstone creation and restored-account replay; `842e793` pushed | Synthetic local rows/files only. No live deletion, provider revocation, sidecar restart, backup restore, production migration or retention decision occurred. Self/admin requests remain disabled by default. Full every-provider/disposable-production rehearsal remains external | SEC-009 repository scope implemented; production activation remains blocked |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 213, + "text": "| V-179 | Account-deletion real-SQLite failure/retry tests; sidecar token/cache tests; full backend; Compose validation | Repository root / `tools/summarizer` | Remove the live sidecar-cache and shared tombstone-path gaps without enabling deletion | PASS — lifecycle 6/6, backend 658/658, sidecar 23/23 and Compose config pass. Sidecar failure withholds completion/tombstone until retry; maintenance purge is token-protected; tombstones map to a separate named volume; activation defaults false | Synthetic rows/cache only; no production volume, deletion, restart, provider revocation, backup restore or retention decision | SEC-009 repository cache/storage boundary complete; production activation remains blocked |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 214, + "text": "| V-180 | CV operation/store focused real-SQLite tests and full backend | Repository root | Keep dormant CV extraction history consistent with cancellation, deadline recovery and retry before worker claim | PASS — focused 17/17 and backend 660/660. Cancel sets the run terminal immediately, retry reopens it, deadline recovery fails it, and owner/task/subject predicates prevent unrelated updates | Synthetic rows only; no parser/model/MariaDB/production process interruption | AI-004 dormant-row consistency gap closed |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 215, + "text": "| V-181 | AI usage meter/operation/workspace/export/deletion real-SQLite tests; EF model check; SQLite/MariaDB scripts; disposable SQLite backfill and fresh application startup; full backend | Repository root | Make Workspace and durable Strategy/CV usage owner-safe, idempotent and independent of deletable private history | PASS — focused 28/28 and backend 663/663; no pending model changes; both providers generate bounded additive DDL; SQLite backfills the synthetic legacy row exactly once; fresh runtime applies through `20260815175236_AddCrossFeatureAiUsage` and serves `/health` | Synthetic local rows only; no provider/model call, MariaDB server, production migration or worker activation. CV retains a conservative reservation and older synchronous AI paths are not yet universal | Main durable usage boundary implemented; remaining synchronous producers stay tracked under POL-001 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 216, + "text": "| V-182 | Real ASP.NET Identity data-protection token integration on SQLite; focused auth tests; full backend | Repository root | Close SEC-005B expiry/replay/custom-username proof without SMTP or production | PASS — valid confirmation succeeds once, replay and zero-lifetime expiry return the same generic failure, a real change-email token preserves a custom username and cannot replay; focused 39/39 and backend 666/666 | Synthetic addresses and ephemeral local data-protection keys only; no email, browser, MariaDB or production call | SEC-005B local token-state gap closed |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 218, + "text": "| V-184 | Shared synchronous AI provider decorator, durable/workspace suppression scopes, quota exception handler and full backend | Repository root | Make numeric Free/Pro AI limits universal without double-counting already-reserved work | PASS — focused shared-provider/accounting suite 25/25 and backend 674/674; success finalizes measured characters, Free/exhausted requests stop before provider I/O, workspace/operation scopes create no second row, and quota failures return stable 429 details | Fake in-process provider and SQLite only; no model, Stripe, MariaDB or production call | POL-001 repository accounting gap closed; Stripe lifecycle and production smoke remain |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 220, + "text": "| V-186 | Migration-chain regression tests, EF model parity/scripts, direct EF SQLite, real application startup and disposable MariaDB 11.8 fresh/restart | Repository root / disposable local databases | Close the historical blank-chain defect without changing applied production state or losing populated rows | PASS — migration tests 3/3 and backend 680/680; blank SQLite reaches all 29 migrations twice, an older populated checkpoint preserves job title/date/owner/summary, EF-only SQLite subsequently serves `/health`, and fresh/restarted MariaDB serves `/health` with 29 migrations, 49 tables and provider-correct sampled ID/owner/decimal/timestamp types. MariaDB script constrains identifiers to 64 characters | Synthetic disposable databases only; no production migration, downgrade, backup restore or private row. Migration/reconciler dual ownership remains JT-019 architectural debt | Blank-chain blocker closed; production restore/rollout remains gated |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 222, + "text": "| V-188 | 75-user query-count fixture, 205-message/two-tenant pagination fixture, focused/full backend and frontend, optimized build | Repository root / `job-tracker-ui` | Remove JT-021's confirmed N+1 and silent 200-message ceiling without breaking old clients | PASS — admin list performs two reads independent of 75 users; page 3 returns the final 5 of 205 owned messages and excludes another tenant. Focused backend 9/9, correspondence UI 15/15, backend 683/683, frontend 58 suites/239 tests and build pass. UI page navigation and filter reset are covered; the legacy inbox endpoint remains unchanged | Synthetic SQLite/InMemory/JSDOM only; no provider mailbox, production dataset or p95 load test. Current page linked/inbound chips intentionally describe the visible page | JT-021 repository defects closed; provider/production capacity remains operational evidence |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 228, + "text": "| V-194 | Executable 49-table ownership partition; focused ownership/migration chain; legacy-row upgrade; MariaDB script; full backend; fresh application SQLite startup | Repository root / disposable local SQLite | Establish one creation owner per model table and transfer the independent SystemEmailSettings table from startup DDL to EF migration ownership | PASS — ownership/migration 6/6; blank and repeated migration succeed; representative legacy SMTP row survives; provider SQL is present; backend 722/722; fresh runtime applies `20260830120000_AdoptSystemEmailSettingsSchema` and starts healthy | MariaDB SQL is generated but the new migration was not executed on a live MariaDB server; downgrade deliberately preserves ambiguous pre-migration data. Thirty-four reconciler-owned tables remain | JT-019 first migration-backed ownership transfer complete; provider runtime and remaining dependency groups continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 229, + "text": "| V-195 | Ownership/migration chain; populated adoption/downgrade/retry; MariaDB script; full backend | Repository root / disposable local SQLite | Transfer the independent UserRuleSettings table from both startup-DDL paths to migration ownership without losing per-user settings | PASS — focused ownership/migration 7/7; representative owner row survives adoption, downgrade and re-upgrade; generated MariaDB SQL contains provider-safe DDL; startup no longer contains the table create; full backend 723/723 | MariaDB SQL generated only; no production migration. Down preserves ambiguous legacy data by design. Thirty-three reconciler-owned tables remain | JT-019 second leaf transfer complete; dependency groups continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 230, + "text": "| V-196 | Ownership/migration chain; populated adoption/downgrade/retry; MariaDB script; full backend | Repository root / disposable local SQLite | Move GmailReviewDecisions to migration ownership and close the missing MariaDB table path | PASS — focused ownership/migration 8/8; representative decision survives adoption, downgrade and re-upgrade; generated MariaDB SQL contains provider-safe DDL; SQLite startup create is removed; full backend 724/724 | MariaDB SQL generated only; no provider account or production migration. Down preserves ambiguous legacy data by design. Thirty-two reconciler-owned tables remain | JT-019 third leaf transfer complete; provider runtime and dependency groups continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 231, + "text": "| V-197 | Ownership/migration chain; populated adoption/downgrade/retry; index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move the authentication-support group to migration ownership without invalidating recovery codes, trusted devices, or active sessions | PASS — focused ownership/migration 9/9; representative rows survive adoption, downgrade and re-upgrade; expected indexes exist; generated MariaDB SQL contains all three provider-safe definitions; both startup-create paths are removed; full backend 725/725 | MariaDB SQL generated only; no provider account or production migration. Guarded MariaDB index/auto-increment repairs remain temporarily. Twenty-nine reconciler-owned tables remain | JT-019 authentication-support transfer complete; dependent feature groups continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 232, + "text": "| V-198 | Ownership/migration chain; populated adoption/downgrade/retry; encrypted-value and index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move Gmail, Microsoft Graph, and IMAP connection records to migration ownership without losing credentials or sync state | PASS — focused ownership/migration 10/10; representative encrypted values survive adoption, downgrade and re-upgrade; all five expected indexes exist; generated MariaDB SQL contains all three provider-safe definitions; both startup-create paths are removed; full backend 726/726 | MariaDB SQL generated only; no provider account or production migration. Gmail column repair and guarded MariaDB index/auto-increment repairs remain temporarily. Twenty-six reconciler-owned tables remain | JT-019 email-provider transfer complete; dependent CV/career groups continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 233, + "text": "| V-199 | Ownership/migration chain; populated adoption/downgrade/retry; FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move CV upload artifacts and extraction runs to migration ownership without losing import history | PASS — focused ownership/migration 11/11; artifact hash and structured result survive adoption, downgrade and re-upgrade; all three indexes exist; artifact deletion sets the run link null; generated MariaDB SQL contains provider-safe parent/child DDL; startup creates neither table; full backend 727/727 | MariaDB SQL generated only; no provider account or production migration. Guarded MariaDB index/auto-increment repairs remain temporarily. Twenty-four reconciler-owned tables remain | JT-019 CV extraction persistence transfer complete; tailored CV and career groups continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 234, + "text": "| V-200 | Ownership/migration chain; populated adoption/downgrade/retry; FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move job-specific tailored CV drafts to migration ownership without losing generated or edited content | PASS — focused ownership/migration 12/12; summary, custom-section and context data survive adoption, downgrade and re-upgrade; both indexes exist; deleting the parent application cascades to the draft; generated MariaDB SQL is provider-safe; startup no longer creates the table; full backend 728/728 | MariaDB SQL generated only; no provider account or production migration. Guarded MariaDB index/auto-increment repairs remain temporarily. Twenty-three reconciler-owned tables remain | JT-019 tailored CV transfer complete; career-profile aggregate remains a dependency-aware future batch |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 235, + "text": "| V-201 | Ownership/migration chain; populated adoption/downgrade/retry; FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move persisted interview-preparation and irregular AI workspace notes to migration ownership without losing reviewed outputs | PASS — focused ownership/migration 13/13; interview summary and candidate-fit JSON survive adoption, downgrade and re-upgrade; both uniqueness indexes exist; deleting the parent application cascades through both tables; generated MariaDB SQL is provider-safe; startup creates neither table; full backend 729/729 | MariaDB SQL generated only; no provider account or production migration. Guarded MariaDB index/auto-increment repairs remain temporarily. Twenty-one reconciler-owned tables remain | JT-019 job-workspace note transfer complete; CV variants and career-profile aggregates remain dependency-aware batches |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 236, + "text": "| V-202 | Ownership/migration chain; populated adoption/downgrade/retry; relationship/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move saved CV variants and append-only revision history to migration ownership without losing user documents | PASS — focused ownership/migration 14/14; public slug, settings and two revisions survive adoption, downgrade and re-upgrade; four indexes exist; deleting the job nulls only the CV link and deleting the CV cascades through revisions; generated MariaDB SQL is provider-safe; startup creates neither table; full backend 730/730 | MariaDB SQL generated only; no provider account or production migration. Guarded malformed-empty/index/auto-increment repair remains temporarily. Nineteen reconciler-owned tables remain | JT-019 CV variant aggregate transfer complete; career-profile aggregate and remaining feature tables continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 237, + "text": "| V-203 | Ownership/migration chain; populated adoption/downgrade/retry; usage/FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move append-only AI interaction history to explicit migration ownership without losing generated results or usage data | PASS — focused ownership/migration 15/15; result JSON, mode, provider and usage counters survive adoption, downgrade and re-upgrade; both indexes exist; deleting the parent application cascades through history; generated MariaDB SQL is provider-safe; startup no longer creates the table; full backend 731/731 | MariaDB SQL generated only; no provider account or production migration. Historical compatibility bootstrap and guarded counter/shape/index repairs remain. Eighteen reconciler-owned tables remain | JT-019 AI interaction transfer complete; checklist/document/preparation tables continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 238, + "text": "| V-204 | Ownership/migration chain; populated adoption/downgrade/retry; workflow/FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move application workflow checklist state to migration ownership without losing automatic or manual progress | PASS — focused ownership/migration 16/16; auto-completed system and pending manual items survive adoption, downgrade and re-upgrade; idempotency/order indexes exist; deleting the parent application cascades through checklist items; generated MariaDB SQL is provider-safe; startup no longer creates the table; full backend 732/732 | MariaDB SQL generated only; no provider account or production migration. Guarded malformed-empty/index/auto-increment repair remains temporarily. Seventeen reconciler-owned tables remain | JT-019 checklist transfer complete; cover-letter and interview-preparation tables continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 239, + "text": "| V-205 | Ownership/migration chain; populated adoption/downgrade/retry; document/FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move append-only cover-letter revision history to migration ownership without losing recoverable documents | PASS — focused ownership/migration 17/17; manual and AI revisions plus source/action metadata survive adoption, downgrade and re-upgrade; owner/job/version index exists; deleting the parent application cascades through history; generated MariaDB SQL is provider-safe; startup no longer creates the table; full backend 733/733 | MariaDB SQL generated only; no provider account or production migration. Guarded malformed-empty/index/auto-increment repair remains temporarily. Sixteen reconciler-owned tables remain | JT-019 cover-letter history transfer complete; interview-preparation items and career-profile aggregate continue incrementally |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 240, + "text": "| V-206 | Ownership/migration chain; populated adoption/downgrade/retry; practice-state/FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move durable interview-preparation items to migration ownership without losing user or AI preparation content | PASS — focused ownership/migration 18/18; user-authored and AI-generated questions, answers, prepared state and source metadata survive adoption, downgrade and re-upgrade; owner/job/sort index exists; deleting the parent application cascades through preparation items; generated MariaDB SQL is provider-safe; startup no longer creates the table; full backend 734/734 | MariaDB SQL generated only; no provider account or production migration. Guarded malformed-empty/index/auto-increment repair remains temporarily. Fifteen reconciler-owned tables remain | JT-019 feature-table transfers complete; the Career Profile aggregate and Identity group remain dependency-aware batches |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 241, + "text": "| V-207 | Ownership/migration chain; populated aggregate adoption/downgrade/retry; JSON/text/FK/index assertions; MariaDB script; full backend | Repository root / disposable local SQLite | Move the canonical Career Profile, append-only history, and six relational child types to migration ownership without losing career data | PASS — focused ownership/migration 19/19; canonical and long-tail JSON, Norwegian text, version history, experience, education, skill, project, certification and language rows survive adoption, downgrade and re-upgrade; all 14 aggregate indexes exist; deleting the profile cascades through history and children; generated MariaDB SQL uses bounded indexed keys and provider-safe types; startup creates none of the eight tables; full backend 735/735 | MariaDB SQL generated only; no production migration. Guarded historical LongTailJson/index/auto-increment repairs remain temporarily. Seven reconciler-owned Identity tables remain | JT-019 feature and career transfers complete; isolate the Identity ownership boundary next |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/audits/verification-log.md", + "line": 242, + "text": "| V-208 | Ownership/migration chain; populated Identity adoption/downgrade/retry; credential/preference/FK/index assertions; MariaDB script; full backend; fresh application startup | Repository root / disposable local SQLite | Complete JT-019 by moving the seven ASP.NET Identity tables to migration ownership without invalidating authentication data | PASS — focused ownership/migration 20/20; password hash, Bokmål preference, 2FA state, role assignment, role/user claims, external login and token survive adoption, downgrade and re-upgrade; all eight Identity indexes exist; user and role deletion cascades remain effective; generated MariaDB SQL is provider-safe; startup creates no model tables; full backend 736/736; a fresh application applies the complete chain, reaches Identity role initialization and listens normally | MariaDB SQL generated only; no production migration. The historical AspNetUsers compatibility bootstrap and guarded column/index repairs remain for chain traversal and legacy upgrades. Launch settings supplied an existing policy-invalid development admin password, producing a non-fatal seed warning | JT-019 complete; future work may retire individual repair statements only after provider-backed historical fixtures prove them redundant |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/career-workspace-branch-assessment.md", + "line": 86, + "text": "| Do not delete until a migration strategy exists | Tables empty; branch has both SQLite + MySQL reconciler dialects | ✅ Satisfied |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/career-workspace-branch-assessment.md", + "line": 156, + "text": "The branch provisions tables through the **raw-SQL reconciler** (both SQLite and MySQL dialects), because when it was written \"the EF ModelSnapshot is known-stale; do not rely on `Migrate()`\". **That is no longer true** — Phase 0 resynced the snapshot and shipped `Jobs` via a normal EF migration, verified against the real dev database. On merge, both mechanisms will coexist. That is safe (the reconciler is idempotent) and should **not** be untangled during the rebase — do it as separate follow-up work, or the rebase becomes unreviewable.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/career-workspace-implementation-roadmap.md", + "line": 33, + "text": "- **SQLite (dev):** `Ensure*Table(conn)` helpers with `CREATE TABLE IF NOT EXISTS` + `EnsureColumn` guards, called in the `useSqliteBootstrap` branch (near `EnsureCvTables`).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/cv-builder-product-teardown.md", + "line": 14, + "text": "Jobbjakt is a self-hosted, single-tenant-ish (multi-user with admin) **job application tracker** with strong email intelligence, to which a CV builder has been progressively bolted on. Live at `https://jobs.cesnimda.uk`. Stack: ASP.NET Core 9 + EF Core (SQLite dev / MariaDB prod), Next.js 16 static-export frontend (MUI), FastAPI AI sidecar (Ollama/Gemini/Groq router), Playwright PDF rendering.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/deployment/backup-restore.md", + "line": 17, + "text": " aborts if it is missing. If it were wrong, the SQLite path would run and back up the wrong thing.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/deployment/backup-restore.md", + "line": 26, + "text": " the `-- Dump completed` trailer; otherwise the file is deleted and the deploy stops. A SQLite", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/deployment/backup-restore.md", + "line": 29, + "text": " A `jobtracker-sqlite-*.tar.gz` on a MariaDB host means the environment is wrong.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 9, + "text": "this repo was scaffolded against SQLite, so run against MariaDB it emits:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 31, + "text": "3a. SQLite: apply one migration, reconcile, repeat", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 47, + "text": "- **SQLite reconciles between migrations.** Historical SQLite table rebuilds read the current model", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 50, + "text": "- **MariaDB does not reconcile between migrations.** Its ALTER operations do not use SQLite table", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 186, + "text": "2. Add an EF migration. Review its generated SQL for both SQLite and MariaDB; do not assume a", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 187, + "text": " SQLite-scaffolded type is valid on MariaDB.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 193, + "text": "5. Verify blank, populated-upgrade and restart paths on SQLite and a real MariaDB container. EF", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 218, + "text": "# SQLite (default) — creates Data__Root/jobtracker.db", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 225, + "text": "Standalone EF tooling is also supported for a blank SQLite database. The historical initial", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 226, + "text": "migration now supplies the stable JobApplication columns required by later SQLite rebuilds, and", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 243, + "text": "All four scenarios, 2026-07-19, against MariaDB 11 and SQLite:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 251, + "text": "| Fresh SQLite | 42 tables created, app starts |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 252, + "text": "| Existing partially-migrated SQLite dev DB (34 tables) | upgraded to 44 tables, 13 applications and 8 companies preserved |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 258, + "text": "SQLite database, an older populated SQLite checkpoint, and a disposable MariaDB 11.8 database.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/infrastructure/database-ownership.md", + "line": 259, + "text": "Standalone SQLite migration and retry both reached the latest migration; populated title/date and", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/operations/production-backup-verification.md", + "line": 16, + "text": "| **Why** | The machine this ran on has no route to production: no `/opt/job-tracker`, no `DATABASE_PROVIDER` or `JOBTRACKER_CONNECTION_STRING` in its `.env`, and the local stack runs SQLite. The production host, user and key are CI secrets (`PROD_HOST`, `PROD_USER`, `PROD_SSH_KEY`) that are not available here |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/operations/production-backup-verification.md", + "line": 57, + "text": "path ran. A `jobtracker-sqlite-.tar.gz` on a MariaDB host would mean the environment is wrong.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/phase-0-foundation-report.md", + "line": 124, + "text": "- `JobApplications.DateApplied` → **nullable** (SQLite table rebuild)", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/phase-5-completion-report.md", + "line": 97, + "text": "| Existing SQLite dev DB | upgraded 34 → 44 tables, all rows preserved |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/production-readiness-review.md", + "line": 26, + "text": "| Existing partially-migrated SQLite upgrades | ✅ | 34 → 44 tables, 13 applications and 8 companies intact |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/production-readiness-review.md", + "line": 74, + "text": "never on the command line. The dump is rejected if it is empty or lacks `CREATE TABLE`. SQLite", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/production/production-ai-validation.md", + "line": 25, + "text": "OPS-001A durable operation state is implemented locally. SQLite concurrency/migration checks pass and MariaDB DDL is generated, but no handler or worker is active and MariaDB/production execution remains blocked; see `docs/verification/ops-001a-durable-operations.md`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/production/production-ai-validation.md", + "line": 27, + "text": "OPS-001B persistent terminal notifications are implemented locally. Atomic rollback, owner isolation and SQLite migration checks pass; MariaDB DDL is generated but not executed. No notification email or worker is active; see `docs/verification/ops-001b-notifications.md`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/production/production-ai-validation.md", + "line": 43, + "text": "AI-004 moves upload/reprocess/rebuild/improve to one typed `cv.process` operation and removes the separate in-memory channel. Synthetic SQLite and UI tests pass while preserving the review gate. Parser hardening SEC-006/007, browser/private-file/model/MariaDB/restart/production gates remain incomplete; the worker remains off. See `docs/verification/ai-004-cv-processing-queue.md`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 29, + "text": "scenarios run against live MariaDB 11 and SQLite — found and fixed two more issues: a follow-up reminder", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 152, + "text": "| **SQLite volume resolved by real name** | Project-prefixed, and fails if absent — the bare name would have created an empty volume and backed that up |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 176, + "text": "local provider=\"${DATABASE_PROVIDER:-sqlite}\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 181, + "text": "**`provider` resolves to `sqlite` on a MariaDB production host.**", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 185, + "text": "1. The SQLite branch runs and tars the `jobtracker_data` volume.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 203, + "text": "`jobtracker-sqlite-.tar.gz`. The filename alone distinguishes the two paths.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 211, + "text": "2. **Requires `DATABASE_PROVIDER` explicitly.** The `:-sqlite` default is gone. Missing means stop and", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 220, + "text": " that died partway through is rejected. A SQLite archive must be valid gzip and actually contain", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 222, + "text": "5. **Resolves the SQLite volume by its real, project-prefixed name** and fails if it does not exist.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 239, + "text": "| SQLite with a populated volume | ✅ `.tar.gz` written and verified |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 240, + "text": "| SQLite volume containing no `jobtracker.db` | ✅ rejected, file deleted |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 241, + "text": "| SQLite volume name not present | ✅ rejected before any container ran; no stray empty volume created |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 302, + "text": "migration-owned and the migration was scaffolded against SQLite, which stores `DateTimeOffset` as", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-candidate-review.md", + "line": 415, + "text": " file is `jobtracker--.sql.gz` — a `jobtracker-sqlite-*.tar.gz` would mean the", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-checklist.md", + "line": 34, + "text": "| Existing SQLite dev database | upgraded 34 → 44 tables, rows preserved |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-checklist.md", + "line": 61, + "text": "| Reconciler path unproven on your data | Medium | Verified on containers and on a real SQLite dev database — not on production. This is what the backup is for. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-checklist.md", + "line": 75, + "text": "3. **`DATABASE_PROVIDER` defaults to `sqlite`.** If it goes missing from `.env`, the backend does not", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-final-report.md", + "line": 38, + "text": "All four startup scenarios run against live MariaDB 11 and SQLite, with the real backend binary:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/release-final-report.md", + "line": 45, + "text": "| Fresh SQLite + restart | schema built, idempotent, 0 errors |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/todo/work.md", + "line": 5, + "text": "- [x] Phase 2 from `2d0f131`, on `codex/ui-redesign-phase2`: [preservation checkpoint](../redesign/phase-2/README.md), 57 stable PRES groups mapped, 15 added component cases, six added browser cases, explicit standalone CI type gate and traceability. Fresh 916 backend / 313 frontend pass; browser 23 actual passes + one documented SQLite expected failure, B04/B06/PDF/config regressions pass. No application/visual redesign, B07 or F04 closure.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/todo/work.md", + "line": 6, + "text": "- [ ] P2-D01 separate baseline repair before package/tailoring restructuring: SQLite DateTimeOffset ordering fails in native tailoring/capture. Retain the expected-failure browser oracle; prove native capture and unchanged historical binaries after source edits/deletion before removing annotation. P2-O01 initial rules 500 remains unconfirmed; direct and browser save controls pass. See [baseline evidence](../redesign/phase-2/BASELINE_DEFECTS.md).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/todo/work.md", + "line": 52, + "text": "- [x] Fixed fresh SQLite/MySQL startup ordering so the migration-owned UI-language column is not pre-created by schema reconciliation, then proved the full fresh-database path in Playwright.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/todo/work.md", + "line": 861, + "text": "* SQLite incompatibility", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ai-003-strategy-snapshot-queue.md", + "line": 32, + "text": "- Tests use SQLite and fake model output. They cover 202/idempotent duplicate click, typed handler success/provenance, one stable result, malformed response/retry state/no partial output, owner isolation, queued/cancelled/failed/retry UI states and cached-result refresh.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ai-004-cv-processing-queue.md", + "line": 28, + "text": "- Focused CV/queue/SQLite tests: 40/40 after the final failure-path addition; synthetic files and fake providers only.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ai-004-cv-processing-queue.md", + "line": 33, + "text": "- Integration coverage uses real SQLite operation/run/artifact/notification rows and proves 202, active duplicate reuse, no raw CV payload in operation state, owner-scoped execution, provider-failure retry state, one terminal notification and the unchanged human review gate.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 15, + "text": "| Career/API | SQLite variants/runs/usage/history/workspace | PASS | BLOCKED | NOT RUN | `core-001-sqlite-provider-parity.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 20, + "text": "| Workers | two-owner rules, export, reminders and enrichment | PASS (real SQLite; fake email/AI) | PARTIAL — notification popover/navigation verified; worker execution is not a browser action | NOT RUN; switches off | `bg-001-tenant-workers.md`, V-172 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 21, + "text": "| Durable operations | idempotent create/claim/lease/retry/cancel/complete | PASS (real SQLite) | NOT APPLICABLE until API/UI slice | NOT RUN | `ops-001a-durable-operations.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 22, + "text": "| Notifications | atomic terminal record, owner list/read/dismiss | PASS (real SQLite; forced rollback) | NOT APPLICABLE until API/UI slice | NOT RUN | `ops-001b-notifications.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 26, + "text": "| Entitlements | queued CV and enrichment worker recheck | PASS (fake AI; real SQLite worker scopes) | N/A | NOT RUN; workers off | `pol-001-free-pro-entitlements.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 34, + "text": "| Durable AI | Pro admission, idempotent status URL and bounded capacity | PASS (real SQLite + synthetic subject IDs) | BLOCKED until real producer | NOT RUN; worker off | `ai-001-durable-ai-queue.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 40, + "text": "| AI routing | actual provider/model/route persistence on success/failure | PASS (real SQLite operation/history state; fake provider) | BLOCKED until real producer | NOT RUN | `ai-002-provider-routing.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 41, + "text": "| Strategy Snapshot | Pro enqueue returns 202; active/double-click request is idempotent | PASS (real SQLite; fake model) | BLOCKED | NOT RUN; worker off | `ai-003-strategy-snapshot-queue.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 43, + "text": "| Strategy Snapshot | owner-scoped rehydration/result/operation and no partial malformed output | PASS (real SQLite; fake model) | BLOCKED | NOT RUN | `ai-003-strategy-snapshot-queue.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 44, + "text": "| CV processing | upload 202, active duplicate reuse, owner-scoped execution and review gate | PASS (real SQLite; synthetic CV/fake provider) | BLOCKED | NOT RUN; worker off | `ai-004-cv-processing-queue.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 53, + "text": "| Account export | recent-sign-in/rate-limit gate; complete redacted owner ZIP, files, warnings and checksums | PASS (real SQLite + components) | PASS — fresh synthetic Free download response and success state | NOT RUN with production data | `sec-009-account-lifecycle.md`, V-174 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 69, + "text": "| Job email send | explicit confirmation, owner isolation, idempotency, failure/uncertainty and restart recovery | PASS (real SQLite + fake providers) | NOT RUN | NOT RUN | `mail-001-job-email-hub.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/application-action-matrix.md", + "line": 70, + "text": "| Job email send | content-free encrypted/daily export and hard-job-delete cascade | PASS (real SQLite) | N/A | NOT RUN | `mail-001-job-email-hub.md` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/bg-001-tenant-workers.md", + "line": 24, + "text": "Real SQLite tests prove two-owner/no-HTTP filtering, owner-failure isolation, per-owner rules at an exact fixed-clock threshold with an idempotent post-restart pass, atomic per-owner daily exports that overwrite the same date file after restart, fake-AI enrichment for both owners, fake-email reminders that do not resend after restart, default-off behavior for all four workers and HTTP-context override refusal. All four worker loops and business-date decisions now use the injected `TimeProvider` rather than hidden system clocks.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "line": 1, + "text": "# CORE-001 — SQLite/provider parity verification", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "line": 7, + "text": "`VERIFIED LOCALLY`. The audited SQLite `DateTimeOffset` failures are fixed without changing stored types or MariaDB query behavior. Production MariaDB execution and browser verification remain outstanding.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "line": 11, + "text": "- SQLite materializes only owner/job-scoped CV variants, extraction runs/artifacts and AI rows before `DateTimeOffset` ordering or range comparison.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "line": 19, + "text": "- Real-provider compatibility suite: 3/3 passed in `SqliteDateTimeOffsetCompatibilityTests`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "line": 20, + "text": " - SQLite relational database: newest-first CV/history/workspace/assets, current-month/all-time AI usage, generation entitlement query, extraction runs, latest artifact and owner isolation.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "line": 28, + "text": "An isolated API used a disposable fresh SQLite root and synthetic `example.test` accounts only:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-001-sqlite-provider-parity.md", + "line": 49, + "text": "- Direct `dotnet ef database update` against a blank SQLite file now reaches the latest migration and is idempotent. A populated older checkpoint preserves its job data through the same chain, and real application startup over the EF-only database serves `/health` (V-186). The broader migration/reconciler dual-ownership architecture remains JT-019 debt.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/core-002-route-uniqueness.md", + "line": 26, + "text": "- Isolated SQLite HTTP matrix using synthetic users:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-018-developer-documentation.md", + "line": 9, + "text": "- Corrected the production provider matrix: SQLite and MariaDB/MySQL are implemented; PostgreSQL is not.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-019-schema-ownership.md", + "line": 14, + "text": "- Added `20260830120000_AdoptSystemEmailSettingsSchema`, with provider-aware additive DDL for SQLite", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-019-schema-ownership.md", + "line": 20, + "text": "- Added `20260830122000_AdoptGmailReviewDecisionsSchema`, removed the SQLite startup-create path,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-019-schema-ownership.md", + "line": 55, + "text": "rows; SQLite installations that never received the reconciler-only table now receive it. `Down` is", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-019-schema-ownership.md", + "line": 62, + "text": "- Blank SQLite chain applies all migrations twice and creates all ten expected", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-019-schema-ownership.md", + "line": 97, + "text": "- Fresh application startup over a new disposable SQLite data root applied the complete chain,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/jt-019-schema-ownership.md", + "line": 99, + "text": "- Fresh application startup over a new disposable SQLite database applied", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 47, + "text": "- The additive migration has provider-specific SQLite/MariaDB types and reversible up/down SQL. No send route, OAuth scope or provider call was enabled.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 65, + "text": "- Tests use owner-isolated SQLite and a fake provider; no email, OAuth flow, provider service or external network was invoked.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 91, + "text": "- A real-SQLite two-owner clock/restart test proves stale/fresh separation, owner-visible notifications, repeat-run idempotency and no transition back to pending/sending.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 106, + "text": "- Real SQLite proves a hard delete of one owned job cascades only its send attempts and preserves another owner's job/attempt.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 142, + "text": "- The owning job has a cascade relationship; a real-SQLite two-owner test proves User A sees only User A's draft and deleting User A's job removes only that draft while preserving User B's data.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 143, + "text": "- The additive migration has explicit SQLite and MariaDB types plus reversible down SQL. EF reports the model current; backend passes 625/625 and both provider scripts generate successfully.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 145, + "text": "- The repaired historical chain now reaches this migration from a blank standalone SQLite database and remains idempotent. A populated older checkpoint also preserves job data through the chain (V-186); production migration remains gated.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/mail-001-job-email-hub.md", + "line": 159, + "text": "- Real-SQLite tests cover foreign job creation, direct foreign IDs, foreign list/update/delete attempts, stale updates/deletes and preservation of the other tenant. Focused 4/4, backend 629/629 and build pass.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001a-durable-operations.md", + "line": 5, + "text": "Status: `IMPLEMENTED — NOT VERIFIED`. State, ownership, concurrency and SQLite migration checks pass. Executable MariaDB and production checks remain unavailable.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001a-durable-operations.md", + "line": 11, + "text": "| `dotnet test ... --filter \"FullyQualifiedName~UserOperationStoreTests\"` | PASS — 7/7 real SQLite |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001a-durable-operations.md", + "line": 14, + "text": "| SQLite/MariaDB migration scripts from canonical-identity migration to `AddUserOperations` | PASS — create + unique/claim indexes; MariaDB uses eight `datetime(6)` fields and no `TEXT`/`longtext` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001a-durable-operations.md", + "line": 15, + "text": "| SQLite/MariaDB down scripts | PASS — both drop only `UserOperations` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001a-durable-operations.md", + "line": 16, + "text": "| Disposable existing SQLite upgrade, down, and re-upgrade | PASS |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001a-durable-operations.md", + "line": 21, + "text": "Generated evidence is under `docs/audits/evidence/ops-001a/`: `sqlite-up.sql`, `sqlite-down.sql`, `mariadb-up.sql`, `mariadb-down.sql`, disposable `upgrade.db`, and `fresh-runtime/`. All data is synthetic and local.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001b-notifications.md", + "line": 5, + "text": "Status: `IMPLEMENTED — NOT VERIFIED`. Repository, real-SQLite and generated provider checks pass. MariaDB execution, owner API/UI/browser checks and production rollout remain.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001b-notifications.md", + "line": 13, + "text": "- Owner query filters deny cross-user list/read/dismiss mutations. Unread, read and dismissed states behave consistently across file-backed SQLite contexts.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001b-notifications.md", + "line": 15, + "text": "- The additive migration upgrades, downgrades and re-upgrades a disposable SQLite database. The model snapshot is current.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001b-notifications.md", + "line": 16, + "text": "- Generated SQLite and MariaDB up/down scripts are under `docs/audits/evidence/ops-001b/`. MariaDB DDL uses bounded strings and `datetime(6)`; it was inspected but not executed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001b-notifications.md", + "line": 22, + "text": "- `dotnet ef migrations script ...` for SQLite and MariaDB up/down: PASS after correcting the design-time MariaDB connection-string key; the invalid first output was overwritten.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001b-notifications.md", + "line": 23, + "text": "- `dotnet ef database update` notification/up, operation/down, notification/up against disposable SQLite: PASS.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001c-operation-ui.md", + "line": 5, + "text": "Status: `IMPLEMENTED — NOT VERIFIED`. API, real-SQLite HTTP, component and regression checks pass. In-app browser, MariaDB and production checks remain unavailable.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001c-operation-ui.md", + "line": 12, + "text": "- Two disposable users against isolated SQLite each saw only their own operation. User A received 404 for User B's operation detail/cancel and notification read/dismiss; User A's own detail/cancel/read/dismiss/retry returned 200/204 as appropriate. Anonymous list returned 401.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/ops-001c-operation-ui.md", + "line": 30, + "text": "- The isolated SQL seed initially used lowercase GUID text, which does not match EF's canonical SQLite GUID parameter representation. Those synthetic rows were replaced with uppercase GUID text before the passing HTTP matrix.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/pol-001-free-pro-entitlements.md", + "line": 45, + "text": "- `AiUsageMeterTests`, operation integration, account export/deletion and SQLite compatibility tests cover idempotent reservation, limits, owner isolation, history-independent totals, Strategy finalization, CV conservative reservation and lifecycle handling.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/pol-002-ai-privacy.md", + "line": 26, + "text": "- EF pending-model check: pass; SQLite script adds `AiEnabled DEFAULT 1` and `ExternalAiProcessingAllowed DEFAULT 0`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/pol-002-ai-privacy.md", + "line": 35, + "text": "- Direct clean `dotnet ef database update` fails in the pre-existing historical SQLite migration chain before this migration (`AddJobEntityAndProspectStages` expects a reconciler-added column). The application startup reconciler path was not exercised because the local process-launch command was blocked by execution policy.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-004-microsoft-identity.md", + "line": 6, + "text": "frontend component tests, build, migration SQL and disposable SQLite upgrade checks pass. Real", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-004-microsoft-identity.md", + "line": 30, + "text": "- SQLite migration SQL uses two nullable `TEXT` columns and a unique composite index.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-004-microsoft-identity.md", + "line": 32, + "text": "- Disposable SQLite legacy rehearsal:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-004-microsoft-identity.md", + "line": 36, + "text": " - duplicate pair assignment failed with SQLite unique-constraint exit 19.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-005b-email-ownership.md", + "line": 25, + "text": "- SQLite migration script: `PendingEmail TEXT`, `PendingEmailRequestedAtUtc TEXT`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-005b-email-ownership.md", + "line": 27, + "text": "- Disposable SQLite upgrade rehearsal with earlier migrations marked applied: migration applied and both columns were present.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-005b-email-ownership.md", + "line": 33, + "text": "- Real ASP.NET Identity data-protection tokens against SQLite prove valid confirmation, replay rejection, expiry rejection, real change-email confirmation, replay rejection and custom-username preservation. Focused auth/token tests pass 39/39; full backend passes 666/666.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-005b-email-ownership.md", + "line": 38, + "text": "- A fresh empty SQLite migration rehearsal failed in the pre-existing `AddJobEntityAndProspectStages` migration because `LastReminderEmailSentAt` is absent. SEC-005B's migration was not reached. The matching upgrade rehearsal passed; CORE-001 owns the broken fresh chain.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-005b-email-ownership.md", + "line": 54, + "text": "dotnet ef database update ... (disposable SQLite fresh and upgrade rehearsals)", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-008-attachment-consistency.md", + "line": 5, + "text": "Status: `IMPLEMENTED — NOT VERIFIED`. Repository, real-SQLite integration and isolated HTTP checks pass. Browser and production checks remain blocked.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-008-attachment-consistency.md", + "line": 29, + "text": "The real-SQLite tests cover invalid later files, cancelled copy, database rollback, upload-promotion failure and restart, delete-purge failure and restart, quarantined-delete restore, idempotent reconciliation, metadata-only rename with atomic flags, repeated same-name uploads, exact 10 MiB boundary, one-byte-over rejection, outside-root rejection, unknown-orphan preservation and two-user isolation. Failure injection uses no malicious documents.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-008-attachment-consistency.md", + "line": 33, + "text": "An isolated development API ran on `127.0.0.1:5305` with disposable synthetic SQLite data:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/verification/sec-009-account-lifecycle.md", + "line": 34, + "text": "- Additive Identity status plus durable request/file-ledger tables track request, stage, retry, file checksum, row count, warnings, and sanitized failure state. SQLite is EF-generated; the MariaDB migration uses explicit bounded types and its generated script was reviewed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 76, + "text": "- **Decision:** Do not create operation/deletion tables until their package selects one schema owner and proves fresh/upgrade SQLite and MariaDB behavior.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 146, + "text": "- **Decision:** Store only the proposed address and request time, rotate the Identity security stamp for each replacement request, and use the built-in change-email token. Add both fields through one EF migration whose SQLite and MariaDB column types are explicit; do not duplicate these Identity columns in the startup reconciler.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 147, + "text": "- **Reason/evidence:** The active email must remain authoritative until proof. Identity already binds tokens to user, new email, purpose and security stamp; stamp rotation makes the latest request win without another token table. Dry-run SQL showed SQLite-scaffolded types were unsafe for MariaDB until the migration branched by provider. Audit/schema decision P0-4B assigns these Identity fields to EF.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 149, + "text": "- **Consequences:** deployment must run `20260802205800_AddPendingEmailChange` before the new API version. SQLite uses `TEXT`; MariaDB uses `varchar(320)` and `datetime(6)`. Rolling-version and MariaDB execution still require verification.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 173, + "text": "## DEC-018 — Keep MariaDB date work in SQL and bound SQLite fallback by owner/job", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 176, + "text": "- **Decision:** Branch only at the affected `DateTimeOffset` query roots: SQLite materializes owner/job-scoped rows before ordering or range comparison; MariaDB keeps server-side ordering, filtering, aggregation and pagination.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 177, + "text": "- **Reason/evidence:** the real SQLite provider throws before execution, while Pomelo generates the required SQL. Changing all timestamp storage would require a risky migration and editing response endpoints individually would leave CV cleanup/reprocess siblings broken. Real-provider tests and fresh HTTP rehearsal pass.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 179, + "text": "- **Consequences:** SQLite work is bounded by tenant/job and current entitlement limits but still happens in memory; production MariaDB behavior is unchanged. If per-user AI history grows materially, a later UTC scalar column/index migration may be measured and designed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 197, + "text": "- **Reason/evidence:** every final path is already generated, unique and root-bounded. The suffix plus row existence encodes every required recovery decision, and real-SQLite failure injection proves upload promotion, delete restore/purge and idempotent restart behavior. A second journal would introduce dual durable state and another crash-ordering problem.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 207, + "text": "- **Reason/evidence:** hosted scopes have no HTTP identity and therefore returned zero rows. Leaving services on while fixing that root cause would unexpectedly start status mutations, file exports, email and AI calls. Real-SQLite tests prove owner filtering, per-owner settings, failure isolation and fake-only side effects.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 217, + "text": "- **Reason/evidence:** a manually branched migration produces correct SQLite and bounded MariaDB DDL, avoiding the repository's old SQLite-type failure while reducing JT-019 dual ownership. CV/Strategy inputs already have durable domain IDs; copying private text into a queue row is unnecessary. Concurrent SQLite tests prove one idempotent row and one lease winner.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 409, + "text": "- **Consequences:** API integration can reserve a unique attempt before external I/O and fail closed on pending/uncertain records. A provider success followed by database failure remains reconcilable rather than blindly retried. User export must include the non-sensitive metadata; job/account deletion cascades it. The migration is additive and EF-owned with explicit SQLite/MariaDB types.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 427, + "text": "- **Reason/evidence:** provider acceptance cannot share the database transaction. Owner-scoped SQLite tests prove malformed, unconfirmed and cross-tenant requests do not reserve or send; duplicate, rejected and interrupted attempts call the fake provider at most once. Canonical UUID formatting closes a simple deduplication bypass.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 447, + "text": "- **Reason/evidence:** a process can stop between ledger reservation, provider acceptance and local completion. The application can prove an old pending attempt never reached the provider, but cannot prove the same for sending. Real-SQLite two-owner tests prove classification, fresh-row preservation, notification isolation and repeat-run idempotency.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 476, + "text": "- **Decision:** Add one explicit send-attempt export record to both existing owner export surfaces. Include provider/request/status/provider-message/failure/timestamps, but omit the internal payload hash. Verify the existing job foreign-key cascade with real SQLite; leave complete identity/account deletion to SEC-009.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 507, + "text": "- **Reason/evidence:** unlink already existed in the per-job component but not the hub, creating inconsistent copies of the same workflow. The endpoint removes imported JobTracker correspondence for the owned job and returns the thread to review; it does not call Gmail deletion. UI confirmation and real-SQLite two-user tests pass.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 536, + "text": "- **Decision:** Add an owner-filtered, revisioned `EmailDraft` tied by cascade to an owned job, with explicit SQLite/MariaDB migration paths, but expose no draft API or UI until readable export and complete deletion implications are covered.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 537, + "text": "- **Reason/evidence:** refresh recovery needs server-side ownership, while browser storage and recruiter-message fields violate privacy/domain boundaries. A real-SQLite two-owner test proves isolation and job cascade; backend 625/625, model-current and dual-provider up/down SQL checks pass.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 539, + "text": "- **Consequences:** migration `20260810075206_AddEmailDrafts` is additive and reversible, but production must not expose drafts until export/deletion coverage and a bounded owner/job-validating API are verified. A full blank SQLite migration rehearsal remains blocked by the pre-existing JT-019 historical-chain defect, not this migration.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 557, + "text": "- **Reason/evidence:** refresh recovery must preserve work before send fields are complete, while provider/thread provenance must not silently change. Atomic revision predicates prevent last-write-wins loss; explicit owner clauses plus global filters deny foreign job and direct draft IDs in real SQLite tests.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 587, + "text": "- **Reason/evidence:** ordinary edits/refresh must preserve idempotency, while a provider-confirmed failure needs a deliberate recovery path. Pending/sending/uncertain/sent states cannot disprove delivery and must not rotate. Real-SQLite owner/stale/status tests and mocked UI pass.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 757, + "text": "- **Reason/evidence:** Identity-only deletion leaves owned rows, files, provider credentials, sessions and queued work behind. Cascades cannot coordinate filesystem failures or prevent an older backup from resurrecting the user. Real-SQLite tests prove two-owner isolation, safe quarantine failure, idempotence and restored-account replay.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/decisions.md", + "line": 797, + "text": "- **Reason/evidence:** `AiInteraction` is private, user-deletable history and covered only one feature, so deleting history reset plan usage while durable Strategy/CV calls were invisible. Real SQLite tests prove idempotence, tenant isolation, limits, history-independent totals, Strategy finalization, CV reservation, export/deletion handling and legacy backfill; fresh application startup reaches the new migration.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 53, + "text": "- Rebuilt the active developer/operator documentation around the actual Next.js 16/.NET 9 application, replaced CRA and `npm start` guidance, separated normal and Playwright ports, corrected React Router 7 and the SQLite/MariaDB provider matrix, removed the obsolete npm peer override, and verified the documented clean install, lint, test, build and locked-restore commands.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 54, + "text": "- Began the JT-019 schema-ownership retirement with an executable 49-table ownership partition and transferred the leaf `SystemEmailSettings` table from MariaDB-only startup DDL to an additive provider-aware migration. Fresh SQLite now receives the table; legacy rows are preserved and startup no longer creates it.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 62, + "text": "- Moved `GmailReviewDecisions` into a provider-aware migration, preserving existing SQLite decisions and closing the previously missing MariaDB table path.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 75, + "text": "- Added immutable submitted-application packages to the Job Workspace. Each append-only snapshot freezes the career-profile/CV source, rendered CV, cover letter, application material and SHA-256-identified copies of all attachments; history can be reviewed and preserved files downloaded without following mutable live references. Tenant filtering, account export/deletion, storage reconciliation, SQLite/MariaDB migrations and EN/NB UI are included.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 101, + "text": "- Playwright exposed duplicate React keys in the long Code-template CV despite passing its assertions. Read-only inspection of the disposable SQLite database proved every relational Career Profile child had been inserted twice: a newly visible profile could be read and legacy-backfilled before its child replacement completed. Profile snapshot/children/history saves are now atomic, malformed duplicate item/order keys are normalized, and race-affected stored rows resolve once on reads without destructive cleanup.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 109, + "text": "- Health/readiness split: Release build passed with 0 warnings/errors, the complete backend suite passed 736/736, and the focused Playwright probe passed 1/1 against a real disposable SQLite-backed API process.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 173, + "text": "- **Test status:** backend 736/736; frontend 64/64 suites and 272/272 tests; ESLint and TypeScript zero findings; AI sidecar 37/37 without warnings; Ollama benchmark harness 5/5 plus safe dry-run; optimized production build; EF model parity; SQLite/MariaDB migration scripts; blank/idempotent/populated SQLite migration-chain tests; fresh complete-chain SQLite application startup; disposable earlier-chain MariaDB 11.8 application startup; Docker Compose config; safe-failure deployment preflight; and Playwright 10/10. Supply-chain controls pass 3/3, the tracked tree is clean, and the generated CycloneDX SBOM contains 964 components. npm audit remains at zero. The final ownership migrations have generated MariaDB SQL but still need a current MariaDB runtime rehearsal; the parser image and container scan are pending because Docker Desktop's daemon is offline. Jest's slow/open-handle behavior remains recorded.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 176, + "text": "- **Known regressions:** None found by automated/local browser checks. Jest still needs `--forceExit` and reports its existing open-handle notice. Email-provider/send tests are fake/local only; real delivery is not claimed. Current MAIL browser evidence is 1280×720 only because the browser surface could not resize or perform native Tab traversal. Interrupted attempts are aged after 15 minutes and notified without retry; the five-minute scan is unmeasured on a large ledger. The direct clean EF-only SQLite defect and synchronous AI accounting gap are closed; migration/reconciler dual ownership remains architectural debt.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-progress.md", + "line": 189, + "text": "- `docs/verification/core-001-sqlite-provider-parity.md`", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 70, + "text": "| 14 | Repair the full historical migration chain | CORE-001, JT-019 | Locally complete for blank/idempotent/populated SQLite, EF-only-to-application startup, provider scripts and disposable MariaDB 11.8 fresh/restart. Production restore/rollout remains blocked. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 168, + "text": "- **Required tests:** fresh/legacy SQLite+MariaDB migration, collisions, two tenants/same email, last-credential guard, 2FA, mocked relink.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 173, + "text": "- **Evidence:** `docs/verification/sec-004-microsoft-identity.md`; focused auth 34/34; backend 507/507; frontend 152/152 and build; dual-provider SQL; disposable SQLite legacy/unique-index rehearsal.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 204, + "text": "- **Required tests:** registration/no-cookie transition; verify then login; enumeration-resistant resend; duplicate/latest/mismatched/expired/replayed pending email; username preservation; passwordless/provider users; SQLite and MariaDB migration paths.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 209, + "text": "- **Evidence:** `docs/verification/sec-005b-email-ownership.md`; focused backend 35/35; full backend 501/501; frontend 151/151 and build; SQLite upgrade and dual-provider migration scripts; isolated API 202/no-cookie and 403/no-cookie checks.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 281, + "text": "- **Evidence:** audit JT-009 inventory/design; `docs/verification/sec-009-account-lifecycle.md`; V-173/V-174/V-175/V-179. Owner-scoped generated storage, complete redacted readable ZIP, immediate lockout, transactional owner-isolated row/file/cache purge, retry, fail-closed tombstones and restored-backup replay pass real-SQLite, sidecar, focused API/UI, full backend/frontend, Compose, build and Chromium checks.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 285, + "text": "### CORE-001 — Restore default SQLite/MariaDB behavior parity", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 295, + "text": "- **Required browser verification:** SQLite Career/Application workspace after API tests.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 299, + "text": "- **Evidence:** audit runtime reproduction JT-003; `docs/verification/core-001-sqlite-provider-parity.md`; V-186; 3/3 real-provider query tests; 3/3 migration-chain tests; 680/680 backend regression; isolated fresh-SQLite owner/empty/non-owner HTTP matrix; disposable MariaDB 11.8 fresh/restart smoke.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 335, + "text": "- **Evidence:** audit JT-005 service inspection; `docs/verification/bg-001-tenant-workers.md`; real-SQLite two-owner worker suite with fake email/AI, exact fixed-clock threshold, fresh-instance restart idempotency and reminder/export deduplication; Compose validation; isolated default-off startup/health/no-export check.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 353, + "text": "- **Evidence:** `docs/verification/ops-001a-durable-operations.md`; 7/7 focused and 539/539 full backend tests; SQLite upgrade/down/up and fresh startup; dual-provider scripts.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 371, + "text": "- **Evidence:** `docs/verification/ops-001b-notifications.md`; 9/9 focused and 541/541 full backend tests; forced transaction rollback; SQLite upgrade/down/up; current model snapshot; generated SQLite/MariaDB up/down SQL.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 569, + "text": "- **Evidence:** `docs/verification/ai-004-cv-processing-queue.md`; `docs/verification/sec-006-parser-dependencies.md`; `docs/verification/sec-007-parser-isolation.md`; V-104–V-107/V-180/V-181/V-190/V-191; real SQLite synthetic integration proves 202/active deduplication/owner-scoped handler/retry provenance/notification/review gate, usage reservation and pre-claim cancellation/deadline synchronization; backend 719/719; parser 37/37.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/master-work-plan.md", + "line": 679, + "text": "- **Remaining work:** SEC-009 repository deletion coverage is complete but production activation remains gated; provider mailbox category capabilities require separately authorized scopes/re-consent and remain absent; browser/production verification remains. Server-side owner-filtered job choice search now reaches applications beyond the old first-page ceiling (V-183). Existing connections need explicit re-consent; IMAP remains read-only. No real email; uncertain sends need manual reconciliation. The clean full-chain SQLite rehearsal now passes (V-186).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/docs/work-programmes/session-handoff.md", + "line": 6, + "text": "- **Last completed step:** repaired and regression-tested the full historical migration chain for standalone SQLite tooling and provider-aware application startup, including a disposable MariaDB 11.8 fresh/restart rehearsal.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/pre-docs-cleanup-2026-09-11/job-tracker-ui/README.md", + "line": 27, + "text": "The Playwright harness uses port `3300` and starts its own isolated API and SQLite database. Do not point it at a development or production database.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/s06-acceptance-run.md", + "line": 31, + "text": "- If \"AUTH_TOKEN\" is missing and the API base is the default localhost dev target, the runner attempts a **local dev JWT fallback** using the checked-in dev JWT settings plus the local SQLite admin user so acceptance seeding can proceed without printing a token.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/security-assessments/M013-adversarial-security-assessment.md", + "line": 193, + "text": "This runtime could not prove the full cross-user exploit path because the active SQLite file is missing core domain tables (`Companies`, `JobApplications`, `RuleSettings`) and those requests fail before authorization behavior can be fully exercised.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/security-assessments/M013-adversarial-security-assessment.md", + "line": 270, + "text": "- Some cross-user raw-id probes were limited by the local runtime using an incomplete SQLite schema.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/security-assessments/M014-security-remediation-verification.md", + "line": 113, + "text": "- The local runtime still uses a partial SQLite schema for some domain tables, so broader cross-user raw-id authorization retests remain best treated as a separate follow-up pass in a fuller environment.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/security-assessments/M015-authorization-replay-report.md", + "line": 15, + "text": "A dedicated hostile-test SQLite database was created from the current EF model because the default development DB was missing core domain tables needed for real authorization probes.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/security-assessments/M015-authorization-replay-report.md", + "line": 19, + "text": "- clean SQLite DB under `.tmp/m015-fixture`", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/security-assessments/M015-hostile-fixture-setup.md", + "line": 9, + "text": "The default development SQLite database in `JobTrackerApi/jobtracker.db` is **not** a trustworthy authorization-test target:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/_archive/security-assessments/M015-hostile-fixture-setup.md", + "line": 17, + "text": "Use a dedicated clean SQLite fixture database created from the current EF model with `EnsureCreated()` semantics through a tiny helper program:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/architecture/overview.md", + "line": 11, + "text": " API --> DB[(SQLite or MariaDB/MySQL)]", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/architecture/overview.md", + "line": 28, + "text": "| Data | SQLite default; Pomelo MySQL/MariaDB provider for server deployments |", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "docs/audits/2026-09-07/break-jobjakt.mjs", + "line": 71, + "text": " Data__Root: dataRoot, Database__Provider: 'sqlite', ConnectionStrings__JobTracker: `Data Source=${path.join(dataRoot, 'jobtracker.db')}`,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/break-jobjakt.mjs", + "line": 219, + "text": " await writeFile(path.join(evidence, 'break-results.json'), JSON.stringify({ generatedAt: new Date().toISOString(), scope: 'isolated SQLite and local Chromium; synthetic data; outbound browser requests blocked', findings, consoleErrors, networkErrors, blockedExternalHosts: [...blockedExternalHosts], timings }, null, 2));", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/evidence/break-results.json", + "line": 3, + "text": " \"scope\": \"isolated SQLite and local Chromium; synthetic data; outbound browser requests blocked\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/BoundaryProbes.cs", + "line": 62, + "text": " var options = new DbContextOptionsBuilder().UseSqlite(connectionString).Options;", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/BoundaryProbes.cs", + "line": 88, + "text": " output.Add(new { probe = \"two preloaded real SQLite contexts\", current.Name, current.Version, historyVersions = versions });", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/BoundaryProbes.cs", + "line": 103, + "text": " services.AddDbContext(o => o.UseSqlite(connectionString).AddInterceptors(fault));", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b02-observations.json", + "line": 7, + "text": " \"fixtures\": \"Permanent Playwright API tests against actual API, Identity/session checks and isolated SQLite; synthetic accounts only\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b02-test-results.json", + "line": 5, + "text": " \"environment\": \"Windows, existing .NET 9 SDK and UI dependencies, synthetic local SQLite/browser fixtures, external providers disabled\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b03-test-results.json", + "line": 5, + "text": " \"environment\": \"Windows, existing .NET 9 SDK and UI dependencies; synthetic local SQLite/API/browser fixtures, external providers disabled\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b03-test-results.json", + "line": 144, + "text": " \"diagnosis\": \"Account-switch fixture raced B02's final redirect (test wait corrected); separate Code-PDF setup hit existing SQLite Error 5 database is locked in profile/Identity projection before rendering. No database or accessibility changes.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b03-test-results.json", + "line": 156, + "text": " \"notes\": \"All 17 pass with no retries/flaky outcomes. Real public and Code PDF renders approximately 1.3/1.4 seconds. This does not prove the existing SQLite projection race resolved.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b03-test-results.json", + "line": 202, + "text": " \"Existing standalone TypeScript R01a failure and observed SQLite profile-projection fixture race remain outside B03.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b04-observations.json", + "line": 4, + "text": " \"boundary\": \"Real local API, authentication, endpoint authorization, partitioned rate limiter, B02 middleware and synthetic SQLite data\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/b04-test-results.json", + "line": 6, + "text": " \"environment\": \"Windows, .NET 9 and existing UI dependencies; synthetic local SQLite/API/browser data; external providers disabled\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/evidence/boundary-results.json", + "line": 63, + "text": " \"probe\": \"two preloaded real SQLite contexts\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/audits/2026-09-07/validation/probes.mjs", + "line": 62, + "text": " Data__Root: data, Database__Provider: 'sqlite', ConnectionStrings__JobTracker: 'Data Source=' + path.join(data, 'jobtracker.db'),", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/configuration/environment-variables.md", + "line": 9, + "text": "| `DATABASE_PROVIDER` | Production | Compose/API | No | `sqlite` | `sqlite`, `mariadb`, or `mysql`; also selects the backup path. |", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "docs/configuration/environment-variables.md", + "line": 10, + "text": "| `JOBTRACKER_CONNECTION_STRING` | Conditional | API | Yes | — | Server database connection string; ignored for SQLite. |", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/configuration/environments.md", + "line": 5, + "text": "SQLite and localhost defaults are supported. Run the API on 5202 and the UI on 3000, or use the development Compose override. Use seeded development credentials only from local settings and never reuse them in production.", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "docs/database/README.md", + "line": 3, + "text": "EF Core owns the current schema and migrations. SQLite is the local default; MariaDB/MySQL is supported for server deployments.", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "docs/database/backups.md", + "line": 3, + "text": "SQLite backups use a consistent snapshot (`VACUUM INTO`) and are retained under the data root. The runtime also preserves data files, CV artifacts, exports, Data Protection keys, and account-deletion tombstones as separate recovery concerns. MariaDB/MySQL uses external database backup tooling rather than the SQLite job.", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "docs/database/migrations.md", + "line": 3, + "text": "The API applies EF Core migrations on startup and performs guarded legacy-schema reconciliation for SQLite and MariaDB/MySQL compatibility. Fresh and repeated disposable SQLite migration chains are the normal local verification; generated provider SQL is not proof of a live production migration.", + "classification": "obsolete", + "reason": "current_guidance" + }, + { + "file": "docs/database/migrations.md", + "line": 5, + "text": "SQLite startup explicitly enables write-ahead logging (WAL) before reconciliation opens the database file. This lets concurrent readers coexist with committed usage and preference writes; it changes journaling, not stored fields or ownership. MariaDB/MySQL initialization is unchanged. Use the existing `VACUUM INTO` backup runner for a consistent SQLite snapshot, including committed WAL contents; copying only a running database's `.db` file is insufficient. Disposable startup, held-reader/write and independent backup tests cover this boundary; they do not replace production restore qualification.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/infrastructure/2026-10-20-browser-seeder-portability.md", + "line": 5, + "text": "The three fixtures now invoke the configured `PLAYWRIGHT_PYTHON_PATH` directly, otherwise the platform's Python executable. The fixture arguments, isolated SQLite paths, owner checks, insert-only authorizer and assertions remain unchanged. No production data or application code is changed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/infrastructure/backups.md", + "line": 3, + "text": "A complete recovery set includes the database, uploaded/CV data, exports where needed, Data Protection keys, and account-deletion tombstones. SQLite has an application backup path; MariaDB/MySQL must use the external server backup path. Retention and remote encrypted-copy settings are configured through `BACKUP_*` variables.", + "classification": "required_historical_or_data_preservation", + "reason": "data_preservation" + }, + { + "file": "docs/redesign/audit/TEST_FILES.md", + "line": 103, + "text": "| Backend | [JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs:1](../../../JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs#L1) |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/audit/TEST_FILES.md", + "line": 104, + "text": "| Backend | [JobTrackerApi.Tests/SqliteMigrationHelperTests.cs:1](../../../JobTrackerApi.Tests/SqliteMigrationHelperTests.cs#L1) |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/audit/TEST_INVENTORY.md", + "line": 10, + "text": "| General browser | [Playwright config](../../../job-tracker-ui/playwright.config.ts): one Chromium project, isolated .NET API/SQLite data and local frontend; production static build supported | Chromium only; no actual Traefik/nginx; no cross-browser or screen-reader certification |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/audit/TEST_INVENTORY.md", + "line": 18, + "text": "| Backend | xUnit/Moq, SQLite/InMemory and HTTP test seams; API/service ownership, auth, parser, CV/history/PDF, queue, billing, export, migration and rate/proxy tests | Provider-host tests and fault/probe tests have separate runtime requirements; SQLite is not full MariaDB proof |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/BASELINE_DEFECTS.md", + "line": 5, + "text": "## P2-D01 — SQLite tailoring and submitted-package capture fail", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/BASELINE_DEFECTS.md", + "line": 7, + "text": "**Successor evidence:** [P5-08b readiness](../phase-5/p5-08b-readiness/README.md#native-preservation-invariants-and-proof) repairs the two native SQLite ordering paths and executes the formerly unreachable frozen-content, exact-file, ownership and native ZIP readback assertions. Its final validation records the expected-to-actual browser transition. The reproduction below is historical Phase 2 evidence and is preserved unchanged.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/BASELINE_DEFECTS.md", + "line": 19, + "text": "| API exception | `System.NotSupportedException: SQLite does not support expressions of type 'DateTimeOffset' in ORDER BY clauses.` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/BASELINE_DEFECTS.md", + "line": 21, + "text": "Stack evidence points to [ApplicationAssetsService](../../../JobTrackerApi/Services/ApplicationAssetsService.cs), `GetTailoringPlanAsync` (ordering verified CareerEvidence by UpdatedAtUtc at line 182), and [SubmittedApplicationPackageService](../../../JobTrackerApi/Services/SubmittedApplicationPackageService.cs), `CaptureAsync` (ordering variants by UpdatedAtUtc at line 67). These paths do not use the SQLite-safe ordering used in some nearby services. Existing [SqliteDateTimeOffsetCompatibilityTests](../../../JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs) exercise other ordering paths; they do not certify these two. Existing [SubmittedApplicationPackageTests](../../../JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs) prove snapshot/owner/failure contracts with test seams, not successful native SQLite execution of this query.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/PRESERVATION_MATRIX.md", + "line": 7, + "text": "**57/57 groups (100%) have mapped automated behavioral evidence for at least one core behavior.** This is group-level preservation coverage, not statement coverage, exhaustive sub-workflow coverage, visual parity or 100% readiness. Every row's remaining gaps are explicit. A passing mock/service test does not prove a real provider, actual browser persistence, or production. In particular W07 retains passing service/component evidence but its new native SQLite capture test is an **expected failure**, not successful end-to-end preservation proof. See [baseline defects](BASELINE_DEFECTS.md).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/PRESERVATION_MATRIX.md", + "line": 38, + "text": "| **PRES-W05** — Attach/select/create/tailor CV and source context | `Job CV section; builder deep link` | ApplicationCvSection/TailoringSection; ApplicationAssetsService | [F:application-assets][F:application-assets.test.tsx], [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:ApplicationAssets][B:ApplicationAssetsTests], [B:CvBuilder][B:CvBuilderTests]. Attach re-points only, detach keeps variant, foreign owner denied, tailoring never writes source; B02 API browser | P2-D01 SQLite tailoring ordering blocks successful real-browser guidance; actual attach→render relationship beyond existing service coverage | H | Yes — document relationships |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/PRESERVATION_MATRIX.md", + "line": 40, + "text": "| **PRES-W07** — Application drafts and immutable submitted package/archived binaries | `Job cover-letter drafts; CV section package history` | ApplicationPackageDraftsSection, SubmittedPackagesSection; package service/storage | [F:application-assets][F:application-assets.test.tsx], [F:application-drafts][F:application-drafts.test.ts]; [B:SubmittedApplicationPackage][B:SubmittedApplicationPackageTests], [B:JobApplicationsApplicationPackage][B:JobApplicationsApplicationPackageTests], [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests]. Drafts keep ordinary notes; service frozen document/hash/copy-failure/tenant assertions; NEW native browser capture oracle | P2-D01 expected failure: SQLite capture 500. NEW post-capture mutation/archive assertions are NOT reached. Require real storage/provider success before package restructuring | H | Yes — documents/submission |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/README.md", + "line": 32, + "text": "Fresh local execution uses installed .NET **9.0.317**, Node dependencies already locked in the checkout, Windows/Chromium and Playwright's disposable SQLite API. There were no production requests or provider credentials. Test fixtures use only synthetic accounts and local URLs.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/README.md", + "line": 54, + "text": "One initial rules-save 500 did not reproduce in the direct or repeated browser path; retained as observation P2-O01, not asserted as a diagnosed defect. The reproducible SQLite package/tailoring failure is recorded separately. No blanket skipping or gate bypass was added.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/TRACEABILITY.md", + "line": 15, + "text": "Job workspace readiness: [P5-08b native/navigation/accessibility proof](../phase-5/p5-08b-readiness/README.md#preservation-traceability-and-changed-files) supplements W01/W04–W08, C01/C05/C07/C10 and E07–E09 with real SQLite/ZIP and four native locale/theme navigation cases. Historical P2-D01 rows below retain the original expected-failure evidence; the successor owns the repair/results. Connor explicitly deferred absent `followMode` UI to the mail phase while preserving metadata; manual screen-reader acceptance remains open.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-2/TRACEABILITY.md", + "line": 62, + "text": "| W01, W05–W08 → source relationships and frozen submission | Same browser spec: fixture creates actual job/CV/letter/file; captures via legacy CV workspace entry | **Expected failure P2-D01:** capture fails on SQLite. Later source-mutation/archive checks not reached; do not mark this migration ready |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-3/DOCUMENTS_UX.md", + "line": 44, + "text": "P2-D01 blocks native SQLite package capture/tailoring. Existing mocked/service proofs are not successful archive-preservation evidence. Freeze/history presentation migration waits for its separate repair and actual unchanged HTML/letter/binary checks. A unified Documents page must not conceal that baseline defect.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-3/JOB_WORKSPACE.md", + "line": 54, + "text": "**P2-D01** blocks successful native SQLite tailoring/package capture; fix under its separate ticket before restructuring those sections. Keep its expected-failure oracle visible. F01 lost-update semantics remain separate from B02 identity and creation idempotency; no new autosave/conflict system in this plan.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-3/OPEN_DECISIONS.md", + "line": 60, + "text": "| API metadata implies native package success | P2-D01 capture/tailoring fails on SQLite; expected failure is not frozen-package proof |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-3/PRESERVATION_IMPACT_MATRIX.md", + "line": 106, + "text": "**57/57 groups mapped, zero approved removals.** This is 100% architecture traceability, not 100% automated workflow coverage or implementation readiness. Phase 2 contains explicit provider, production, accessibility, visual and native SQLite gaps. Preserve them until evidence closes them.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-3/README.md", + "line": 35, + "text": "- **Baseline defects / debt:** P2-D01 SQLite package/tailoring failure; F14 loaded accessibility; separate concurrency, idempotency, calendar and paid-lifecycle queues; failed remote CI browser runner; F04 runtime ingress evidence. Do not fix these incidentally or preserve their defective results as desired behavior.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-01/SCAN_RESULTS.json", + "line": 5, + "text": " \"expectedFailure\": \"P2-D01 native SQLite submitted-package capture\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-02/README.md", + "line": 47, + "text": "- New `e2e/named-controls-modal-state.spec.ts`: four representative real-API workflows, each covers commands, company failed-save draft, CV-only override/canonical isolation, inline AI parameter names, attachment purpose/rename/cancelled deletion, modal Tab/Shift+Tab/Escape/focus return. Synthetic non-admin accounts, isolated SQLite, browser outbound traffic blocked; only an explicit company PUT is replaced with 503. No real AI provider calls.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-02/README.md", + "line": 73, + "text": "Playwright's summary counts 40 expected outcomes as “40 passed.” The JSON report distinguishes **39 `passed → passed` and one `failed → failed`**. The latter is the unchanged SQLite native package-capture `DateTimeOffset` failure in `redesign-preservation.spec.ts`; it is not a successful package workflow. Of the 39 actual passes, **23 pre-P4-01 + 12 P4-01 + 4 P4-02**. No expected-failure annotation or baseline case was removed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-02/README.md", + "line": 137, + "text": "Final repository checks: `python scripts/supply-chain.py scan-secrets` passed with the P4-02 files staged; `git diff --check` and `git diff --cached --check` passed. A local Markdown target check covered 116 current/root documents (excluding preserved archive snapshots), with zero missing local targets. Logs, SQLite fixtures and test traces remain ignored under `.artifacts`/test output; only synthetic screenshots and curated axe findings are committed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-03/README.md", + "line": 125, + "text": "The ignored E2E type config extends the existing frontend tsconfig, includes only `e2e/builder-preview-keyboard.spec.ts`, disables incremental caching and resolves frontend Node types. No package, dependency, CI, infrastructure, backend, schema or theme change was needed. Logs, isolated SQLite data and authenticated browser traces remain ignored; committed screenshots contain only synthetic data.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-04/README.md", + "line": 38, + "text": "- Tests: new `src/page-layout.test.tsx`, one additional `src/settings-view.test.tsx` case and new `e2e/settings-page-layout.spec.ts`. The inherited `e2e/redesign-preservation.spec.ts` Settings case now explicitly awaits/asserts the notification PUT before its existing readback/reload checks; the separately discovered SQLite contention is documented below. Documentation: this record/evidence, Phase 4 index, Phase 2 trace link and active TODO status.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-04/README.md", + "line": 79, + "text": "- **P4-04-O02 — existing SQLite notification-save contention:** concurrent request evidence and investigation are recorded below. The backend and application save handler are unchanged. Do not claim concurrent preference writes/reads are reliable based on the sequential preservation fixture; investigate in a separate backend reliability ticket without folding it into P4-05.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-04/README.md", + "line": 107, + "text": "Playwright's list summary counts the expected failure as a successful test outcome. The JSON [SCAN_RESULTS.json](SCAN_RESULTS.json) explicitly records **47 `passed → passed` and one `failed → failed`**, not 48 successful workflows. P2-D01 still reaches the existing SQLite submitted-package failure; its historical-binary follow-on proof remains blocked.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-04/README.md", + "line": 129, + "text": "Repeating that unchanged fixture ten times with API console capture yielded **eight passes and two failures**. Both server failures were `DbUpdateException` with SQLite error 5, `database is locked`, through `UserStore.UpdateAsync` and [NotificationSettingsController.Put](../../../../JobTrackerApi/Controllers/NotificationSettingsController.cs). This controller, its Identity/database configuration and the Settings save handler are unchanged from `806eee4e`. The original trace is `.artifacts/p4-04-settings-failure-trace.zip`; the failing full run is preserved as `p4-04-browser-intermittent.json/.log`, and the repeated API diagnostics as `p4-04-settings-diagnostic.json/.log`. These synthetic traces/logs remain ignored rather than publishing session credentials.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-04/README.md", + "line": 135, + "text": "This correction isolates the intended sequential test; it does **not** repair or dismiss the backend contention. Further work must reproduce the concurrent API condition, identify the locking/transaction cause and verify a bounded backend solution. No schema, retry policy, SQLite mode or server synchronization change is included here. The original fixture is recoverable from `806eee4e:job-tracker-ui/e2e/redesign-preservation.spec.ts` for the same ten-repeat local probe.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-04/SCAN_RESULTS.json", + "line": 36, + "text": " \"diagnosticFinding\": \"P4-04-O02: the inherited Settings case exposed SQLite error 5 during overlapping read/write traffic. The sequential test now requires the PUT response before readback. Backend contention remains open; no failure suppression or new expected failure was added.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-05/README.md", + "line": 161, + "text": "- P2-D01 remains the documented submitted-package expected failure. P4-04-O02 SQLite contention, P4-04-O01 toast overlap, P4-03-D01 Tooltip contrast, earlier modal/command defects and CV margin/template rendering work remain separately scoped. The new axe states do not certify transient tooltip contrast; row-action screenshots can still show the inherited tooltip. No accessibility rule is disabled in the new scans.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-06/PRESERVATION_ACCEPTANCE.md", + "line": 34, + "text": "| **PRES-W05** — Attach/select/create/tailor CV and source context | Theme only | 01 | [F:application-assets][F:application-assets.test.tsx], [F:cv-builder-deep-link][F:cv-builder-deep-link.test.tsx]; [B:ApplicationAssets][B:ApplicationAssetsTests], [B:CvBuilder][B:CvBuilderTests]. Attach re-points only, detach keeps variant, foreign owner denied, tailoring never writes source; B02 API browser | P2 linked-CV setup/API assertions; successful SQLite tailoring unavailable. | P2-D01 SQLite tailoring ordering blocks successful real-browser guidance; actual attach→render relationship beyond existing service coverage **Gate:** P2-D01 native tailoring/capture success before relationship restructuring. | Conditional |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-06/PRESERVATION_ACCEPTANCE.md", + "line": 36, + "text": "| **PRES-W07** — Application drafts and immutable submitted package/archived binaries | Theme only | 01 | [F:application-assets][F:application-assets.test.tsx], [F:application-drafts][F:application-drafts.test.ts]; [B:SubmittedApplicationPackage][B:SubmittedApplicationPackageTests], [B:JobApplicationsApplicationPackage][B:JobApplicationsApplicationPackageTests], [B:JobApplicationsEndpointBehavior][B:JobApplicationsEndpointBehaviorTests]. Drafts keep ordinary notes; service frozen document/hash/copy-failure/tenant assertions; NEW native browser capture oracle | P2-D01 fails at native capture; archive assertions remain unreached. | P2-D01 expected failure: SQLite capture 500. NEW post-capture mutation/archive assertions are NOT reached. Require real storage/provider success before package restructuring **Gate:** P2-D01 native capture/archive success required; this workflow is NOT accepted end to end. | Conditional |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-06/README.md", + "line": 35, + "text": "P2-D01 remains the one expected browser failure: native SQLite submitted-package capture returns 500 after successful setup. **Later archived-binary assertions are not reached.** Service tests for immutable packages do not close that native gap. Source/history concurrency (F01/audit D01), session identity (B02) and creation-intent idempotency are separate contracts.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-06/README.md", + "line": 57, + "text": "| V4 `settings-page-layout` | Four theme/locale cases; one h1/named sections; 1920/1440/1024/768/767/390/320 reflow; long EN/NB heading, rule draft through resize; awaited native rule/notification saves, 503 retry, ZIP and account-link actions | No concurrent SQLite safety claim. Existing tab-unmount draft behavior retained. No paid deletion/restore/provider operation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-06/README.md", + "line": 72, + "text": "| P2-D01 native package/tailoring SQLite ordering | **Open**, unchanged expected failure, archive assertions unreached | Blocks package/tailoring/document-relationship restructuring; separately repair/prove native archive before affected migration |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-4/p4-06/README.md", + "line": 79, + "text": "| P4-04-O02 SQLite notification-save contention | **Open**, earlier 2/10 concurrent attempts failed; current fixtures await PUT before readback | Separate backend reliability owner; no claim that concurrent preferences are safe; does not require page primitive replacement |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/OPEN_BLOCKERS.md", + "line": 24, + "text": "| P4-04-O02 concurrent SQLite notification save | Open, earlier 2/10 native attempts HTTP 500 / database locked | **Separate backend reliability**; no shell/visual blocker with unchanged calls, but any increased polling/write concurrency waits for proof. Sequential passing test does not close it |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/OPEN_BLOCKERS.md", + "line": 27, + "text": "| P2-D01 native SQLite tailoring/capture | **Closed/passing** in [P5-08b readiness](p5-08b-readiness/README.md): frozen source/file readback plus real SQLite/account ZIP and copy-failure/retry proof | Ordinary regression retained in P5-08b; no expected-failure branch. CV revision/geometry and production restore remain separate |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/OPEN_BLOCKERS.md", + "line": 40, + "text": "| F19 missing provider/config falls back to SQLite | Open source carryover | **Separate startup/deployment safety**, not a UI redesign dependency; no backend provider change here |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/PRESERVATION_IMPACT.md", + "line": 62, + "text": "| **PRES-S03** — Rules/reminder/table/theme/language preferences and account links | Entry/control / 00, 01, 02; table prefs / 03, 04b | `/settings tabs/mobile selector`; SettingsView, RulesSettingsCard, theme/i18n; rules/notification/auth | Settings P4 primitives and independent saves retained; UI density local; table prefs/current theme handlers same. | [F:settings-view][F:settings-view.test.tsx]; [F:theme-state][F:theme-state.test.tsx]; [B:NotificationSettingsController][B:NotificationSettingsControllerTests]; [B:RulesEngineProspect][B:RulesEngineProspectTests] | VS-SETTINGS/JOBS; native saves/error, router preference lifetime tests; SQLite concurrent write issue remains separate. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/READINESS_GATES.md", + "line": 37, + "text": "Successor: [P5-08b readiness native proof](p5-08b-readiness/README.md#native-preservation-invariants-and-proof). Real SQLite capture, post-source-mutation frozen read/download, native account ZIP extraction/manifest, ownership denial and partial-copy failure/retry are now exercised. The paragraphs below retain the original failed prerequisite; final results and the intentional P2-D01 transition are owned by the successor record. This proof does not close CV revision or PDF geometry gates.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/READINESS_GATES.md", + "line": 39, + "text": "P2-D01 is reproduced SQLite `DateTimeOffset` ordering failure in `ApplicationAssetsService.GetTailoringPlanAsync` and `SubmittedApplicationPackageService.CaptureAsync`. Existing service tests do not prove native success. The browser expected-failure branch is entered only for the observed capture 500; its historical archive checks have not run successfully.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/VISUAL_ACCEPTANCE.md", + "line": 29, + "text": "| VS-SETTINGS — 00/01/15 control | Retained P4 reading width/long heading/section/actions; open rule draft, notification failure/Retry, open export toast | One h1/section hierarchy, retained independent saves, long heading wrap, connected-account link while toast open. Do not “fix” concurrent SQLite with fixture retries |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-00/README.md", + "line": 3, + "text": "Source checkpoint: `c325eb68c6f6f293be92ecbbbb09b705a7da5033`, branch `codex/ui-redesign-phase4`. Local verification: 2026-09-20–21, Windows, disposable API/SQLite and Chromium. The containing commit is discoverable with `git log -- docs/redesign/phase-5/p5-00`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-00/README.md", + "line": 168, + "text": "The original P5-00 checkpoint executed all 916 tests: 915 passed, one failed, none skipped. The follow-up prerequisite checkpoint changed only this test to pass the already existing `MutableTimeProvider(FixedNow)` to the worker. The rerun passed **916/916** in 19 seconds. Production code, rules and schedules are unchanged; no skip or expected-failure annotation was added. This is distinct from P2-D01, SQLite write contention and the remaining P5-00-D02 Jobs browser-Back focus debt.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-00/README.md", + "line": 175, + "text": "- P2-D01 remains the identified native SQLite package/tailoring expected failure. No archive success is claimed and its later assertions remain blocked.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-00/README.md", + "line": 176, + "text": "- P4-02-D02 company modal error feedback, D03 workspace progress scrolling, D04 literal AI context, P4-04-O02 SQLite contention, P4-05-O01 raw status/date localization remain separately scoped.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-00/RESULTS.json", + "line": 5, + "text": " \"environment\": \"Windows; Chromium; prebuilt static frontend and real disposable Development API/SQLite. No production verification.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-01/README.md", + "line": 3, + "text": "Source checkpoint: `38cf37e`, branch `codex/ui-redesign-phase4`. Validated locally on Windows with the disposable API/SQLite and Chromium environment. The containing checkpoint is discoverable with `git log -- docs/redesign/phase-5/p5-01`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-01/README.md", + "line": 91, + "text": "- **SQLite write contention remains open (P4-04-O02):** one complete browser run returned 500 while test setup created a company and a Free user and published a CV. The failures occurred on three different existing API writes, outside the grouped-shell code. The CSV case passed ten isolated repeats; API setup now authenticates through the existing API before rendering a Dashboard with concurrent background reads/writes. This narrows the browser fixtures to the workflows they actually assert; it does not claim server-side concurrent writes are safe or close P4-04-O02. A separate ten-repeat Free-user probe exposed two navigation aborts when clearing cookies on a live signed-in page; API setup also removes that test-only race. The failed full-run traces remain in ignored local artifacts and are not represented as passes.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-02/README.md", + "line": 45, + "text": "- P4-04-O02 SQLite concurrent-write contention remains a separate backend reliability defect. P5-02 adds no polling or writes; browser probes use local synthetic accounts and no external provider.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-03/README.md", + "line": 32, + "text": "P5-00-D02 Browser Back focus and P4-05-O01 table display-localisation debt are closed for the tested Jobs/Trash boundary; Table/Board parity remains for P5-04b. Automated axe results are not manual screen-reader proof. P5-02-D01 remains an explicitly open command/notification spoken-name and live-announcement acceptance item for P5-15. P2-D01 remains an expected native-package browser failure, and F04 remains open pending production ingress evidence. SQLite contention, CV rendering fidelity and other separately owned debt are unchanged.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-04a/README.md", + "line": 49, + "text": "P5-02-D01 manual screen-reader spoken-name/live-announcement acceptance remains open for P5-15; Board axe/keyboard checks do not close it. P2-D01 remains the documented expected native-package browser failure. F04 remains open pending production ingress evidence. SQLite contention, CV rendering fidelity and other separately owned debt are unchanged. Touch-specific native HTML drag is not claimed from desktop automation; the visible status action and keyboard move remain available alternatives on narrow screens.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-04b-readiness/README.md", + "line": 37, + "text": "The shared read also obtains the cached account rule settings and latest-correspondence dictionary; on a warm settings cache it executes the correspondence aggregate plus the result query (Table additionally counts). One successful Board mutation costs one PATCH plus one GET; failed refresh Retry is one GET. API cancellation tokens still reach EF operations, and existing authentication/rate controls are unchanged. There is no dedicated Board result-size or account-job-count cap to rely on. The 62-owned-row SQLite corpus proves multi-page completeness, not a production capacity benchmark. No new full-dataset browser cache or persistent preferences are introduced.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-04b-readiness/README.md", + "line": 43, + "text": "| PRES-J05 | Table search/filter/sort/page/saved query → identical Board membership, unchanged Table pages | Native SQLite membership and browser query cases |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-04b-readiness/README.md", + "line": 65, + "text": "`JobQueryParityTests` runs 16 native SQLite cases with 62 owned jobs plus a foreign owner's job: unfiltered, search, notes, correspondence, standard status, custom status, combined search/status, no results, company, foreign company, location, follow-up, needs-work, interview, deleted-only and include-deleted. Each compares the ordered Board IDs against every Table page, asserts no duplicates or foreign IDs, verifies nonempty positive cases and relevant exact counts, and preserves readiness validation. Tied dates span more than four Table pages; ordinary Table pages remain at most 15.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-06/README.md", + "line": 72, + "text": "The first full browser attempt also received one generic 500 from the unchanged native language-preference endpoint during concurrent Dashboard/setup reads immediately after Browser Back. Trace confirmed the response/status and overlapping reads, but supplied no underlying exception: SQLite contention is a hypothesis, **not a proven root cause**. Visual fixture preparation now configures the native preference before mounting the next Dashboard (blank document → existing preference PUT requiring 204 → Dashboard). No retry, mocked successful preference response, weaker assertion or application/backend repair was introduced. This proves native configured locale rendering, not acceptance of concurrent language writes during loading. That unchanged endpoint's intermittent 500 remains a separate baseline observation pending diagnosis; final full-suite results must be reported separately from this initial failure.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-06/README.md", + "line": 105, + "text": "- F04 production ingress, P2-D01 native package failure, P5-02 manual screen-reader acceptance, incomplete accessibility checks, Board native touch/full-result scaling, CV revision/rendering gates and unrelated SQLite/toast debt remain open. No production readiness or backend metric/timezone repair is claimed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08a/evidence/visual-manifest.json", + "line": 3, + "text": " \"captureRuntime\": \"Chromium, production export, disposable SQLite API; actual clock 2026-10-06; explicit fixture dates are synthetic\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "line": 28, + "text": "- **P2-D01:** the original native browser case reproduced capture HTTP 500 with expected status `failed`; later archive assertions were unreachable. A new real-SQLite regression failed with `NotSupportedException: SQLite does not support expressions of type 'DateTimeOffset' in ORDER BY clauses` at `GetTailoringPlanAsync`. Capture had the same unsupported variant ordering. Reuse the already established provider branch in `BuildCvAsync`: filter by authenticated owner/job in SQL, order materialized owner-filtered values only on SQLite; retain SQL ordering for other providers. No timestamp conversion, schema or package-content change.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "line": 41, + "text": "5. The new backend native test uses SQLite, real `CareerProfileService`, `CvVariantService`, `ThemedCvRenderer`, `AttachmentStorage`, `AccountOwnedFileInventory` and `AccountDataExportService`. Reopen the real ZIP; compare frozen HTML/letter/material/source identity/profile/purpose and exact attachment bytes. Match the manifest SHA-256. Only current-user/host setup is mocked; packaging/rendering/storage are not.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "line": 62, + "text": "| W05/W06/W07, C01/C05/C07/C10 relationships | Canonical versus variant, letter/answer and frozen evidence → provider-compatible native capture; no domain redesign | Native SQLite/archive/failure-retry tests and expanded real browser immutable-package case |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "line": 74, + "text": "| `C:/Users/Connor/.dotnet/dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj -c Release --no-restore --logger 'console;verbosity=minimal'` | **936 passed**, 0 failed/skipped; +2 native SQLite/package/ZIP and sparse/failure/retry cases |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "line": 91, + "text": "The two added backend tests are `Tailoring_and_submission_capture_work_on_native_sqlite` and `Native_sparse_capture_and_missing_attachment_retry_never_publish_partial_packages`. Four new browser cases cover EN/NB × light/dark. The original P2-D01 case is retained by name with ordinary capture/readback assertions; its old expected-failure branch is removed only after the initial native 500 was reproduced and successful post-fix preservation was observed. **P2-D01 is closed for the reproduced local SQLite failure.** Counts change from 83 actual + one expected to 88 actual: +4 new cases, +1 genuinely passing original case. No skipped/expected branch masks capture, frozen readback or archive failures.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "line": 112, + "text": "`followMode` compose-mode activation is not demonstrated and is explicitly deferred by Connor to the mail phase. Package version/revision concurrency is not redesigned here; source lost-update guards and CV geometry remain separate gates. SQLite evidence ordering materializes the same owner-filtered set already used by subsequent relevance filtering; no global/unscoped load is introduced. MariaDB query translation is tested, not a live production database.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/README.md", + "line": 114, + "text": "Keep F04, P5-02 manual screen-reader acceptance, incomplete/manual accessibility checks, preference-save 500/SQLite contention, Board scaling/native touch, shared-dialog focus observations and CV revision/rendering debt open. P2-D01 closes with the successful native post-capture proof and final ordinary browser case, not by hiding its old expected failure. Historical audit/Phase 2/P4 records remain untouched except for explicit successor links; the Phase 3 route plan has an explicit successor clarification for Connor's approved metadata deferral.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b-readiness/evidence/visual-manifest.json", + "line": 3, + "text": " \"runtime\": \"Chromium production export and disposable local SQLite API, 2026-10-07\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b/README.md", + "line": 7, + "text": "The [readiness proof](../p5-08b-readiness/README.md) established native SQLite/ZIP contents, immutable readback after live-source mutation/deletion, attachments/ownership, numeric helper compatibility, history/query retention and scoped accessibility. P2-D01 is a genuine passing regression from that checkpoint.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b/README.md", + "line": 92, + "text": "| `C:/Users/Connor/.dotnet/dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj -c Release --no-restore --logger 'console;verbosity=minimal'` | 936 passed, 0 failed/skipped; unchanged count and native SQLite/ZIP proof retained |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b/README.md", + "line": 142, + "text": "F04 production ingress evidence remains open. Human screen-reader spoken names/live-state acceptance remains open for P5-15, separate from automated keyboard/axe. Native Board touch, Board full-result scaling, Dashboard preference-save 500/SQLite contention, P5-07/shared-confirmation focus timing and incomplete accessibility/manual checks are not silently closed. The pre-existing attachment-preview dialog's Download path still constructs ID 0; the ordinary table/archive download paths are separate and unchanged. Record that existing defect for the later attachment owner rather than repair it in this section migration. `followMode` mode-specific UI is deferred to mail work. P2-D01 is **closed/passing**, not open debt.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-08b/evidence/visual-manifest.json", + "line": 3, + "text": " \"runtime\": \"Chromium production export, disposable local SQLite API, 2026-10-07\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-09-readiness/README.md", + "line": 46, + "text": "Section order/visibility and every document setting are stored in the same versioned JSON. The SQLite revision fixture restores that exact JSON, checks hidden/order/template/margin/density/override state, edits again and checks both older rows remain unchanged. Generated PDFs are derived exports; current preview/export geometry is a separate failed gate, not proof of corrupt settings history.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-09-readiness/README.md", + "line": 127, + "text": "| C01/C02, C07 | Canonical source versus lens/reset → no source writes | New SQLite source/update/reset/history fixture; existing resolver/item/section/profile tests; native corpus compares source before/after |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-09-readiness/README.md", + "line": 130, + "text": "| C12, E05 | Private/public export and owner/session boundary → no bypass | Existing public/private PDF and account-isolation cases; new SQLite foreign history/save/restore case, concurrent same-account API test; rate/ingress/PDF suites retained |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-09-readiness/README.md", + "line": 137, + "text": "New backend cases live in `CvRevisionReadinessTests`: stale save and stale restore with independently tracked SQLite contexts (2), stale fresh request (1), source/lens/history/reset/settings (1), foreign ownership (1). The relational token test checks the winning revision and exact history count after failure, rather than accepting a rejection with partial persistence.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-09-readiness/evidence/visual-manifest.json", + "line": 3, + "text": " \"runtime\": \"local Windows / Chromium 151 / real CLI PDF / disposable SQLite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 125, + "text": "| Existing section/editor Jest tests; new `ai-tests/cv-ai-readiness.spec.ts`, `playwright.cv-ai.config.ts`, `scripts/cv-ai-provider-fixture.mjs` | Behavioral client proof and isolated real HTTP/auth/SQLite/provider-transport proof; no production provider or normal browser-harness configuration change |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 139, + "text": "| **PRES-C01** | Canonical Career Profile isolation and freshness → read-only owner source, full persisted-source fingerprint, no profile writes → SQLite and real HTTP canonical/history readback, source-change conflict |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 141, + "text": "| **PRES-C07** | Scoped overrides, custom/omitted content and unrelated settings retained → typed target and known-block-only application → omitted/whole-document SQLite tests, section/editor Jest |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 168, + "text": "[Parser/corpus tests](../../../../JobTrackerApi.Tests/CvAiGroundingTests.cs), [private-service tests](../../../../JobTrackerApi.Tests/CvAiEvaluationTests.cs), [usage-gate tests](../../../../JobTrackerApi.Tests/MeteredSummarizerServiceTests.cs), [native SQLite suggestion tests](../../../../JobTrackerApi.Tests/CvAiReadinessTests.cs) and [mocked sidecar tests](../../../../tools/summarizer/tests/test_cv_grounding.py) separate contract enforcement, ownership/freshness, persistence, limits and privacy routing. Local evaluator artifacts are under [`.artifacts/p5-13-grounding-backend`](../../../../.artifacts/p5-13-grounding-backend/evaluator.log). Final root validation will record its exact revision, complete baseline, counts and any additional evidence below.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 178, + "text": "| Rejected/unknown/unavailable/tampered/edited unsupported output creates no content revision | Native SQLite unchanged-state assertions; HTTP readback; section/editor reject/error/late-result regressions |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 179, + "text": "| Accepted result uses ordinary version/history and stays in the CV | Native SQLite and HTTP version increment, `ai:` history and unchanged canonical/history readback; editor queue/undo tests |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 185, + "text": "The permanent isolated suite runs the actual Release API against a disposable SQLite database with normal cookie authentication, CSRF, session-context and Pro authorization. The loopback Node fixture implements only synthetic rewrite/review responses through the real private-service HTTP transport. It is a test provider, not a configured production model. The single case exercises section and typed whole-document generation/acceptance, foreign-owner rejection, fabricated output rejection and CV/canonical freshness conflicts, reading variant/history/profile/history after each boundary. It records five rewrite and five assessment requests; no external service is called.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 199, + "text": "| Isolated real HTTP contract | **1/1**, actual authenticated API/SQLite/private transport with synthetic provider; not a Chromium or live-model factuality case |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 207, + "text": "Backend growth is **941 → 1,021 (+80)**: 45 new grounding/corpus/schema/scope cases, 27 new suggestion/SQLite/controller cases, five private evaluation/typed-format cases, two metering cases and one Pro policy case. Frontend growth is **440 → 455 (+15)**: eight added section-assistant cases and seven editor integration cases. The previous focused section/editor baseline of 40 becomes 55. No inherited case was removed. Sidecar growth is **37 → 49 (+12)**: eight review-boundary cases and four typed-format cases. The separate native HTTP proof adds one integration case; it does not inflate the inherited 112 Chromium count. P2-D01 remains an ordinary passing case and is not an expected failure or open debt.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-readiness/README.md", + "line": 279, + "text": "**CONDITIONAL GO for P5-13, subject to configured-model semantic qualification.** The authoritative owner/source/version/assessment/capability boundary is implemented; recognized unsupported/unknown/mixed output and stale acceptance fail closed. The deterministic contract corpus, real SQLite writes and real HTTP integration establish those boundaries. They do not establish that the configured model correctly recognizes every unsupported factual assertion.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-13-semantic-qualification/README.md", + "line": 218, + "text": "| Deterministic API/SQLite/source/history checks | Passing; separate from model accuracy |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/EXECUTION_PLAN.md", + "line": 19, + "text": "| **P5-15-04 Debt triage and bounded remediation** | 01–03 findings and [debt register](READINESS_DEBT.md) reviewed; exact defect reproduced or explicitly NOT VERIFIED | Prioritize preference-save/SQLite failure, modal feedback and shared-dialog/command focus by actual impact. Record API exception/DB provider/concurrency, draft/readback, repeat rates and negative ownership; no sleep/retry masking. Core baseline after code changes | Every item has A/B/C/D classification, severity, scope/owner and evidence-based disposition. A known failure cannot become harmless by non-recurrence. Backend/product changes beyond acceptance need separate scope decision | **One completed logical fix per push**, then audit-ledger reconciliation. No giant debt-cleanup commit; P5-13, B07, new workflows and unrelated backend repairs stay excluded |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/MANUAL_ACCEPTANCE.md", + "line": 86, + "text": "2. Save notification preferences; wait for the actual PUT response before readback, then separately reproduce overlapping reads/writes in an authorized disposable API probe. A 500 is a failure, not a retry-success pass. The known SQLite error-5 contention remains open even if the sequential human flow succeeds.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md", + "line": 38, + "text": "The [bounded Rules draft repair](p5-15-01/rules-draft-repair/README.md) supersedes SETTINGS-01 only. Its genuine SQLite14→5→tab-return5/no-write, atomic Save/readback, validation/error/retry/discard and account-disposal evidence changes **PRES-S03 FAIL→PARTIAL**. Other Settings notification/language reliability, historical Rules500 and human/provider checks remain open; no whole group earns PASS.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md", + "line": 44, + "text": "The [bounded saved-search repair](p5-15-01/saved-search-repair/README.md) supersedes only DISCOVERY-01. Its native SQLite listing, persistence, owner denials and localized error/retry proof change **PRES-J02 from FAIL to PARTIAL**. Scheduler delivery, live providers and human/device checks remain unverified; no entire group is promoted to PASS.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md", + "line": 87, + "text": "| **PRES-J02** — Saved searches, run/delete/alerts, result changes/dismissal | `/discover`; [saved-search/alert controls](../../../../job-tracker-ui/src/views/JobDiscoveryPage.tsx). Entry only in [P5-01](../p5-01/README.md); saved discovery run/alert semantics retained; R-01 repairs list loading and feedback. | [F:job-discovery](../../../../job-tracker-ui/src/job-discovery.test.tsx); [B:SavedJobSearchAlert](../../../../JobTrackerApi.Tests/SavedJobSearchAlertTests.cs); [B:JobDiscoveryController](../../../../JobTrackerApi.Tests/JobDiscoveryControllerTests.cs) | [Inherited P4 visual/manual limits](../../phase-4/p4-06/PRESERVATION_ACCEPTANCE.md); [P5-01 moved entry](../p5-01/README.md). No dedicated full-group current EN/NB responsive sign-off. | **PARTIAL** | **FAIL**; [01 evidence](p5-15-01/PRES_RESULTS.md) | **PARTIAL**; [R-01 native proof](p5-15-01/saved-search-repair/README.md); [SQLite10cases](../../../../JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs) | **PARTIAL**; [R-01 native proof](p5-15-01/saved-search-repair/README.md); [SQLite10cases](../../../../JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs) | **PARTIAL**; [R-03 scoped return-boundary proof](p5-15-01/analytics-auth-repair/evidence/auth-proof.json); fresh full regression GREEN | **PARTIAL**; [02 audit](p5-15-02/README.md), [findings](p5-15-02/DEFECTS.md); human/device and complete-group acceptance remain open | **PARTIAL**; no new demonstrated failure in the bounded repairs; existing manual/provider/complete-group evidence requirements retained | DISCOVERY-01 SQLite listing and suppressed error are repaired; native create/reload/apply UI, pause/resume/delete and owner denial have bounded proof. Provider-dependent browser output is intercepted; real SQLite runner uses a deterministic service. Scheduler-to-notification delivery, mobile delete confirmation, live MariaDB/PostgreSQL and human screen reader remain unverified. | Discovery/notifications owner; M — audit saved search delete/pause/run, mobile confirmation and scheduler-to-owned-notification chain. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md", + "line": 102, + "text": "| **PRES-W07** — Application drafts and immutable submitted package/archived binaries | Job Application/Answers/Submission and Documents; [drafts/submitted packages](../../../../job-tracker-ui/src/components/ApplicationAssets.tsx). Existing drafts/frozen submission/archive owners recomposed by [P5-08b](../p5-08b/README.md); [native SQLite/archive/ZIP proof](../p5-08b-readiness/README.md) retained. | [F:application-assets](../../../../job-tracker-ui/src/application-assets.test.tsx); [F:application-drafts](../../../../job-tracker-ui/src/application-drafts.test.ts); [B:SubmittedApplicationPackage](../../../../JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs); [B:JobApplicationsApplicationPackage](../../../../JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs) | [Seven sections EN/NB × light/dark desktop/phone](../p5-08b/README.md); [native readiness/manual limits](../p5-08b-readiness/README.md). Human AT/provider gaps retained. | **PARTIAL** | **PARTIAL**; [01 evidence](p5-15-01/PRES_RESULTS.md) | **PARTIAL**; [01 evidence](p5-15-01/PRES_RESULTS.md) | **PARTIAL**; [01 evidence](p5-15-01/PRES_RESULTS.md) | **PARTIAL**; [01 evidence](p5-15-01/PRES_RESULTS.md) | **PARTIAL**; [02 audit](p5-15-02/README.md), [findings](p5-15-02/DEFECTS.md); human/device and complete-group acceptance remain open | **PARTIAL**; no new demonstrated failure in the bounded repairs; existing manual/provider/complete-group evidence requirements retained | Earlier P2-D01 capture expected failure is superseded by ordinary native passing evidence. Production restore/rollback and all storage/provider combinations remain unverified; capture is not external send. | Workspace/storage owner; H — retain native capture→source mutation→archive/ZIP immutable-byte regression; release owner proves restore/rollback independently. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md", + "line": 137, + "text": "- **Native package/tailoring:** Phase 2/Phase 3/P4 rows retain the historical P2-D01 expected failure. [P5-08b readiness](../p5-08b-readiness/README.md), ordinary native [preservation regression](../../../../job-tracker-ui/e2e/redesign-preservation.spec.ts) and [P5-14](../p5-14/README.md) supersede it with recorded passing SQLite capture/tailoring, source-mutation/archive/ZIP/binary proof. Do not report P2-D01 as a current expected failure. Actual production restore/storage/provider acceptance remains NOT VERIFIED.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/PRESERVATION_ACCEPTANCE.md", + "line": 140, + "text": "- **Dashboard preference-save 500:** P5-06-O01 is an observed generic **language** preference response while Dashboard/setup reads overlap; the five Dashboard visibility flags are owner-local storage in [DashboardView](../../../../job-tracker-ui/src/components/DashboardView.tsx). Root cause is unknown. This is open reliability evidence, not proof that every Dashboard toggle fails. P4-04-O02 notification concurrency is a separate recorded SQLite failure. Neither is cleared by sequencing a passing fixture.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/READINESS_DEBT.md", + "line": 41, + "text": "| **RD03 current configuration/provider/schema/startup — UNVERIFIED; F19 OPEN.** `Program.cs` defaults missing provider to SQLite and changes missing connection to SQLite. Candidate adds no DDL migration, but startup still migrates/reconciles; actual provider/schema/counts are unknown. | **A**; **D** for unrelated local UI | Deployment/database owner; pre-release runtime/schema inspection | Verify non-secret effective provider/origin/auth/ingress/gates, secret presence/custody privately, schema and `__EFMigrationsHistory`, before/after counts on restored current data. Missing server connection must not be accepted as an empty fallback database. Repair F19 only in separately scoped backend work if necessary. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/READINESS_DEBT.md", + "line": 50, + "text": "| **RD12 P4-04-O02 notification-setting contention — OPEN.** Native PUT `/api/notification-settings` through `UserManager.UpdateAsync` produced SQLite error 5/DB locked in **2/10**; readback retained old value. Settings currently retains draft and in-page error; sequential success is not a contention fix. | **B** for complete affected settings reliability; **A** if intended deployed provider reproduces; **D** for unchanged independent UI | Backend/identity owner; scoped concurrent API reproduction before more polling/writes | Trace exact locking/transaction/provider cause and bounded fix, concurrent success/failure/draft/retry/readback evidence on real disposable DB. Never treat GET 200 as PUT success or hide a 500 with generic retries. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/READINESS_DEBT.md", + "line": 72, + "text": "- [I18nProvider](../../../../job-tracker-ui/src/i18n/I18nProvider.tsx) `setLanguage` calls `applyLanguage` (React state, local storage and document language), then PUTs `/auth/preferences/language` with `.catch(() => undefined)`. [AuthController](../../../../JobTrackerApi/Controllers/AuthController.cs) reads the current user, validates EN/NB, mutates `UiLanguage` and calls `UserManager.UpdateAsync`; ordinary unsuccessful Identity results become 400. The recorded generic 500 can therefore be an exception, but the trace does not prove which one. An exception through the same Identity store as notifications is a hypothesis, **not** a confirmed SQLite root cause.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/READINESS_DEBT.md", + "line": 73, + "text": "- [NotificationSettingsController](../../../../JobTrackerApi/Controllers/NotificationSettingsController.cs) reads/mutates the current Identity user and calls `UpdateAsync`; an unsuccessful result returns 500, and prior diagnostic exceptions are specifically SQLite error 5 through `UserStore.UpdateAsync`. [SettingsView](../../../../job-tracker-ui/src/components/SettingsView.tsx) preserves the draft and sets an in-page error on failed PUT. Waiting for PUT before polling readback protects sequential fixture correctness; it does not repair concurrent server locking.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/READINESS_DEBT.md", + "line": 134, + "text": " Choose the actual MariaDB dump or SQLite archive, not the illustrative filenames above. Keep archive names/contents private if they identify users. **Exit:** verified manifest includes complete required artifacts and keys; gzip/schema/trailer checks are merely format proof, not restore proof.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/READINESS_DEBT.md", + "line": 143, + "text": " This example applies to MariaDB/MySQL only. SQLite uses the documented archive/backup path; choose the actual provider's isolated restore, preserving side files/keys. File/tombstone restore paths must be explicitly reviewed against the isolated target; this plan invents no volume names or destructive extraction command. **Exit:** actual restorable app/key/deletion semantics, not merely equal DB counts.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/README.md", + "line": 48, + "text": "[Saved-search repair and evidence](p5-15-01/saved-search-repair/README.md) resolves the native SQLite GET500 and hidden error. PRES-J02 moves FAIL→PARTIAL; totals at R-01 were **0PASS/54PARTIAL/2FAIL/1DEFERRED/0BLOCKED/0NOT VERIFIED**. The01 audit remains historical below. AUTH-01 Analytics query loss and SETTINGS-01 Rules draft loss remained open/failing at R-01; no automatic P2 repair or P5-15-02 progression was authorized. Production remains NO-GO; `main` is unchanged. P5-13 stays deferred/unqualified/Production-withheld with0/366calls,0human reviews and no review UI.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/README.md", + "line": 57, + "text": "Exact PRES totals at the01 audit: **0PASS /53PARTIAL /3FAIL /1DEFERRED /0BLOCKED /0NOT VERIFIED =57**. FAIL:E02 sign-in return query loss;J02 saved-search SQLite read500/silent empty list;S03 unsaved Rules draft loss on tab change. These were native failures at that checkpoint, not56 assumed defects or an assertion that the audit introduced them. R-01 supersedes J02; R-02 supersedes S03 for its verified bounded scope. Other groups retain evidenced sub-behaviors plus explicit long-tail/human/provider gaps.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/README.md", + "line": 141, + "text": "Preference-save HTTP 500, SQLite concurrent saves, silent language-save failure, company-modal inaccessible feedback and dialog/command focus observations need bounded impact/root-cause investigation; this plan does not close them after a successful rerun. Board scaling/native touch, calendar/DST, startup fallback/worker containment, billing/deletion/provider delivery and all other recorded debt retain their specific enablement/release boundaries. P2-D01 is **closed/ordinary passing**. Tested shell/tooltip/toast/nested drag fixes remain scoped closures, never universal certification.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/SLICE_INVENTORY.md", + "line": 35, + "text": "| **P5-08b readiness — PASS** | `acd1d94684fe44906005d5e245530bc7c96d28a9` | Native SQLite capture/ZIP/attachment ownership, frozen readback after source changes/deletion, route/history/query/numeric helper and navigation readiness. **P2-D01 becomes an ordinary passing regression.** `followMode` UI remains deferred. [Record](../p5-08b-readiness/README.md). |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 7, + "text": "**Historical R-01 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 remained P2/OPEN at R-01; reproduced open counts wereP0=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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 13, + "text": "## P5-15-01-DISCOVERY-01 — Saved-search listing fails on SQLite", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 15, + "text": "**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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 21, + "text": "| Reproduce | Use the ordinary Playwright disposable Development/SQLite server; log in with a synthetic normal or admin account; open `/discover`; observe the genuine saved-search GET. The added native route census asserts success and retains the failure |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 23, + "text": "| Root cause | Current `ListSavedSearches` orders unconverted `DateTimeOffset UpdatedAtUtc`. Installed EF Core SQLite rejects that `ORDER BY` during translation. An ignored translation-only harness reproduces the exact exception with the database connection **Closed** |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 24, + "text": "| Coverage gap | Existing discovery/saved-alert controller tests pass using EF InMemory; existing SQLite compatibility cases do not cover this query. The responsive discovery browser fixture substitutes search/import responses and does not prove saved-search persistence |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 28, + "text": "| Required regression | Real disposable SQLite: empty list; two dated owned searches plus foreign search; exact descending owned IDs/counts; native normal/admin entry+refresh; prove no provider call. Verify deployed provider separately |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/DEFECTS.md", + "line": 74, + "text": "| Language/notification preference writes | Three native overlap rounds succeeded, including six writes, twelve concurrent reads, persisted readback and reload. Historical language PUT500 and notification SQLite/concurrency failures remain open; **not reproduced in this bounded run** is not fixed. No cause for the historical language500 is established; overlapping Identity writes remain a hypothesis |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md", + "line": 9, + "text": "**Historical R-01 successor:** [saved-search repair](saved-search-repair/README.md) verifies the native SQLite/list feedback repair. J02 becomes PARTIAL in R-01; its57 totals are54PARTIAL/2FAIL/1DEFERRED in the retained [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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md", + "line": 19, + "text": "**Fresh backend/frontend execution:** [backend summary](evidence/backend-summary.json) records 1,023/1,023 backend cases, 108/108 focused AI and 5/5 revision subsets (included within 1,023), offline sidecar 49/49, configuration helpers 3/3, supply-chain helpers 3/3, offline evaluation helpers 5/5 and extension parser 3/3; zero failures/skips. API/test Release builds passed with zero warnings/errors. [Frontend/static summary](evidence/frontend-summary.json) records 459/459 tests across 82/82 suites, zero failed/pending/todo cases, success true; app TypeScript, complete current E2E/AI plus diagnostic TypeScript, lint and production build exited zero. Both runs used unchanged application source from the audit checkpoint. Backend runtime is Windows/.NET SDK 9.0.317, host 9.0.19; deterministic fixtures and disposable SQLite/files. Run dates, commands, counts/hashes and provider limitations are in those portable summaries.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md", + "line": 41, + "text": "| **PRES-J02** — Named saved searches, run/delete, automatic alert preference, new/updated results and dismissal
Original contract: `JobDiscoveryPage`, saved-search APIs; retain owner scope and alert metadata | `GET/POST/PATCH/DELETE /api/job-discovery/saved-searches`;
`POST {id}/run`;
`PATCH {id}/results/{externalJobId}/dismiss`;
`JobDiscoveryController` | Discover /discover: name/save search, select/run, toggle alert, dismiss result, delete saved search | Saved search/results/alert metadata owner-scoped; run is explicit persisted search update; background baseline does not alert all existing results | [F:job-discovery](../../../../../job-tracker-ui/src/job-discovery.test.tsx); [B:SavedJobSearchAlert](../../../../../JobTrackerApi.Tests/SavedJobSearchAlertTests.cs); [B:JobDiscoveryController](../../../../../JobTrackerApi.Tests/JobDiscoveryControllerTests.cs)
Representative tests with inspected assertions: `shows honest source metadata and offers the existing reviewed save flow`; `Saved_search_tracks_new_seen_and_dismissed_results_per_owner`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.
**Fresh execution:** Backend: JobDiscoveryControllerTests 3/3, SavedJobSearchAlertTests 1/1. Frontend: job-discovery.test.tsx 7/7.
All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Normal and admin saved-search GETs fail500 on entry and refresh (four genuine observations); exact installed SQLite translation rejects DateTimeOffset ORDER BY. **FAIL DISCOVERY-01**; no app fix or provider call. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | Scheduler-to-notification browser journey and mobile delete confirmation remain unverified; no new producer or delivery certification.
Discovery/notifications owner; M — audit saved search delete/pause/run, mobile confirmation and scheduler-to-owned-notification chain. **Confirmed defect:** [register](DEFECTS.md); separate owner repair required. | **PARTIAL** | **FAIL** |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md", + "line": 82, + "text": "| **PRES-S03** — Follow-up/ghosting rule settings, email reminder preference, table preferences, theme/language and connected-account links
Original contract: `SettingsView`, `RulesSettingsCard`; preferences have different scopes, do not replace with one unsafely shared object | `GET/PUT /api/rules, notification-settings`;
`PUT /api/auth/preferences/language`;
`RulesController + NotificationSettingsController + AuthController` | Settings General/Follow-ups/Notifications tabs or mobile section picker; edit/Save rules and reminders, table/theme/language; connections link | Rules/reminder/language server writes vs browser/table preferences have separate scopes; failure must preserve actionable draft; tab unmount discards local RulesSettingsCard draft in current source | [F:settings-view](../../../../../job-tracker-ui/src/settings-view.test.tsx); [F:theme-state](../../../../../job-tracker-ui/src/theme-state.test.tsx); [B:NotificationSettingsController](../../../../../JobTrackerApi.Tests/NotificationSettingsControllerTests.cs); [B:RulesEngineProspect](../../../../../JobTrackerApi.Tests/RulesEngineProspectTests.cs)
Representative tests with inspected assertions: `uses one browser preference and falls back to System`; `A_prospect_is_never_followed_up_or_ghosted_however_old`. These protect finite fixtures; mocked UI/controller providers do not prove real delivery or every listed control. | **Observed source:** owner/entry/call boundary and assertion excerpts inspected.
**Fresh execution:** Backend: RulesEngineProspectTests 5/5, NotificationSettingsControllerTests 3/3. Frontend: theme-state.test.tsx 7/7, settings-view.test.tsx 5/5.
All above mapped cases passed at audit source; counts overlap between rows and are not additive. **Fresh native/observed outcome:** Native Rules diagnostic loses unsaved5 back to14 on tab return; persisted14 and zero writes. **FAIL SETTINGS-01**. Saved rule/readback and three overlapping language/notification saves pass, but historical500 remains open. [Journey scope](JOURNEYS_AND_CONTROLS.md); [native results](evidence/browser-summary.json). | P4-04-O02 recorded SQLite notification saves had 2/10 HTTP 500/database-locked attempts; isolated rules 500 remains unconfirmed. P5-06-O01 language-preference 500 and rule drafts lost on tab unmount stay open; sequential success does not establish concurrency safety.
Settings/API/identity owner; H — investigate P4-04-O02 concurrent notification 500 and P5-06-O01 language-save 500; audit rule draft/tab lifecycle, unknown route/preferences. **Confirmed defect:** [register](DEFECTS.md); separate owner repair required. | **PARTIAL** | **FAIL** |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/PRES_RESULTS.md", + "line": 92, + "text": "- **Preference reliability:** P4-04-O02 notification SQLite lock/500 and P5-06-O01 language-save 500 during overlapping reads are distinct inherited failures. Sequential successful saves, local flag reload, or a non-recurrence do not establish concurrency safety or erase those records. Fresh repetition/API exception/DB-provider evidence belongs to the functional audit; bounded remediation belongs to an explicit owning checkpoint.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/README.md", + "line": 8, + "text": "**Historical R-01 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 R-01 parent column records54PARTIAL/2FAIL/1DEFERRED; Analytics AUTH-01 and Rules SETTINGS-01 remain open ordinary failures. R-01 does not authorize P5-15-02 or production.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/README.md", + "line": 10, + "text": "**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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/README.md", + "line": 26, + "text": "| [Native SQLite failure proof](evidence/discovery-failure.json) | Exact installed provider/query translation failure, native500 observations, InMemory coverage gap and source provenance |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/README.md", + "line": 31, + "text": "The audit uses disposable synthetic accounts/files/SQLite, localhost Chromium/static frontend and real API transport where named. External browser requests are blocked. Deterministic provider fixtures are used only where existing tests require them; they are not real-provider qualification. Source/test review is separate from execution. Finite controller/unit assertions are not reported as full browser journeys. Independent read-only review checked evidence attribution and corrected overclaims about ZIP proof, creation/publication setup, denial redaction and generic alerts.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/README.md", + "line": 55, + "text": "| DISCOVERY-01 | **P1 / J02** | Ordinary/admin `GET /job-discovery/saved-searches`500 on entry and refresh. Exact EF SQLite9.0.14 cannot translate `ORDER BY` over unconverted `DateTimeOffset`. Client swallows load failure and presents empty list | Discovery API owner: provider-compatible owned ordered read plus deliberate load feedback/retry; native empty/populated/foreign-ID persistence tests. Separate P5-15-04 repair; deployed MariaDB result must be verified separately |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/README.md", + "line": 61, + "text": "Historical “Dashboard preference-save500” is actually a generic server **language** preference response during overlapping Dashboard/setup reads; Dashboard's five visibility flags use owner-local storage. Fresh Dashboard toggle/reload/account fixtures pass. Three separate real overlap rounds produced six successful language/notification writes,12 successful concurrent reads, correct server readback and reload. The recorded500 was **not reproduced** in those rounds and remains OPEN; no cause/fix/concurrency guarantee is inferred. Notification SQLite contention is separately carried debt.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/README.md", + "line": 7, + "text": "The unchanged original `functional-acceptance.spec.ts` anonymous case was rerun against the disposable Development/SQLite API and actual local sign-in on 2026-10-10. All route census steps complete; the assertion at line154 fails: requested `/analytics?months=6`, returned `/analytics`. The native run has zero passes/one failure, zero skipped/flaky/retries. The trace, screenshot and JSON are retained under ignored `.artifacts/p5-15-01R-03/browser/auth-original-red*`; portable final evidence follows validation. This is the original desired-state assertion, not a weakened replacement.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/README.md", + "line": 22, + "text": "Existing session/account invalidation intentionally disposes the previous page/providers and replaces with `/login?sessionChanged=1`; previous-account private context must remain discarded. Backend ownership and role checks remain authoritative. Synthetic accounts/disposable SQLite only; no real external identity provider or production data.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/README.md", + "line": 54, + "text": "Five new ordinary browser cases use the actual disposable SQLite API, cookies, CSRF/session context, synthetic accounts and supported page actions. They do not mock successful report/ownership/authentication responses. Non-local requests are blocked. Three saved-search and four Rules repair cases remain separate existing requirements in the full run. P2-D01 remains an ordinary passing requirement, never an expected failure.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/evidence/auth-proof.json", + "line": 136, + "text": " \"nativeContract\": \"Real authenticated local Development/SQLite API for login, Analytics reads, account disposal and owned/foreign resources; no provider/API schema/report aggregation change.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/README.md", + "line": 25, + "text": "- `NotificationSettingsController.cs:29`: notification PUT updates another property of the same Identity user through `UpdateAsync`; unsuccessful Identity results explicitly become 500. Concurrent full-user writes, optimistic concurrency and SQLite contention remain hypotheses until response/server evidence identifies the failure.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 518, + "text": " \"SqliteDateTimeOffsetCompatibilityTests\": 5,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 519, + "text": " \"SqliteMigrationHelperTests\": 1,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 608, + "text": " \"16 SQLite parity scenarios compare complete ordered matching IDs across every table page and Board, including custom/deleted/foreign-company cases, 62 owned plus a foreign row.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 611, + "text": " \"Authorization attribute/helper tests are static reflection proof; direct controller denial and SQLite query parity do not prove every deployed HTTP route.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 612, + "text": " \"62-row SQLite fixture is finite functional parity, not a large-account memory/request-count benchmark.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 667, + "text": " \"SQLite stale save/restore rejects overwrites before appending history, including independent contexts and fresh stale versions.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 829, + "text": " \"Actual disposable SQLite/file account ZIP completeness, checksums, tenant isolation, auth/token/password/lease redaction and recent-session requirement.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 830, + "text": " \"Local disposable SQLite backup opens as restorable and retention works.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/backend-summary.json", + "line": 940, + "text": " \"Larger-account full-array memory/request-count behavior, overlapping preference persistence and SQLite preference debt.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 6, + "text": " \"scope\": \"Saved-search listing on the current local SQLite runtime\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 47, + "text": " \"status\": \"PROVEN for the exact current SQLite query/provider; native HTTP bodies are redacted and do not themselves contain the exception stack.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 49, + "text": " \"explanation\": \"UpdatedAtUtc is an unconverted DateTimeOffset mapped to SQLite TEXT. EF Core Sqlite rejects ORDER BY on this expression during query translation. ListSavedSearches awaits the query without handling this exception, producing the observed HTTP 500. The failure is before executing SQL, so it also affects empty accounts and is independent of NAV/provider configuration.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 52, + "text": " \"provider\": \"Microsoft.EntityFrameworkCore.Sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 57, + "text": " \"message\": \"SQLite does not support expressions of type 'DateTimeOffset' in ORDER BY clauses. Convert the values to a supported type, or use LINQ to Objects to order the results on the client side.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 59, + "text": " \"at Microsoft.EntityFrameworkCore.Sqlite.Query.Internal.SqliteQueryableMethodTranslatingExpressionVisitor.TranslateOrderBy(ShapedQueryExpression source, LambdaExpression keySelector, Boolean ascending)\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 76, + "text": " \"nativeDependencySource\": \"JobTrackerApi/bin/Release/net9.0/runtimes/win-x64/native/e_sqlite3.dll\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 86, + "text": " \"path\": \"JobTrackerApi/bin/Release/net9.0/Microsoft.EntityFrameworkCore.Sqlite.dll\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 102, + "text": " \"explanation\": \"Initial ignored harness output did not contain the installed e_sqlite3 native DLL. It failed before query translation. The existing API win-x64 native DLL was copied unchanged into ignored output; the subsequent translation assertion passed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 158, + "text": " \"localProvider\": \"Microsoft.EntityFrameworkCore.Sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 159, + "text": " \"efCoreSqlite\": \"9.0.14\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 161, + "text": " \"localEvidence\": \"Current Playwright server recipe uses Development and a fresh disposable DataRoot, with no explicit Database:Provider/connection string; API fallback selects SQLite.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 162, + "text": " \"productionProvider\": \"NOT VERIFIED. Program also supports mysql/mariadb with MariaDbServerVersion11.0.0. This SQLite translator exception does not prove a MariaDB production failure or pass.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 188, + "text": " \"reason\": \"Saved_search_tracks_new_seen_and_dismissed_results_per_owner executes ListSavedSearches against EF InMemory. Worker alert coverage also uses EF InMemory and orders by integer Id rather than UpdatedAtUtc. Existing SQLite DateTimeOffset compatibility coverage exercises CV/workspace/usage/extraction/package queries, but omits discovery saved-search listing.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 189, + "text": " \"recommendedProof\": \"A disposable SQLite controller regression with two dated owned searches and a foreign search; assert successful empty listing, exact descending owned order, results/counts and foreign-row exclusion, then the native no-provider route GET for both roles.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 194, + "text": " \"approach\": \"Reuse CvVariantService.ListAsync existing provider pattern: enforce owner/query filters before materialization; SQLite sorts the owned results in memory, while SQL-capable providers retain server ordering. Keep cancellation, Results include, DTO counts and newest-first semantics. Avoid global type conversions/schema migrations or returning an empty list on exception.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 195, + "text": " \"validation\": \"Add focused SQLite regression, run its owner suite and required full baseline, then native /discover refresh for normal/admin fixtures; maintain explicit production-provider limits.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/evidence/discovery-failure.json", + "line": 235, + "text": " \"path\": \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/README.md", + "line": 9, + "text": "A disposable authenticated Development/SQLite application seeds the actual six-field Rules record with Applied follow-up14. Edit that field to5, change Follow-ups→Notifications→Follow-ups. Before implementation, the browser observes14 on return while the database remains14 and zero Rules PUTs occur. The ordinary regression fails on the visible value: expected5, received14. It is not a mocked persistence response or missing-selector failure. [Before/after native proof and fingerprints](evidence/rules-proof.json).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/README.md", + "line": 41, + "text": "| [Native browser regressions](../../../../../../job-tracker-ui/e2e/rules-draft-repair.spec.ts) | Four ordinary cases using actual SQLite persistence/account APIs; no CSS class assertions, expected failures, skipped tests or live providers |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/README.md", + "line": 56, + "text": "| Save failure / retry | **PASS:**declared one-shot synthetic PUT500 retains draft/error across tabs; next real SQLite PUT204 persists all six values; dirty clears only after acknowledgement |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/README.md", + "line": 65, + "text": "The four focused browser cases pass4/4 with zero retries/skips/flaky/expected failures. Fault injection is limited to the explicitly declared PUT500 and held native reads/writes; ownership, persistence and readback exercise the real SQLite API. No server conflict semantics are invented.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/README.md", + "line": 130, + "text": "- Historical language-preference500, notification SQLite-lock contention and Rules-save500 root causes remain open. R-02 qualifies draft/error recovery, not a backend reliability repair.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/README.md", + "line": 131, + "text": "- Production provider and multi-client conflict qualification remain separate; native evidence here uses SQLite, not deployed MariaDB. No backend API conflict/version semantics are added.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/rules-draft-repair/evidence/rules-proof.json", + "line": 56, + "text": " \"faultsAndGates\": \"Only the declared synthetic PUT500 and deterministic delayed GET/PUT are intercepted; persistence/readback/account checks use the native SQLite API.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 9, + "text": "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**.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 11, + "text": "The exact failing operation was `OrderByDescending(x => x.UpdatedAtUtc)` inside `ListSavedSearches`, followed by `ToListAsync`. `UpdatedAtUtc` is an unconverted `DateTimeOffset`; installed EF Core SQLite raises:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 13, + "text": "> SQLite does not support expressions of type 'DateTimeOffset' in ORDER BY clauses.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 15, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 29, + "text": "`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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 31, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 37, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 67, + "text": "| `JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs` | Ten new real-SQLite cases, real current-user service; no EF InMemory proof for the provider defect |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 80, + "text": "| New user empty list | Real SQLite integration and native authenticated GET/UI return200 + `[]`; no provider call |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 83, + "text": "| 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 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 86, + "text": "| 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 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 92, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 102, + "text": "| **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 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 115, + "text": "| Backend | 1,023 | **1,033 passed**, 0failed/0skipped | +10 actual SQLite cases described above |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 157, + "text": "| DISCOVERY-01 P1 | **Closed for demonstrated SQLite listing + suppressed-error/recovery defect**; no data deletion or ownership regression observed |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 168, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 174, + "text": "| Real-SQLite reproducer and owner-filtered summary repair | **`bcc959904915e381ef6bfe5c236d9626021681d4`**; pushed and remote equality verified before continuing |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/README.md", + "line": 178, + "text": "**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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/repository-validation.json", + "line": 211, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-proof.json", + "line": 3, + "text": " \"scope\": \"Synthetic disposable native SQLite transport plus explicitly intercepted provider output; no production, live NAV/model, human screen reader or physical touch qualification.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-proof.json", + "line": 138, + "text": " \"path\": \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-proof.json", + "line": 176, + "text": " \"path\": \".artifacts/p5-15-01R-01/backend/sqlite-list-before.txt\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-proof.json", + "line": 180, + "text": " \"path\": \".artifacts/p5-15-01R-01/backend/sqlite-list-after.sql\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/saved-search-proof.json", + "line": 197, + "text": " \"Provider-run browser output intercepted; real runner SQLite test uses a deterministic external service.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-01/saved-search-repair/evidence/validation.json", + "line": 867, + "text": " \"Provider-dependent browser output intercepted; actual SQLite runner uses a deterministic external service.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/MANUAL_ACCEPTANCE.md", + "line": 129, + "text": "3. Settings notification/theme/language actions: inspect actual persistence outcome and failure/retry while draft remains usable. A locally applied language change is not proof the preference PUT succeeded. Perform separate reliability probes only if authorized; historic SQLite contention is not closed by sequential success.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/README.md", + "line": 14, + "text": "The binding sources are the [Phase 5 plan](../../PHASE5_PLAN.md), [parent programme](../README.md), [57 preservation groups](../PRESERVATION_ACCEPTANCE.md), [Phase 3 accessibility](../../../phase-3/ACCESSIBILITY_PLAN.md)/[responsive strategy](../../../phase-3/RESPONSIVE_STRATEGY.md), [P4 acceptance](../../../phase-4/p4-06/README.md), P5-01–14 implementation records and all three functional repair records. Tests use disposable owned SQLite/API records, synthetic English/Bokmål content and loopback-only requests. Component/DOM inspection is weaker evidence than a completed native workflow, and none substitutes for a human reader/device.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/TEST_COVERAGE.md", + "line": 9, + "text": "| `responsive-accessibility-audit.spec.ts`: thirteen-area collection | Synthetic owned native SQLite/API entries, loaded content, responsive geometry, actual ARIA tree, all enabled axe rules plus explicit WCAG2.2 target-size, screenshots | Collection success is not accessibility acceptance; rule findings are retained rather than asserted away |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-02/evidence/native-issues.json", + "line": 2, + "text": " \"scope\": \"Native synthetic owned SQLite/browser evidence; no human AT/device acceptance\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-03/README.md", + "line": 7, + "text": "The native Chromium/SQLite qualification uses synthetic loopback-only records and actual API preview/PDF exports. Standard fixtures retain all nine template IDs plus long English/Bokmål, compact Letter/8 mm, roomy A4/28 mm, reordered/hidden sections, sidebar, bubbles/grid and unbreakable boundary content. [Measured results](evidence/document-results.json) retain exact fixture membership and tolerances.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-04/DEBT_DISPOSITION.md", + "line": 16, + "text": "| P4-04-O02 notification DB locking | Historical SQLite error5 contention/open cause; current draft/error/retry behavior and native write/readback checks remain. | B complete affected reliability, A if required deployed workflow reproduces. Backend/identity owner; no blind retry or speculative transaction rewrite. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-05/README.md", + "line": 11, + "text": "The implemented runtime supports SQLite and MySQL/MariaDB. `Program.cs` defaults to SQLite and also substitutes SQLite when the connection is missing. That recorded F19 risk must be checked against the actual production configuration: do not accept a newly empty fallback database as a successful deployment. There is no PostgreSQL runtime to qualify in this checkpoint. Development SQLite success does not prove production MariaDB compatibility.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/p5-15/p5-15-06/README.md", + "line": 71, + "text": "Twelve concurrent preference rounds all returned language204/notification200, all four overlapping reads200 and correct persisted readback; reload retained EN and the enabled reminder. This is current SQLite qualification, **not a proved repair or root cause** for historical P5-06-O01/P4-04-O02 exceptions or deployed-provider contention. Their caller/error and provider qualifications remain in the readiness register.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/production-release-decision/README.md", + "line": 21, + "text": "| **Configuration, schema and rollback** | **Unverified.** Confirm the actual database provider/connection, schema/migration history, canonical origin/auth/ingress configuration, current version/counts and recoverable prior images. Rehearse failure injection and code/image rollback on a disposable Linux host with the intended topology, preserving data and failed deployment status. The existing script is a mechanism, not rehearsal evidence. F19's startup fallback to SQLite remains open; confirm the intended provider rather than accepting empty fallback data. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/release-readiness/PRESERVATION_REVIEW.md", + "line": 38, + "text": "| **PRES-W07** — Application drafts and immutable submitted package/archived binaries | Existing drafts/frozen submission/archive owners recomposed by [P5-08b](../p5-08b/README.md); [native SQLite/archive/ZIP proof](../p5-08b-readiness/README.md) retained. | [F:application-assets](../../../../job-tracker-ui/src/application-assets.test.tsx); [F:application-drafts](../../../../job-tracker-ui/src/application-drafts.test.ts); [B:SubmittedApplicationPackage](../../../../JobTrackerApi.Tests/SubmittedApplicationPackageTests.cs); [B:JobApplicationsApplicationPackage](../../../../JobTrackerApi.Tests/JobApplicationsApplicationPackageTests.cs) | Earlier P2-D01 capture expected failure is superseded by ordinary native passing evidence. Production restore/rollback and all storage/provider combinations remain unverified; capture is not external send. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/release-readiness/PRESERVATION_REVIEW.md", + "line": 64, + "text": "| **PRES-S03** — Rules/reminder/table/theme/language preferences and account links | P4 Settings controls retained; [P5-00](../p5-00/README.md) feedback/shared tokens and [P5-03](../p5-03/README.md)/[P5-04b](../p5-04b/README.md) table preferences integration. | [F:settings-view](../../../../job-tracker-ui/src/settings-view.test.tsx); [F:theme-state](../../../../job-tracker-ui/src/theme-state.test.tsx); [B:NotificationSettingsController](../../../../JobTrackerApi.Tests/NotificationSettingsControllerTests.cs); [B:RulesEngineProspect](../../../../JobTrackerApi.Tests/RulesEngineProspectTests.cs) | P4-04-O02 concurrent SQLite notification saves, unconfirmed rules 500 and rule drafts lost on tab unmount remain open; router/preference lifecycle is only scoped-tested. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/release-readiness/PRESERVATION_REVIEW.md", + "line": 71, + "text": "The matrix maps **9 entry/account + 10 Jobs + 12 workspace + 12 Career/CV + 6 mail + 5 Settings/insights + 3 Admin = 57** groups. Mapping completeness is not coverage percentage or acceptance. The source matrices' original unlisted sub-capability gaps remain authoritative unless a linked successor explicitly supplies their proof. In particular the former P2-D01 SQLite package/tailoring expected failure has an ordinary native passing successor; it must not be reclassified as current open debt. Conversely P5-02 human screen-reader acceptance, F04 and the other [open blocker register](../OPEN_BLOCKERS.md) items are not closed by the local successors.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-5/release-readiness/README.md", + "line": 13, + "text": "No new database migration exists between fetched `main` and the source: three historical migration files differ only in documentation comments. The existing CV `Version` property gains concurrency metadata in the model snapshot; no new DDL migration was added. Startup still runs existing migration/reconciliation behavior. Actual deployed schema/provider/connection settings remain unverified; API fallback to SQLite (F19) is still open and must not substitute for confirming correct deployment configuration. Compose is unchanged. New optional external-AI routing entries in `.env.example` were already introduced by grounding readiness; no production environment update is assumed or performed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/COMMITS.md", + "line": 19, + "text": "The owner's 2026-10-11 P6-00–P6-05 sequence supersedes the older proposal. Native lanes run against isolated synthetic SQLite with local-only browser network; never production. UI sources are frozen before the final build and final complete runs. Raw command logs stay under `.artifacts/phase6/current/`; portable commands, outcomes and SHA256 fingerprints live in each checkpoint and the final manifest. Failed/intermediate attempts are retained and explained; final retries/skip/expected-failure counts are checked separately.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-01/README.md", + "line": 7, + "text": "Review current loaded native SQLite/API/browser workflows, rendered EN/Bokmål and light/dark states, shared owners and existing regressions. Compare function and semantics before appearance. Native collection is automated inspection, not human usability, reader or device acceptance. The inherited 1,033 backend / 498 frontend / 148 browser baseline is separate from fresh checkpoint runs.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-04/README.md", + "line": 7, + "text": "Fresh native measurement is owned by the [responsive audit performance case](../../../../job-tracker-ui/e2e/responsive-accessibility-audit.spec.ts). The current post-Career-spacing-repair run records Chromium 151.0.7922.34, a1280×720 CSS-pixel viewport, Windows `win32`, production static export, Release API, isolated synthetic SQLite, `prebuiltExport: true` and `serverReuseAllowed: false` from the actual invocation. It records hard-navigation time to the stated assertion, network requests/resource transfer/duration, long-task/layout-shift observations and CDP heap/DOM/layout/task metrics. Counts and exact API-to-rendered ID parity are asserted at200 and1,000; the separate unchanged diagnostics lane checks its seeded collection. Filtering never silently caps the Board.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-04/evidence/performance.json", + "line": 12, + "text": " \"database\": \"isolated synthetic SQLite from native test configuration\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/PRESERVATION.md", + "line": 54, + "text": "| **PRES-W07** Drafts/frozen package versions/archived binaries | [Native SQLite/source-mutation/archive ZIP proof](../../phase-5/p5-08b-readiness/README.md) | PARTIAL | Actual production restore/rollback/all-storage combinations; current edits/delete cannot mutate frozen bytes; capture is not delivery |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/README.md", + "line": 91, + "text": "Performance establishes a **local baseline**, not a budget or production claim. The final repaired-source export has53 JS files,3,234,867 raw bytes and940,065 bytes summed per-file gzip; these include lazy chunks and do not equal initial-route transfer. Native Windows Chromium151/1280×720/Release API/isolated SQLite observations record requests, ready milestones, long tasks, layout shifts and finite CDP heap samples. API ResourceTiming `transferSize=0` is unavailable cross-origin timing information, not evidence of zero network bytes; explicit complete-Board payload lengths are separately measured. CDP document/node/heap snapshots can retain prior navigation or CV iframe documents and do not establish memory growth/leak. The final standalone1,000-result Board payload is1,181,982 bytes with render long tasks397/264ms versus200-result237,273 bytes and92/96ms. This proves scaling cost worth separate bounded capacity work; it does not justify a cap, feature removal or speculative renderer/backend rewrite. Query-preserving client Board→Table319ms, Table→Board695ms, exact one-result search including debounce1,490ms and Jobs→Dashboard184ms retain the same document `timeOrigin`; these are finite diagnostic observations, not performance budgets. Dashboard duplicate source reads and layout shifts remain measured follow-up candidates with distinct shell/onboarding/report owners. Single observations are not comparative improvement, leak diagnosis, React rerender counts or physical-device qualification. Original and final runs are independent diagnostics, without an asserted timing improvement.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/README.md", + "line": 102, + "text": "| Reliability incidents | RD11 preference500 root, RD12 notification SQLite locking, RD13 unconfirmed Rules500, historical focus/section-expansion/unsaved incidents and Board capacity remain tracked. Scoped feedback fixes and clean reruns are not proof these roots were repaired. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/evidence/backend-validation.json", + "line": 556, + "text": " \"SavedJobSearchSqliteTests\": {", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/evidence/backend-validation.json", + "line": 565, + "text": " \"SqliteDateTimeOffsetCompatibilityTests\": {", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/evidence/backend-validation.json", + "line": 568, + "text": " \"SqliteMigrationHelperTests\": {", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/evidence/validation.json", + "line": 26, + "text": " \"api\": \"Native Release API with isolated synthetic SQLite from each browser configuration\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-6/p6-05/evidence/validation.json", + "line": 1178, + "text": " \"Historical RD11 preferences500/RD12 notification SQLite locking/RD13 Rules500 roots, focus/expansion/unsaved incidents and full-result Board capacity\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/COMMITS.md", + "line": 20, + "text": "| SQLite startup WAL/concurrency/backup repair | `f51e0506cc6a4fdcbc6c91c8cee9f6112cdecbf0` |21October06:04:31UTC; only known Users fixture remained dirty |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/COMMITS.md", + "line": 63, + "text": "| P7-02 SQLite evidence-list compatibility repair | `01281f52d9279ecdbd3363a11d2e9cb71230bf49` | [Separate repair](p7-02/README.md#separate-evidence-list-provider-repair), [frozen backend/HTTP evidence](p7-02/evidence/evidence-list-repair.json): actual SQLite/HTTP RED0/1 each; new SQLite1/1, fresh guards91/91 and Release0warnings/errors plus ordinary HTTP1/1 GREEN. SQL owner filter/other-provider ordering unchanged; no schema/action/payload change, owned list remainsO(N). Fullbackend1,034 derived only from inherited1,033+1. Bounded local repair GO; slice-specific hygiene PASS00:05:02UTC (9docs337links/0errors,57/32 retained), normal push directly verified2026-10-12 00:06:47.145743UTC: localHEAD=origin=live development01281f52, local/origin/live main27657f3 unchanged; five unfinished Career paths retained/worktree not clean. Actual receipt appended by successor; Career UI/whole P7-02 pending; in-flight frontend excluded |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/COMMITS.md", + "line": 142, + "text": "[Contract report](p7-07/CONTRACT.md) and [portable results](p7-07/evidence/contract-results.json): final12/12 backend contracts (11 nativeSQLiteHTTP, one unexecutedMariaDBcommand/query composition),80/80 existing related/auth/draft cases on matchingReleaseDLL, actualProgram cookie-authenticated3/3 native and ordinaryP2-D01PASS. All26/33/23 captured sources remain unchanged across their runs. BackendRelease compile and held-native browser TypeScript pass; frontendproduct/export remains unchanged. Exact27 metadata fields, two bounded parameterized read queries, owner/parent/company scope, literalNorwegiansearch and knownUTC/local-date distinction preserve existing resources. All failed attempts, sharedWindows-SQLwhitespace repair and parameter-display fixture qualifications remain. No DocumentsUI/axe/manual/MariaDBruntime acceptance. New12backend and3browser derive1053/304; frontend739/94 unchanged, no integrated counts. Backendimplemented scope CONDITIONAL GO; final hygiene/normalpushpending. DocumentsUI follows verified contract push; all57groups56PARTIAL/C11DEFERRED and32routes, mainunchanged/productionNO-GO/noPhase8.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "line": 3, + "text": "P7-12 continuation21October: [SQLite concurrency](p7-12/SQLITE_CONCURRENCY.md) now reproduces the owned Audit500 and language-save500 mechanism with a held reader against actual DELETE-mode bootstrap. Explicit startup WAL passes1060backend and17affected native cases; complete successor acceptance remains pending, and the browser's exact competing connection is not identified. [Users pagination](p7-12/USERS_PAGINATION.md) corrects the independently proved first-page fixture assumption. Earlier [fixture isolation](p7-12/FIXTURE_ISOLATION.md) explains the failed103/248whole run and preserves all original security assertions; combined16/16passes. [Administrator help](p7-12/ADMIN_HELP.md) corrects confirmed roleless-wrapper names; MUI Sort/contrast incomplete and human acceptance requirements remain. [Follow-redirects1.16.1](../../infrastructure/2026-10-21-follow-redirects-patch.md) patches newly observed production-classified highs without expanding the dev-only braces exception. NuGet Pkcs8.0.1High/Moderate and current development moderate findings remain recorded.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "line": 38, + "text": "| RD12 | Notification-setting SQLite locking/server contention remains OPEN | P7-09 retains draft/in-page error; diagnose intended-provider writes before stronger reliability claim |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "line": 90, + "text": "RD25 has new **bounded local proof**: actual application registration/SMTP verification/password reset/replay and old-session invalidation pass in fresh synthetic SQLite/keys with a loopback mail capture server. Actual production mail, OAuth/Turnstile/provider consent/privacy/reconnect and delivery remain unverified. Existing English server-authored auth errors in NB samples and possible duplicate route/error announcements remain explicit reader/localisation qualifications. RD06/RD07/RD25 are not closed. At the public gate account identity/security/session/source-isolation work remained in flight; the later conditional disposition is below. No deferred AI activation is implied.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "line": 102, + "text": "The [separate P7-02 SQLite evidence-list repair](p7-02/evidence/evidence-list-repair.json) reproduces actual provider/HTTP failures and passes the new ordinary SQLite case,91 affected guards, Release build and HTTP readback after owner-local materialization/sort. It changes no schema, SQL owner filter or other-provider ordering. Fullbackend1,034 is derived only; full regression remains P7-12. The list remains O(N), and HTTP proof does not establish Career presentation/reader/production acceptance. Source/DLL/RED/GREEN/spec/raw traces are frozen with34 references verified; slice-specific hygiene PASS00:05:02UTC (9docs337links/0errors,57/32 retained), normal push01281f52 directly verified00:06:47UTC/main unchanged, five unfinished Career paths retained. No RD production/manual/concurrency/provider closure follows from this bounded compatibility repair.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "line": 132, + "text": "The early Phase6 runner retained exact failure commands/reports/logs but reused result folders, so not all old screenshots/traces/error-context paths remain resolvable. Later runs archive the whole previous output; current successful attachments have exact provenance. Preserve that limit rather than claiming complete old failure-trace retention. Native Windows Chromium/local SQLite/synthetic fixtures and finite PDF oracles do not establish deployed Linux, human semantics, physical devices, real provider quality or production load.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "line": 160, + "text": "[Companies results](p7-05/evidence/companies-results.json) repair demonstrated duplicate/held-save draft ownership, stale relation reads, deep-link hash/state loss, locale refetch, incorrect arbitrary-stage translation, stale response title and BODY focus after dialog exit. Local post-exit fallback preserves valid MUI/moved focus. New20 all-enabled scans0/91 and named20 WCAG0/163 retain complete unresolved overlap/occlusion/modal/contrast/wrapper vectors; finite keyboard/reflow proof does not close M01–M12. Date readbacks compare full calendar seconds without claiming SQLite Kind/DST equivalence. Existing shared cached consumers remain; no inherited debt or whole PRES group is closed.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/DEBT.md", + "line": 208, + "text": "[Contract report](p7-07/CONTRACT.md) and [portable results](p7-07/evidence/contract-results.json): final12/12 backend contracts (11 nativeSQLiteHTTP, one unexecutedMariaDBcommand/query composition),80/80 existing related/auth/draft cases on matchingReleaseDLL, actualProgram cookie-authenticated3/3 native and ordinaryP2-D01PASS. All26/33/23 captured sources remain unchanged across their runs. BackendRelease compile and held-native browser TypeScript pass; frontendproduct/export remains unchanged. Exact27 metadata fields, two bounded parameterized read queries, owner/parent/company scope, literalNorwegiansearch and knownUTC/local-date distinction preserve existing resources. All failed attempts, sharedWindows-SQLwhitespace repair and parameter-display fixture qualifications remain. No DocumentsUI/axe/manual/MariaDBruntime acceptance. New12backend and3browser derive1053/304; frontend739/94 unchanged, no integrated counts. Backendimplemented scope CONDITIONAL GO; final hygiene/normalpushpending. DocumentsUI follows verified contract push; all57groups56PARTIAL/C11DEFERRED and32routes, mainunchanged/productionNO-GO/noPhase8.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/PRESERVATION.md", + "line": 7, + "text": "Current P7-12 continuation retains all57statuses and33routes. [SQLite concurrency](p7-12/SQLITE_CONCURRENCY.md) changes only startup journaling, with actual usage/Identity writes, foreign-row preservation and independent WAL backup proof;1060backend and17affected native cases pass. [Users fixture pagination](p7-12/USERS_PAGINATION.md) preserves the original visible identity and keyboard/reflow assertions. Earlier [fixture isolation](p7-12/FIXTURE_ISOLATION.md) changes only synthetic role/language lifecycle and diagnostics, preserving the original last-admin409, non-admin403, ownership and persistence assertions; combined16/16passes. [Protected-action help](p7-12/ADMIN_HELP.md) retains disabled controls and help while correcting wrapper semantics. The one-package security patch changes no capability or route. Full successor integration and all human/provider/output qualifications remain required; no group is upgraded by these finite checks.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/PRESERVATION.md", + "line": 70, + "text": "| **PRES-W07** Drafts/frozen package versions/archived binaries | [Native SQLite/source-mutation/archive ZIP proof](../phase-5/p5-08b-readiness/README.md) | PARTIAL | Actual production restore/rollback/all-storage combinations; current edits/delete cannot mutate frozen bytes; capture is not delivery | Retain workspace owners; P7-06 residual / P7-12 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/PRESERVATION.md", + "line": 79, + "text": "| **PRES-C04** Evidence sources/categories/tags/add/list/delete | [Retained evidence owner](../phase-5/p5-15/ROUTE_ACCEPTANCE.md), evidence frontend/API tests, [actual SQLite list repair](p7-02/evidence/evidence-list-repair.json) | PARTIAL | Many-item/delete/keyboard/human acceptance; SQLite compatibility repaired with owner SQL preserved, full frontend/production acceptance remains qualified | P7-02/03 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/PRESERVATION.md", + "line": 141, + "text": "| C04 | Separate real SQLite/HTTP RED→GREEN repair; owner SQL filter/AsNoTracking and foreign-owner denial preserved; differently-offset instants sorted correctly;91 affected guards/Release pass | No live MySQL/production proof; owner-local list remainsO(N), no scaling/schema/payload/auth change |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/PRESERVATION.md", + "line": 188, + "text": "[Discovery results](p7-05/evidence/discovery-results.json): J01/J02/J08/J09/W11 exact query/saved-ID Retry, protected draft/mutation ownership, SQLite CRUD/owner denial, reviewed-import navigation and backend provider-double runner/dismiss safeguards. Fresh21/1/new8+existing4/native/backend14/types/lint/build pass;18 actual new image reviews. New18scans0/81 and existing9scans0/52 remain qualified. No capability/route/API/schema/AI safety change; all57 remain56 PARTIAL/C11 DEFERRED and32 routes. Derived682/93/browser257 are not integrated totals. Companies/Offers/Reminders/manual/provider/release obligations remain; final hygiene/normal push pending.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/PRESERVATION.md", + "line": 232, + "text": "[Contract report](p7-07/CONTRACT.md) and [portable results](p7-07/evidence/contract-results.json): final12/12 backend contracts (11 nativeSQLiteHTTP, one unexecutedMariaDBcommand/query composition),80/80 existing related/auth/draft cases on matchingReleaseDLL, actualProgram cookie-authenticated3/3 native and ordinaryP2-D01PASS. All26/33/23 captured sources remain unchanged across their runs. BackendRelease compile and held-native browser TypeScript pass; frontendproduct/export remains unchanged. Exact27 metadata fields, two bounded parameterized read queries, owner/parent/company scope, literalNorwegiansearch and knownUTC/local-date distinction preserve existing resources. All failed attempts, sharedWindows-SQLwhitespace repair and parameter-display fixture qualifications remain. No DocumentsUI/axe/manual/MariaDBruntime acceptance. New12backend and3browser derive1053/304; frontend739/94 unchanged, no integrated counts. Backendimplemented scope CONDITIONAL GO; final hygiene/normalpushpending. DocumentsUI follows verified contract push; all57groups56PARTIAL/C11DEFERRED and32routes, mainunchanged/productionNO-GO/noPhase8.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/README.md", + "line": 9, + "text": "P7-00–P7-11 implementation is published **CONDITIONAL GO**. [P7-12](p7-12/README.md) is executing the complete regression from synchronized `508d68e16d49625fb083824a5bee0211c85f3432`, export`wc_68aa1Io7PpwqrixmzR`; [consumer successor identity](p7-12/evidence/consumer-entry.json) freezes792runtime inputs. Fresh frontend899/101, backend1060 and offline sidecar56 pass; ordinary351browser and separate lanes are still in progress. The completed WAL-source run had343PASS/8FAIL; all8responsible [shell/smoke consumers](p7-12/TERMINAL_CONSUMERS.md) now pass without product changes. This is not added to343to invent a full pass. Earlier [SQLite concurrency](p7-12/SQLITE_CONCURRENCY.md) and [Users pagination](p7-12/USERS_PAGINATION.md) repairs retain deterministic and17-case native proof. All failed/interrupted attempts remain explicit. Final migration acceptance is not yet issued.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/README.md", + "line": 35, + "text": "| [P7-02](p7-02/README.md) | Onboarding and Career overview/evidence | Entryad7b419 pushed/verified; bounded onboarding CONDITIONAL GO32/13/4+types/lint/build/13 actual PNG inspections, hygiene PASS and d21501aa push verified23:55:12UTC. Separate SQLite evidence-list repair91 guards/HTTP1/Release passed, pushed01281f52/direct receipt00:06:47UTC with unfinished Career work preserved. Career affected46/3/native14/preservation2/types/lint/build and actual22-image review pass; implemented checkpoint CONDITIONAL GO with99 incompletes/manual gates. Career final hygiene PASS (four commands0,9docs347links0errors); normally pushed8b4d5c2/direct localHEAD=origin=live receipt05:51:04UTC, clean worktree/main unchanged |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/README.md", + "line": 102, + "text": "[Contract report](p7-07/CONTRACT.md) and [portable results](p7-07/evidence/contract-results.json): final12/12 backend contracts (11 nativeSQLiteHTTP, one unexecutedMariaDBcommand/query composition),80/80 existing related/auth/draft cases on matchingReleaseDLL, actualProgram cookie-authenticated3/3 native and ordinaryP2-D01PASS. All26/33/23 captured sources remain unchanged across their runs. BackendRelease compile and held-native browser TypeScript pass; frontendproduct/export remains unchanged. Exact27 metadata fields, two bounded parameterized read queries, owner/parent/company scope, literalNorwegiansearch and knownUTC/local-date distinction preserve existing resources. All failed attempts, sharedWindows-SQLwhitespace repair and parameter-display fixture qualifications remain. No DocumentsUI/axe/manual/MariaDBruntime acceptance. New12backend and3browser derive1053/304; frontend739/94 unchanged, no integrated counts. Backendimplemented scope CONDITIONAL GO; final hygiene/normalpushpending. DocumentsUI follows verified contract push; all57groups56PARTIAL/C11DEFERRED and32routes, mainunchanged/productionNO-GO/noPhase8.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-00/evidence/baseline.json", + "line": 395, + "text": " \"Bounded stable pagination/search/type/sort, with actual SQLite and deployed-provider compatibility\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-01/evidence/account-results.json", + "line": 174, + "text": " \"qualification\": \"Local native Chromium/static export/.NET9/owned synthetic SQLite fixtures. No actual OAuth/Turnstile/authenticator/production delivery or human qualification\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-01/evidence/public-auth-results.json", + "line": 104, + "text": " \"SMTPQualification\": \"Fresh synthetic SQLite/keys, loopback SMTP capture, actual app Identity tokens/mail/reset/session revocation; production mail/OAuth/Turnstile disabled, no real provider call\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/README.md", + "line": 3, + "text": "**Status: implemented P7-02 scope CONDITIONAL GO. Onboarding and the separate SQLite repair are pushed; Career runtime/visual acceptance and final slice hygiene PASS; normally pushed8b4d5c2 with direct receipt.** Follow the exact [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries). This checkpoint has two bounded commits: onboarding guidance first, then Career overview/evidence. Structured Career editing/import/history remains P7-03; no alternative checkpoint order or new route is introduced.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/README.md", + "line": 49, + "text": "Actual local SQLite exposed an existing list failure before Career presentation acceptance: evidence POST returned200 but subsequent GET returned500. The new ordinary provider test failed0/1 with SQLite9.0.14 `DateTimeOffset ORDER BY` `NotSupportedException`; the real-HTTP case independently failed0/1 at23:59:55–00:00:03UTC. Existing affected guards had freshly passed90/90. See the [frozen repair evidence](evidence/evidence-list-repair.json).", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/README.md", + "line": 51, + "text": "The bounded [controller](../../../../JobTrackerApi/Controllers/CareerEvidenceController.cs) repair keeps SQL owner filtering and `AsNoTracking`; SQLite materializes only owned rows then sorts actual DTO instants. Other providers retain existing SQL ordering by source-branch inspection; no live production/MySQL execution is claimed. The [new ordinary test](../../../../JobTrackerApi.Tests/CareerEvidenceControllerTests.cs) distinguishes actual timestamps with different offsets and a foreign owner's future row. No schema/converter/action/payload/authorization changes occur. Owner-local SQLite materialization remains O(N); this is compatibility repair, with no scaling or timing claim.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/README.md", + "line": 53, + "text": "Dedicated SQLite1/1 and fresh affected guards91/91 passed with zero failed/not-executed cases. Release test-project/API build passed00:01:26–00:01:28UTC with zero warnings/errors. Actual real-HTTP GREEN passed1/1 at00:01:48–00:01:58UTC, zero skip/flaky/unexpected/retry. The added ordinary backend case makes1,034 the **derived** future full expectation; only the91 affected guards have freshly executed. The dedicated1/HTTP1 overlap this coverage and later Career native coverage; do not add them to full totals.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/README.md", + "line": 69, + "text": "Final workspace14/evidence8 replace inherited7+1, adding **14 net cases**; the existing Profile24 consumer cases also pass unchanged. Onboarding adds23 separately. Latest fresh full frontend remains P7-01 **573/89**; **610/89 is derived573+23+14**, not a new full run. Full backend1,034 is likewise derived from1,033+the new SQLite case; the fresh affected91 guard run is separate. Final full regression remains P7-12.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/career-results.json", + "line": 614, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/career-results.json", + "line": 854, + "text": " \"test\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/career-results.json", + "line": 3926, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/career-results.json", + "line": 4184, + "text": " \"test\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/career-results.json", + "line": 7479, + "text": " \"qualification\": \"Fresh91 guards/SQLite1/HTTP1/Release belong to the separately pushed01281f52 backend repair. Backend1,034 remains derived; these are not a new full Career/backend execution.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 4, + "text": " \"slice\": \"SQLite evidence-list compatibility repair only\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 7, + "text": " \"problem\": \"EF SQLite9.0.14 cannot translate DateTimeOffset ORDER BY; owned evidence POST200 was followed by list GET500 and actual provider NotSupportedException.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 8, + "text": " \"change\": \"Keep SQL owner filtering and AsNoTracking. SQLite materializes only owned rows then orders actual DTO instants; other providers retain existing SQL ordering.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 107, + "text": " \"sqliteRed\": {", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 119, + "text": " \"FullyQualifiedName~List_orders_owned_evidence_by_actual_timestamp_with_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 123, + "text": " \"E:\\\\Storage\\\\Projects\\\\Active\\\\Job tracker\\\\.artifacts\\\\phase7\\\\current\\\\backend-career\\\\p702-evidence-sqlite-red-20261011T235657Z\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 139, + "text": " \"path\": \".artifacts/phase7/p7-02/evidence-list-repair/backend/p702-evidence-sqlite-red-20261011T235657Z/career.log\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 145, + "text": " \"path\": \".artifacts/phase7/p7-02/evidence-list-repair/backend/p702-evidence-sqlite-red-20261011T235657Z/career.trx\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 151, + "text": " \"path\": \".artifacts/phase7/p7-02/evidence-list-repair/backend/p702-evidence-sqlite-red-20261011T235657Z/command.json\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 158, + "text": " \"sqliteGreen\": {", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 170, + "text": " \"FullyQualifiedName~List_orders_owned_evidence_by_actual_timestamp_with_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 174, + "text": " \"E:\\\\Storage\\\\Projects\\\\Active\\\\Job tracker\\\\.artifacts\\\\phase7\\\\current\\\\backend-career\\\\p702-evidence-sqlite-green-20261012T000057Z\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 190, + "text": " \"path\": \".artifacts/phase7/p7-02/evidence-list-repair/backend/p702-evidence-sqlite-green-20261012T000057Z/career.log\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 196, + "text": " \"path\": \".artifacts/phase7/p7-02/evidence-list-repair/backend/p702-evidence-sqlite-green-20261012T000057Z/career.trx\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 202, + "text": " \"path\": \".artifacts/phase7/p7-02/evidence-list-repair/backend/p702-evidence-sqlite-green-20261012T000057Z/command.json\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 305, + "text": " \"real SQLite evidence list\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 351, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 370, + "text": " \"message\": \"Error: the actual local SQLite HTTP list must succeed\\n\\n\\u001b[2mexpect(\\u001b[22m\\u001b[31mreceived\\u001b[39m\\u001b[2m).\\u001b[22mtoBe\\u001b[2m(\\u001b[22m\\u001b[32mexpected\\u001b[39m\\u001b[2m) // Object.is equality\\u001b[22m\\n\\nExpected: \\u001b[32m200\\u001b[39m\\nReceived: \\u001b[31m500\\u001b[39m\\n\\n 110 | const item = await created.json();\\n 111 | const listed = await page.request.get(`${apiUrl}/career/evidence`);\\n> 112 | expect(listed.status(), 'the actual local SQLite HTTP list must succeed').toBe(200);\\n | ^\\n 113 | expect(await listed.json()).toEqual([item]);\\n 114 | expect(item.tags).toEqual(['C#', 'Norsk']);\\n 115 | expect(item.sourceReference).toBe('Retrospective');\\n at E:\\\\Storage\\\\Projects\\\\Active\\\\Job tracker\\\\job-tracker-ui\\\\e2e\\\\phase7-career-overview.spec.ts:112:77\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 380, + "text": " \"test\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 392, + "text": " \"test\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 404, + "text": " \"test\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 439, + "text": " \"real SQLite evidence list\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 484, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 504, + "text": " \"test\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 579, + "text": " \"qualification\": \"Fresh affected guards90→91 include one actual SQLite sorting/foreign-owner test. Full1,034 is derived, not freshly executed; the dedicated1 and HTTP1 overlap these guards and final Career coverage.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 583, + "text": " \"Owned evidence list remains O(N) with SQLite owner-local materialization; no performance improvement claim.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 584, + "text": " \"HTTP-only provider case uses real local API/SQLite, not Career UI acceptance. Existing onboarding exportbwZtqlczGqVRJ0J01IxVK does not establish a fresh Career frontend build.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/evidence-list-repair.json", + "line": 595, + "text": " \"slice\": \"evidence list SQLite compatibility repair\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-02/evidence/onboarding-results.json", + "line": 139, + "text": " \"qualification\": \"Local native Chromium/owned synthetic SQLite fixtures; external requests blocked. No physical touch/zoom/human assistive/provider acceptance.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-03/README.md", + "line": 151, + "text": "[Import/history results](evidence/import-history-results.json) supersede the preceding in-progress statuses. Final affected **76/6** pass2026-10-12 17:16:39–17:17:35UTC. The ordinary native pack passes **35/35**,17:17:31–17:20:48UTC: import/history6, editor11, source-ID2, Career14 and ordinary frozen/mobile preservation2. All have0failed/skipped/flaky/retries. Fresh app/browser TypeScript, lint and production build pass. The unchanged-API98/98 backend subset passes16:27:19–16:27:23UTC; its TRX/log and guarded isolated-SQLite seeder24/24 receipt are copied into the immutable final evidence. These subsets are not fresh whole-suite totals.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-03/evidence/editor-results.json", + "line": 993, + "text": " \"browser\": \"Native Windows Chromium/local SQLite; original runner/config frozen\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-03/evidence/editor-results.json", + "line": 4406, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-03/evidence/import-history-results.json", + "line": 4832, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-03/evidence/source-id-results.json", + "line": 306, + "text": " \"browser\": \"Native Windows Chromium/local SQLite; original runner/config frozen\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/README.md", + "line": 9, + "text": "| Discovery | Manual search retains saved context; held saved search keeps old rows; global Retry always runs manual search, including mutation failures. Pending controls permit duplicate operations/draft changes. Reuse shared headers, feedback, tokens and original validated saved-list states | Exact saved/manual request ownership, snapshot Retry, explicit mutation recovery/draft preservation, alert/create/delete/dismiss readbacks, backend provider-double/SQLite safeguards, existing owner-denial and saved-list repair, keyboard/focus and finite responsive/theme/locale evidence |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/README.md", + "line": 26, + "text": "Real owner SQLite list/create/toggle/delete and reload, crafted foreign/anonymous denial, saved-list failure recovery and provider-double runner/history/dismiss tests pass. Browser vacancy search/run are explicit fixtures and never call NAV; real missing-result Dismiss404 and two intercepted204 UI recovery paths are distinguished. Stored native counts remain unchanged for those UI-only204 responses; successful provider/history/dismiss persistence or alert delivery is not claimed from browser fixtures.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/README.md", + "line": 42, + "text": "Real isolated SQLite save/reload, source normalization, latest20 active contacts excluding deleted jobs, relationship projection, exact owner/foreign/anonymous denials and linked Job navigation pass. Two unchanged-binary backend Facts pass; broader filter names do not imply broader matched coverage. Readback comparisons preserve all calendar seconds despite SQLite Kind/Z formatting differences and do not claim UTC/DST qualification. Server details/free text and existing cached useCompanies consumers remain untouched. API fixture creation is distinguished from an absent standalone creation screen.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 522, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 597, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 665, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 733, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 801, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 869, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 937, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1017, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1085, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1165, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1220, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1283, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1338, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1388, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1438, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1612, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1766, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1841, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1909, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 1972, + "text": " \"boundary\": \"Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/companies-results.json", + "line": 4392, + "text": " \"persistenceQualification\": \"Actual isolated SQLite fixture creation, nine-field PUT/readback/reload, source normalization, latest20 active contacts/deleted-job exclusion, owned/foreign/anonymous relationship/edit denial and job navigation. Original date payload and formatting remain; backend readback equality is full calendar-second equality despite SQLite Kind/Z serialization differences, not verified UTC/DST equivalence. Arbitrary pipeline strings and server error details remain verbatim. No standalone create UI or provider/model activity.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 200, + "text": " \"source\": \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 202, + "text": " \"path\": \".artifacts/phase7/p7-05/entry-source/JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 584, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 632, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 680, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 728, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 776, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 824, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 872, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 920, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 968, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1017, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1071, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1125, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1174, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1228, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1282, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1331, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1385, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 1438, + "text": " \"providerBoundary\": \"Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 2609, + "text": " \"FullyQualifiedName~JobDiscoveryControllerTests|FullyQualifiedName~SavedJobSearchSqliteTests|FullyQualifiedName~SavedJobSearchAlertTests\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/discovery-results.json", + "line": 2647, + "text": " \"binary\": \"Same verified Release DLL; no backend build/full suite. Fake-provider SQLite tests prove actual runner/history/dismiss safeguards; browser provider fixtures establish presentation only.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/entry.json", + "line": 194, + "text": " \"source\": \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/entry.json", + "line": 196, + "text": " \"path\": \".artifacts/phase7/p7-05/entry-source/JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 425, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 473, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 521, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 569, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 617, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 665, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 713, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 761, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 809, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 857, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 905, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 953, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 1001, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/offers-results.json", + "line": 1049, + "text": " \"boundary\": \"Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 483, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 536, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 589, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 642, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 695, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 748, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 801, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 854, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 912, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 965, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 1018, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 1071, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 1124, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 1177, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 1230, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 1283, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-05/evidence/reminders-results.json", + "line": 1336, + "text": " \"boundary\": \"Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-06/COMPOSE.md", + "line": 9, + "text": "The existing global correspondence composer remains the owner of new messages, replies, saved drafts, review confirmation and send feedback. It keeps the existing provider registry, owned-job choices, draft routes, explicit send confirmation, shared confirmation/toast infrastructure and English/Bokmål catalogue. The sole API presentation correction marks existing draft DTO timestamps as UTC consistently after SQLite reload. No new document persistence, mailbox grant, provider integration, renderer, route or schema is introduced.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-06/COMPOSE.md", + "line": 42, + "text": "| UTC contract RED | **24 pass/1 fail of 25** | `backend-utc-red`, 05:51:46.857292–05:51:56.549754. The ordinary new Fact observes `Unspecified` after SQLite reload where the DTO contract requires UTC; all ten sources have true pre/post captures |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-06/COMPOSE.md", + "line": 80, + "text": "The browser boundary distinguishes actual isolated HTTP/SQLite draft persistence from capability/delivery presentation fixtures. One case permits real `/email/send` only after independently proving the fresh owner has no Gmail connection: the server must record `failed/reauthorization_required` before delivery. Its failed-only new-attempt response is real. Other send requests are blocked or fulfilled by labelled browser fixtures. Uncertain/pending/sending/sent/generic409 UI states do not prove provider persistence or successful delivery. No external recipient is sent mail, and no provider grant, Google/Outlook/IMAP execution, Gmail sync/import/create/unlink or model call is authorized by this evidence.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-06/INBOX.md", + "line": 51, + "text": "Native proof distinguishes actual owned HTTP/SQLite correspondence reads and a nonlinked review-decision POST from controlled provider/review projections. The saved-list/detail/order/page/owner checks use disposable SQLite. Live-provider failure and the paired review queue use explicit local fixtures. A browser-only provider discriminator exercises fallback against real saved detail; it does not change stored provider data. The review recovery queue projects the actual decision response and is not independent provider persistence readback.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-06/README.md", + "line": 17, + "text": "Draft/setup errors use durable GET-only Retry. A successful write followed by a failed list refresh retains actual saved identity and never repeats the write. Late completions cannot mutate a different or unmounted draft. Current-locale feedback, shared headings/density/focus and character-counter contrast use existing infrastructure. Four DTO date expressions mark existing UTC values consistently after SQLite round trips; ticks, stored data, ownership, revisions and content are unchanged.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-06/evidence/compose-results.json", + "line": 3093, + "text": " \"nativeQualifications\": \"Real isolated SQLite owner jobs/draft CRUD/revision conflicts/failed-only identity/readback and actual disconnected Gmail server409Failed before delivery. Browser provider capabilities and pending/sending/uncertain/sent/generic409 are labelled fixtures, not actual provider deliveries. Exact sent-cleanup DELETE is real. No grants, sync, external mail/model or distributed delivery qualification.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-06/evidence/inbox-results.json", + "line": 1183, + "text": " \"scopeLimits\": \"Owned SQLite saved list/detail/GET recovery are real HTTP. Provider status/live-copy and review queue use explicit fixtures; one real owner-local nonlinked rejected decision is persisted. Queue refresh projects its real POSTDTO and is not independent live-provider readback. Sync/create recovery and tenant ownership have unit/controller proof, not actual grants/mailbox sync/distributed creation idempotency. Draft/send safety remains mandatory third boundary.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/CONTRACT.md", + "line": 39, + "text": "The service executes **two parameterized SELECT commands**: filtered count and a database `LIMIT`/`OFFSET` page. It does not materialize the complete collection to sort in memory. A 128-item SQLite fixture proves a seven-row second page, exact count, two read commands and unchanged database bytes. Invalid parameters fail before catalog queries. Search covers names/role/company/captured CV name, never private content snippets. SQL computes existing text presence without projecting bodies, Notes, settings/profile JSON, rendered HTML, storage paths, recipient/thread/request identities or bytes to the response. No renderer, AI, file-copy or listing-write dependency is registered in the contract fixture.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/CONTRACT.md", + "line": 41, + "text": "SQLite ordering separates whole UTC seconds from seven fractional digits to preserve exact instants, offsets and one-tick differences. Unknown dates and uploads whose original local timezone was not recorded sort last in both date directions. Uploads retain their raw unzoned wall-clock value as `uploaded-local`; no UTC instant is fabricated. MariaDB SQL composes `TIMESTAMPDIFF(MICROSECOND, …) * 10`; live MariaDB execution and production precision remain unverified.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/CONTRACT.md", + "line": 50, + "text": "| Initial controller HTTP RED | **0 pass/11 fail**, 11:12:34.372367–11:12:50.335904; missing endpoint returns 404. Eleven ordinary Kestrel/SQLite tests use controlled test identities, not actual Program cookies |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/CONTRACT.md", + "line": 58, + "text": "| Actual Program current-API native | **3 PASS**, 15:54:17.479545–15:54:29.733344; actual local Identity cookies, disposable SQLite, independent A/B owners and existing CSRF-protected source mutations |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/CONTRACT.md", + "line": 65, + "text": "Pomelo `ToQueryString()` displays literal pagination values. The corrected test separately inspects an **actual, unexecuted DbCommand**, proving distinct bound LIMIT/OFFSET parameters with expected values and owner binding. This is opaque SQL composition evidence: **11 SQLite HTTP cases + one MariaDB composition case**, not twelve provider executions or a TCP/server qualification.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/README.md", + "line": 19, + "text": "New ordinary HTTP regressions must fail against the missing endpoint before implementation, then pass with native SQLite. Cover every source, A/B/anonymous isolation, search/filter/count/pagination, literal wildcard characters, stable ties, offset/fractional dates, unknown-date placement, malformed relationships and source-history preservation. Inspect commands for count/order/limit/offset and absence of resource-body projection or writes. Listing must never render PDF, invoke AI, capture a package or access file storage.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/README.md", + "line": 21, + "text": "Keep ordinary P2-D01 and exact frozen HTML/letter/archive-byte proof. The old Phase3 P2-D01 blocker is historical: the latest ordinary browser case passes in [P7-06](../p7-06/COMPOSE.md). Source actions retain existing ownership, CV association/detach rules, revision semantics and safe downloads. Native SQLite and MariaDB SQL composition are separate evidence; unexecuted MariaDB behavior cannot become production acceptance.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/README.md", + "line": 29, + "text": "[Contract report](CONTRACT.md) and [portable results](evidence/contract-results.json) record final12/12 new contracts,80/80 related/auth/draft cases and actualProgram/nativeSQLite cookie3/3 plus ordinaryP2-D01PASS. Full .NET whitespace semantics, ordinal Unicode marker handling, actual bound pagination parameters, frozen metadata/bytes and strict tenant cases retain ordinary assertions. All failed attempts and source/timing qualifications remain. Final26/33/23 sources and binaries match; Release compilation and browser types pass. There is no DocumentsUI/axe/physical/human acceptance yet, and actualMariaDB execution remains unverified. Derivedbackend1053/browser304/frontend739/94 are not integrated passing counts. Hygiene and normal development push follow; the UI starts only after verified contract push.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/contract-results.json", + "line": 64, + "text": " \"qualification\": \"12ordinaryPASS:11loopbackHTTP/nativeSQLite cases with controlled fixed test claims, one actual unexecuted MariaDB command/query composition policy. Real provider execution and productionJWT are not inferred from this fixture.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/contract-results.json", + "line": 78, + "text": " \"FullyQualifiedName~SqliteDateTimeOffsetCompatibilityTests|FullyQualifiedName~ApplicationAssetsTests|FullyQualifiedName~ApplicationWorkspaceTests|FullyQualifiedName~SubmittedApplicationPackageTests|FullyQualifiedName~AttachmentsControllerTests|FullyQualifiedName~ApiAuthorizationPostureTests|FullyQualifiedName~SessionContextMiddlewareTests|FullyQualifiedName~EmailDraftsControllerTests|FullyQualifiedName~EmailDraftPersistenceTests|FullyQualifiedName~EmailSendControllerTests|FullyQualifiedName~EmailSendAttemptStoreTests\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/contract-results.json", + "line": 126, + "text": " \"SqliteDateTimeOffsetCompatibilityTests\": 5,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/contract-results.json", + "line": 129, + "text": " \"qualification\": \"80existingordinaryPASS, samefinalReleaseDLL/no-build:37 document/archive/SQLite contracts,25draft/send guards,18authposture/session. Not additive cases or whole backend acceptance.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/entry.json", + "line": 123, + "text": " \"FullyQualifiedName~SqliteDateTimeOffsetCompatibilityTests|FullyQualifiedName~ApplicationAssetsTests|FullyQualifiedName~ApplicationWorkspaceTests|FullyQualifiedName~SubmittedApplicationPackageTests|FullyQualifiedName~AttachmentsControllerTests\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 933, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 997, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1061, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1125, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1189, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1253, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1317, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1381, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1445, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1509, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1573, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1637, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1701, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1765, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 1829, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-07/evidence/ui-results.json", + "line": 3519, + "text": " \"All existing RD01-RD28 and conditional human/device/provider/production-output gates retained; actual MariaDB runtime not qualified by SQLite/command composition.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/README.md", + "line": 61, + "text": "The [UTC repair report](UTC_TRANSPORT.md) and [portable results](evidence/utc-results.json) record ordinary **3 pass / 1 fail RED**, then **4/4 GREEN** and **73/73 related consumers**. Seven DTO projections label stored UTC ticks without conversion, data writes or schema/auth/queue changes. This gate proves real SQLite/direct-controller Web JSON. Later actual Program/cookie native cases additionally observe available operation/notification UTC fields over HTTP; null hosted fields do not establish all-seven-field coverage. The published repair remains separate from presentation acceptance.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/UTC_TRANSPORT.md", + "line": 3, + "text": "**SQLite/direct-controller and bounded available-field HTTP scope: CONDITIONAL GO; hygiene PASS, separate repair commit and normal push verified.** Full hosted date coverage and manual/production acceptance remain unverified. This bounded compatibility repair precedes the two [P7-08 presentation boundaries](README.md). [Portable UTC results](evidence/utc-results.json) retain exact commands, reports, source observations and qualifications; the later native observation is bounded below.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/UTC_TRANSPORT.md", + "line": 7, + "text": "Fresh SQLite materialization drops `DateTime.Kind` from stored UTC fields. The ordinary regression observes Web JSON `createdAtUtc` as **`2026-10-16T08:09:10.1234567`**, missing the required `Z`. A browser can therefore interpret the recorded UTC instant as local wall time.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/UTC_TRANSPORT.md", + "line": 19, + "text": "| Ordinary UTC RED | **3 pass / 1 fail of 4**, **16:34:10.428105–16:34:31.629894**, `p708-utc-red-20261016T163410Z`. The new case fails on missing `Z` after fresh SQLite reload; four captured inputs match before/after |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/UTC_TRANSPORT.md", + "line": 23, + "text": "The new ordinary Fact uses distinct deterministic seven-digit fractional ticks for all seven dates, disposes the seeding context, then proves SQLite's materialized values have `Unspecified` kind. It invokes the actual controllers directly and serializes their DTOs with `JsonSerializerDefaults.Web`: Get/List agree, public field sets remain exact, every date has `Z`/zero offset/original ticks, and fresh persisted rows remain identical after reads.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/UTC_TRANSPORT.md", + "line": 33, + "text": "The four-case/73-consumer gate uses **real disk-backed SQLite and direct-controller Web JSON serialization**. It hosts no HTTP server or cookie middleware. Test names containing “API” do not change that boundary. The separate hosted observation below supplements this gate; it does not replace the all-seven-field deterministic precision proof. MariaDB, external provider/model execution, human/device/output and production release remain unverified.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 853, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 926, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1005, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1084, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1163, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1236, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1309, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1382, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1455, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1528, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1601, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1674, + "text": " \"boundary\": \"Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 1962, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2043, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2124, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2205, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2286, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2367, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2448, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2529, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2610, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2691, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2772, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2853, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 2934, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/operations-results.json", + "line": 3015, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 605, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 686, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 767, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 848, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 929, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1010, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1091, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1172, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1253, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1334, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1415, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1496, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1577, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 1658, + "text": " \"boundary\": \"Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2255, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2319, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2383, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2447, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2511, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2575, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2639, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2703, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2767, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2831, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2895, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 2959, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 3023, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 3087, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 3151, + "text": " \"boundary\": \"Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/recent-results.json", + "line": 4772, + "text": " \"limits\": \"Only guarded own temporary real SQLite database, exact owner/schema and one inert queued operation INSERT. Existing authenticated Cancel produces actual notice; no worker/provider/model execution. Controlled GET link/longtext projections are explicitly labelled.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/utc-results.json", + "line": 6, + "text": " \"status\": \"LOCAL_CONTROLLER_SQLITE_SCOPE_CONDITIONAL_GO_HTTP_AND_PUSH_PENDING\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/utc-results.json", + "line": 7, + "text": " \"problem\": \"Fresh SQLite materialization loses DateTime.Kind; current Web JSON omits Z on fields defined as UTC, allowing browsers to interpret an instant as local time.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/utc-results.json", + "line": 74, + "text": " \"name\": \"JobTrackerApi.Tests.OperationsControllerTests.Operation_and_notification_DTOs_preserve_all_UTC_instants_after_SQLite_roundtrips\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/utc-results.json", + "line": 176, + "text": " \"name\": \"JobTrackerApi.Tests.OperationsControllerTests.Operation_and_notification_DTOs_preserve_all_UTC_instants_after_SQLite_roundtrips\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/utc-results.json", + "line": 778, + "text": " \"Five operation dates and two notification dates use deterministic distinct seven-digit fractional ticks after disposal and fresh SQLite read contexts.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-08/evidence/utc-results.json", + "line": 785, + "text": " \"Real disk-backed SQLite plus direct-controller Web JSON serialization; this gate does not host HTTP/cookie middleware.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-09/COMPANY_CREATE_COMPATIBILITY.md", + "line": 3, + "text": "The actual JSON export/import journey exposed a backend prerequisite: importing the exact existing Norwegian company name created a second company. SQLite's default `LOWER()` handles ASCII while the bound .NET lower-case parameter folds Norwegian letters. The previous comparison therefore missed an exact existing name containing `Æ`, `Ø` or `Ã…`. The original failing import trace and the candidate repair evidence remain under `.artifacts/phase7/p7-09/`; the importer does not work around the server by changing company names.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-09/COMPANY_CREATE_COMPATIBILITY.md", + "line": 7, + "text": "Three real SQLite regression cases prove exact Norwegian-name reuse without overwriting existing fields, retained ASCII case-insensitive reuse, and separate owned creation when an identical foreign company exists. The last case also verifies retained foreign metadata and source normalization. Fresh Release compilation and these three cases pass. A fresh unfiltered backend run passes **1,057/1,057**, zero skipped, at **20 October 2026 07:05:21–07:05:38 UTC**. The increase from 1,054 is exactly these three ordinary cases; existing cases were not removed or weakened.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/CURRENT_FAILURES.md", + "line": 3, + "text": "This is investigation evidence, not final acceptance. The ordinary351-case run started05:32:57UTC against [patched entry](evidence/patched-entry.json), with zero configured retries. It was explicitly stopped05:55:08UTC after144passing and3failing logged cases; passing partial output does not establish a passing suite. [Raw hashes](evidence/lock-observation.json) and the [subsequent bounded repair](SQLITE_CONCURRENCY.md) preserve the distinction between this failed attempt and successor verification.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/CURRENT_FAILURES.md", + "line": 5, + "text": "## Reproduced SQLite failures", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/CURRENT_FAILURES.md", + "line": 7, + "text": "The ordinary Audit persistence case77 again receives500 from `GET /api/jobapplications/328` after successful owned Restore. Captured API output now identifies `Microsoft.Data.Sqlite.SqliteException`, SQLite error5 (`database is locked`), propagated through `AiUsageMeter.ReserveAsync` line65, `MeteredSummarizerService.MeterAsync` line75 and `JobApplicationsController.GetById` line656. The request failed in12ms. This supersedes the earlier absence of a server stack; it does not establish the competing lock holder or justify an untested retry.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/CURRENT_FAILURES.md", + "line": 9, + "text": "The ordinary application-form locale case93 also fails its unchanged expected204 assertion: `PUT /api/auth/preferences/language` returns500 in5ms with the same SQLite error5. The affected behavior is therefore broader than AI metering. Further diagnosis must preserve quota accounting, persistence, tenant filters and the original browser assertions. A passing isolated rerun cannot close this intermittent issue.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/FINAL_ACCEPTANCE.md", + "line": 11, + "text": "The shared confirmation transition now preserves deliberate focus; administrator last-admin help names remain attached to their controls. SQLite startup enables WAL before reconciliation, supported by deterministic reader/write and committed-WAL backup contracts. Populated administrator pagination and language/export lifetime browser consumers were corrected without relaxing their security or persistence assertions. All failed and interrupted attempts remain recorded in the repair reports. A passing successor does not erase them.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/FINAL_ACCEPTANCE.md", + "line": 39, + "text": "Carry forward the [debt register](../DEBT.md), especially historical Dashboard preference-save reliability, Rules/CV unsaved-state observations, concurrency uncertainty beyond the reproduced SQLite mechanism, Board full-result scaling, deferred followMode/P5-05, real provider operations and manual/output acceptance. Passing finite diagnostics does not close historical intermittent failures without causal evidence.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/FIXTURE_ISOLATION.md", + "line": 11, + "text": "An earlier Audit GET of the restored owned job328 returned500. It does not follow from later self-demotion. A read-only SQLite backup into an isolated diagnostic data root and an authenticated GET returned200; the combined successor case also passes. Root cause remains unproven. Do not close the intermittent read debt from these successful continuations. The ordinary browser backend now pipes Warning/error logs so future500responses retain server diagnostics without verbose SQL logging.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/README.md", + "line": 11, + "text": "Latest source is clean/directly synchronized development `2f772e132274e75a05deb0a0dd363dadebc9175a`, verified06:05:08UTC. [WAL successor identity](evidence/wal-entry.json) freezes792runtime inputs and rebuilt API/test assemblies before the new complete run06:05:40UTC. This supersedes the earlier791-input snapshots. The [SQLite concurrency repair](SQLITE_CONCURRENCY.md) reproduces the same write stack deterministically, enables WAL before SQLite reconciliation and passes1060backend cases,6focused cases and17affected native cases. The [pagination fixture](USERS_PAGINATION.md) navigates the actual populated desktop grid. Both are separately committed/pushed; no product assertion or timeout is weakened. Full351-case browser and separate lanes remain in progress, with no final acceptance claim.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/README.md", + "line": 13, + "text": "The prior patched-source attempt was explicitly stopped05:55:08UTC after144passing and3failing logged cases. [Failure observations](CURRENT_FAILURES.md) and [raw hashes](evidence/lock-observation.json) retain both SQLite client failures and the first-page fixture assumption. Release838 independently failed with matching Node/Jest SIGSEGV cores and deployment skipped; main5f835e5/live/model qualification remains separate and production NO-GO. Older observations below remain chronological.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/SOURCE_COMMITS.md", + "line": 11, + "text": "| `01281f52d9279ecdbd3363a11d2e9cb71230bf49` | 2026-10-12T02:06:27+02:00 | fix(career): preserve evidence listing on SQLite |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/SOURCE_COMMITS.md", + "line": 77, + "text": "| `f51e0506cc6a4fdcbc6c91c8cee9f6112cdecbf0` | 2026-10-21T08:04:26+02:00 | fix(database): enable SQLite WAL before schema reconciliation |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/SQLITE_CONCURRENCY.md", + "line": 1, + "text": "# SQLite startup concurrency repair", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/SQLITE_CONCURRENCY.md", + "line": 7, + "text": "Two unchanged client assertions receive SQLite error5/HTTP500: owned restored-job readback and language preference persistence. Read-only inspection of the isolated database reports `journal_mode=delete`, `locking_mode=normal`. Actual bootstrap opens the file during reconciliation before EF's normal database creation path can establish WAL. A deterministic regression invokes that bootstrap without starting a listener, worker or provider, holds a SELECT cursor on one connection and attempts the actual usage reservation on another. Before repair it reproduces the browser's `SqliteDataRecord.Dispose → NextResult → AffectedCountModificationCommandBatch → AiUsageMeter.ReserveAsync` failure. The separate startup assertion reports expected`wal`, actual`delete`.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/SQLITE_CONCURRENCY.md", + "line": 9, + "text": "The precise competing connection in the browser was not identified. The deterministic mechanism and unsafe journal mode are demonstrated; no claim is made that WAL eliminates all possible SQLite writer contention.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/SQLITE_CONCURRENCY.md", + "line": 13, + "text": "Startup executes `PRAGMA journal_mode = WAL` once before SQLite reconciliation. The existing provider branch excludes MariaDB/MySQL. No schema, stored field, tenant filter, Identity contract, quota rule, summary output, write payload or save semantics changes. There is no new retry, swallowed exception, relaxed timeout or disabled assertion. Existing `VACUUM INTO` backup already supports WAL; [database guidance](../../../database/migrations.md) explains consistent snapshots.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/SQLITE_CONCURRENCY.md", + "line": 28, + "text": "[Portable repair evidence](evidence/sqlite-repair.json) records the exact command/TRX/log paths and byte hashes for every backend attempt and the17-case native vector. Release build is recorded under `.artifacts/phase7/current/backend-career/p702-release-20261021T060348Z/`; its historical helper label does not make it Phase2 evidence. Complete351-case regression and the separate lanes remain required.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/TERMINAL_CONSUMERS.md", + "line": 5, + "text": "The WAL-source ordinary suite completed06:05:40–07:01:53UTC with **343PASS/8FAIL/0skipped/0flaky**, zero configured retries. SQLite Audit/language persistence and populated Users pagination now pass. Ordinary P2-D01 passes as an unchanged case. The eight remaining failures are retained in [portable evidence](evidence/terminal-consumers.json); this completed failed run is not reported as acceptance.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/USERS_PAGINATION.md", + "line": 7, + "text": "The17-case ordinary Audit/Users/application-form vector passes06:00:43–06:03:24UTC, including all3Users cases and all6locale/theme width samples. It has0skips,0flaky cases and0configured retries. Browser TypeScript and lint pass05:56:28–05:56:52UTC on the changed fixture. [Native raw hashes](evidence/sqlite-repair.json) retain the overlapping vector; it adds no test cases to the351inventory.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/USERS_PAGINATION.md", + "line": 9, + "text": "The independent SQLite repair is published as `f51e0506cc6a4fdcbc6c91c8cee9f6112cdecbf0`, normally pushed/directly verified06:04:31UTC. That receipt honestly retains this fixture as its one pending path; this publication completes the separate fixture correction. Full integrated acceptance remains pending.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/completed-unit-gates.json", + "line": 359, + "text": " \"careerEvidenceSQLite\": 1,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/completed-unit-gates.json", + "line": 360, + "text": " \"companyCompatibilitySQLite\": 3,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/consumer-entry.json", + "line": 121, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/consumer-entry.json", + "line": 124, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/consumer-entry.json", + "line": 125, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/consumer-entry.json", + "line": 126, + "text": " \"JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/entry.json", + "line": 121, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/entry.json", + "line": 124, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/entry.json", + "line": 125, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-entry.json", + "line": 121, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-entry.json", + "line": 124, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-entry.json", + "line": 125, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-regression.json", + "line": 544, + "text": " \"careerEvidenceSQLite\": 1,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-regression.json", + "line": 545, + "text": " \"companyCompatibilitySQLite\": 3,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/final-regression.json", + "line": 549, + "text": " \"sqliteStartupConcurrency\": 2,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/lock-observation.json", + "line": 27, + "text": " \"sqliteReadOnlyObservation\": {", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/patched-entry.json", + "line": 121, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/patched-entry.json", + "line": 124, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/patched-entry.json", + "line": 125, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 5, + "text": " \"name\": \"p712-sqlite-wal-red-20261021T055807Z\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 16, + "text": " \"FullyQualifiedName~SqliteStartupConcurrencyTests|FullyQualifiedName~DatabaseBackupRunnerTests\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 20, + "text": " \"E:\\\\Storage\\\\Projects\\\\Active\\\\Job tracker\\\\.artifacts\\\\phase7\\\\current\\\\backend-career\\\\p712-sqlite-wal-red-20261021T055807Z\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 35, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-red-20261021T055807Z/command.json\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 39, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-red-20261021T055807Z/career.log\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 43, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-red-20261021T055807Z/career.trx\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 49, + "text": " \"name\": \"p712-sqlite-wal-green-20261021T055844Z\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 60, + "text": " \"FullyQualifiedName~SqliteStartupConcurrencyTests|FullyQualifiedName~DatabaseBackupRunnerTests\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 64, + "text": " \"E:\\\\Storage\\\\Projects\\\\Active\\\\Job tracker\\\\.artifacts\\\\phase7\\\\current\\\\backend-career\\\\p712-sqlite-wal-green-20261021T055844Z\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 79, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-green-20261021T055844Z/command.json\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 83, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-green-20261021T055844Z/career.log\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 87, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-green-20261021T055844Z/career.trx\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 93, + "text": " \"name\": \"p712-sqlite-wal-green-reopened-20261021T055934Z\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 104, + "text": " \"FullyQualifiedName~SqliteStartupConcurrencyTests|FullyQualifiedName~DatabaseBackupRunnerTests\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 108, + "text": " \"E:\\\\Storage\\\\Projects\\\\Active\\\\Job tracker\\\\.artifacts\\\\phase7\\\\current\\\\backend-career\\\\p712-sqlite-wal-green-reopened-20261021T055934Z\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 123, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-green-reopened-20261021T055934Z/command.json\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 127, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-green-reopened-20261021T055934Z/career.log\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 131, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-green-reopened-20261021T055934Z/career.trx\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 137, + "text": " \"name\": \"p712-sqlite-wal-full-20261021T055954Z\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 150, + "text": " \"E:\\\\Storage\\\\Projects\\\\Active\\\\Job tracker\\\\.artifacts\\\\phase7\\\\current\\\\backend-career\\\\p712-sqlite-wal-full-20261021T055954Z\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 165, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-full-20261021T055954Z/command.json\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 169, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-full-20261021T055954Z/career.log\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 173, + "text": " \"path\": \".artifacts/phase7/current/backend-career/p712-sqlite-wal-full-20261021T055954Z/career.trx\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/sqlite-repair.json", + "line": 205, + "text": " \"path\": \"JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/successor-entry.json", + "line": 125, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/successor-entry.json", + "line": 128, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/successor-entry.json", + "line": 129, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/test-counts.json", + "line": 165, + "text": " \"careerEvidenceSQLite\": 1,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/test-counts.json", + "line": 166, + "text": " \"companyCompatibilitySQLite\": 3,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/test-counts.json", + "line": 170, + "text": " \"sqliteStartupConcurrency\": 2,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/wal-entry.json", + "line": 121, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/wal-entry.json", + "line": 124, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/wal-entry.json", + "line": 125, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-7/p7-12/evidence/wal-entry.json", + "line": 126, + "text": " \"JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/README.md", + "line": 35, + "text": "SQLite and MariaDB use provider-neutral EF mapping and conditional updates. Explicitly check the existing SQLite startup schema reconciliation/migration infrastructure and the complete migration chain. Legacy accounts gain no layout until first Save. Language, notifications, profile, security stamps and all job/document data remain unchanged.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-01/README.md", + "line": 12, + "text": "- Corrected real browser run passed **10/10**, zero skipped/retried/flaky (`browser-corrected.json`): two retained Dashboard journeys plus eight new Phase 8 cases. Actual SQLite/API/cookies/CSRF verify saved readback, fresh browser login, logout/login, two-session conflict, isolation, reset/cancel, failure/retry and all-hidden recovery. The initial prebuilt bundle targeted port5202 instead of the isolated5302 API; its 10 failures are retained in `browser-focused.json`. Rebuild with `NEXT_PUBLIC_API_BASE_URL=http://localhost:5302/api` corrected the harness without relaxing assertions.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-03/BACKEND.md", + "line": 21, + "text": "Additive migration `20261021090000_AddDashboardLayoutPreference` adds nullable TEXT/longtext JSON and non-null INTEGER/bigint revision default 0. No new table or backfill of layout choices. The snapshot includes both properties. SQLite and MariaDB startup reconciliation intentionally leave these columns to the migration, matching the existing language preference owner; adding them before the per-migration loop would collide on fresh startup. Actual fresh and legacy file startup plus existing complete migration-chain and repeated-startup tests pass.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-03/BACKEND.md", + "line": 23, + "text": "The explicit SQLite downgrade drops only these independent columns using native SQLite `DROP COLUMN` (requires SQLite 3.35+, satisfied by the tested bundled runtime). MariaDB uses normal EF DropColumn operations. Migration-chain downgrade/upgrade tests pass; downgrade necessarily removes saved layouts. No downgrade was performed outside disposable tests.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-03/BACKEND.md", + "line": 34, + "text": "| First expanded run | dashboard + migration chain + SQLite startup + schema ownership | 25 pass / 16 fail; 15 downgrade SQL generation failures and one malformed fixture SQL | `backend-focused/dashboard-focused.trx` |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-03/BACKEND.md", + "line": 49, + "text": "rtk C:\\Users\\Connor\\.dotnet\\dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore --filter \"FullyQualifiedName~DashboardPreferencesTests|FullyQualifiedName~MigrationChainTests|FullyQualifiedName~SqliteStartupConcurrencyTests|FullyQualifiedName~StartupSchemaOwnershipTests\" --logger \"trx;LogFileName=dashboard-focused.trx\" --results-directory .artifacts/phase8/backend-focused-final", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-03/BACKEND.md", + "line": 58, + "text": "The 24 new dashboard cases use an actual local Kestrel HTTP listener, real EF SQLite files, the complete migrations and actual startup reconciliation. They verify 401, owner isolation despite an attempted query account override, GET/PUT acknowledgement, 409, concurrent first saves, unchanged unrelated account fields/stamps, stale Identity preservation, invalid/oversized/chunked payloads, all catalogue IDs/order, empty saved lists, corrupt reads, future-schema downgrade protection including a deterministic paused-body race, exact JavaScript revision bounds, legacy defaults and provider SQL generation. They also hold a SELECT reader open while saving the actual layout against the WAL file.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-04/README.md", + "line": 7, + "text": "`browser-qualification.json` records **13 passed / 0 failed, skipped, flaky or retried** in93.929s: retained two Analytics journeys, retained two Dashboard journeys and nine Phase 8 cases. Actual local API/SQLite/accounts/session cookies/CSRF are used. Explicitly controlled GET/PUT503 and route-abort transport failures exercise recovery without implying a physical network outage. Fresh contexts and real logout/login prove account persistence across browser lifetimes; these are not physically separate devices.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-05/FINAL_ACCEPTANCE.md", + "line": 36, + "text": "Actual local HTTP and cookie/session browser tests cover anonymous401, ordinary-user admin403, A/B ownership, attempted account override, stale session/CSRF, independent preference fields and logout/login/fresh-context persistence. Backend tests use a test auth handler; browser tests exercise real local cookies/session context/CSRF. Neither establishes deployed identity or proxy acceptance. SQLite held-reader/write and simultaneous-save tests pass on WAL; this is finite contention evidence, not permanent immunity. SQLite migration/startup/chain tests pass. MariaDB provider SQL generation passes; MariaDB runtime remains untested because Docker's Linux engine is unavailable.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-05/evidence/source-manifest.json", + "line": 111, + "text": " \"JobTrackerApi.Tests\\\\SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-05/evidence/source-manifest.json", + "line": 114, + "text": " \"JobTrackerApi.Tests\\\\SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-05/evidence/source-manifest.json", + "line": 115, + "text": " \"JobTrackerApi.Tests\\\\SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-8/p8-05/evidence/source-manifest.json", + "line": 116, + "text": " \"JobTrackerApi.Tests\\\\SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/PRESERVATION.md", + "line": 44, + "text": "| **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 |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/REQUEST.md", + "line": 282, + "text": "- SQLite development behaviour.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/REQUEST.md", + "line": 297, + "text": "Do not claim MariaDB runtime acceptance from SQLite-only tests.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/RISKS.md", + "line": 11, + "text": "| RD03 / F19 | PARTIAL: SQLite and generated MariaDB SQL; MariaDB runtime unavailable | High: schema/provider/startup disagreement | Database owner: actual approved MariaDB migration, restart, CRUD/constraints/concurrency and effective configuration proof | Production; provider acceptance |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/RISKS.md", + "line": 19, + "text": "| RD11 | Scoped SQLite bootstrap/WAL mechanism repaired before entry; broad reliability remains PARTIAL | High if preference save fails | Database owner: retain held-reader/write proof, distinguish old reproduced mechanism from unproven provider/contention cases | Reliability qualification |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/RISKS.md", + "line": 20, + "text": "| RD12 | PARTIAL: notification draft/failure recovery and SQLite tests; complete contention/provider behavior unqualified | Medium: settings may not persist | Database/settings owners: intended-provider overlapping writes and failure/reload recovery with no data loss | Reliability qualification |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/BASELINE.md", + "line": 13, + "text": "| Backend | 1,084 passed; 0 failed/skipped, Release, pinned SDK 9.0.317 | `.artifacts/phase9/backend/phase9.trx`; SQLite/test-host evidence, not MariaDB runtime. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/BASELINE.md", + "line": 18, + "text": "| Provider availability | Docker Linux engine pipe missing; no `mariadbd`/`mysqld` runtime found | MariaDB runtime NOT TESTED. Do not substitute generated SQL or SQLite results. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 13, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Saved_search_filters_run_state_alert_toggle_dismiss_and_delete_survive_sqlite_readback\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 293, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteMigrationHelperTests.Export_payload_shape_can_be_serialized\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 1003, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Affected_workspace_queries_order_dates_and_preserve_owner_scope\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 1133, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"query-long\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 1268, + "text": " \"name\": \"JobTrackerApi.Tests.MigrationChainTests.Blank_sqlite_chain_reaches_latest_and_is_idempotent\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 1448, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Empty_saved_search_list_succeeds_without_discovery_calls\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 1858, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteStartupConcurrencyTests.An_open_read_cursor_does_not_block_usage_reservation_or_Identity_preference_save\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 2008, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Usage_and_extraction_run_endpoints_work_on_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 2073, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteStartupConcurrencyTests.Fresh_and_populated_startup_enable_WAL_without_changing_owned_rows\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 2508, + "text": " \"name\": \"JobTrackerApi.Tests.CareerEvidenceControllerTests.List_orders_owned_evidence_by_actual_timestamp_with_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 2683, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Foreign_and_missing_search_mutations_are_denied_without_provider_or_writes(missing: True)\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 3193, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Foreign_and_missing_search_mutations_are_denied_without_provider_or_writes(missing: False)\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 3288, + "text": " \"name\": \"JobTrackerApi.Tests.OperationsControllerTests.Operation_and_notification_DTOs_preserve_all_UTC_instants_after_SQLite_roundtrips\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 3443, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.List_reads_owned_persisted_summaries_in_descending_instant_order\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 3553, + "text": " \"name\": \"JobTrackerApi.Tests.EmailDraftsControllerTests.Draft_DTO_timestamps_keep_UTC_shape_and_exact_ticks_after_SQLite_roundtrips\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 3563, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"location-long\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 3843, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.MariaDb_branch_translates_the_same_date_ordering_and_range_queries\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 4343, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Saved_search_endpoints_require_a_current_owner\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 4673, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Native_sparse_capture_and_missing_attachment_retry_never_publish_partial_packages\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 4768, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"name-long\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 4928, + "text": " \"name\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"name-empty\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/backend-cases.json", + "line": 4938, + "text": " \"name\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Tailoring_and_submission_capture_work_on_native_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/discovered-cases.json", + "line": 828, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/inventory.json", + "line": 342, + "text": " \"historicGap\": \"P2-D01 SQLite tailoring ordering blocks successful real-browser guidance; actual attach→render relationship beyond existing service coverage\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/inventory.json", + "line": 362, + "text": " \"historicGap\": \"P2-D01 expected failure: SQLite capture 500. NEW post-capture mutation/archive assertions are NOT reached. Require real storage/provider success before package restructuring\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/inventory.json", + "line": 2403, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/inventory.json", + "line": 2406, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/inventory.json", + "line": 2407, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/inventory.json", + "line": 2408, + "text": " \"JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-admin-fixture.json", + "line": 798, + "text": " \"JobTrackerApi.Tests\\\\SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-admin-fixture.json", + "line": 801, + "text": " \"JobTrackerApi.Tests\\\\SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-admin-fixture.json", + "line": 802, + "text": " \"JobTrackerApi.Tests\\\\SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-admin-fixture.json", + "line": 803, + "text": " \"JobTrackerApi.Tests\\\\SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-cta.json", + "line": 798, + "text": " \"JobTrackerApi.Tests\\\\SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-cta.json", + "line": 801, + "text": " \"JobTrackerApi.Tests\\\\SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-cta.json", + "line": 802, + "text": " \"JobTrackerApi.Tests\\\\SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-cta.json", + "line": 803, + "text": " \"JobTrackerApi.Tests\\\\SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-worker-isolation.json", + "line": 798, + "text": " \"JobTrackerApi.Tests\\\\SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-worker-isolation.json", + "line": 801, + "text": " \"JobTrackerApi.Tests\\\\SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-worker-isolation.json", + "line": 802, + "text": " \"JobTrackerApi.Tests\\\\SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest-before-worker-isolation.json", + "line": 803, + "text": " \"JobTrackerApi.Tests\\\\SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest.json", + "line": 798, + "text": " \"JobTrackerApi.Tests\\\\SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest.json", + "line": 801, + "text": " \"JobTrackerApi.Tests\\\\SqliteDateTimeOffsetCompatibilityTests.cs\": \"be2a965d71ffdb2b17cc220e682d50fc65af97d6da3ad571f082a0c9aac5a758\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest.json", + "line": 802, + "text": " \"JobTrackerApi.Tests\\\\SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-00/source-manifest.json", + "line": 803, + "text": " \"JobTrackerApi.Tests\\\\SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-01/ordinary-cases.json", + "line": 7355, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-04/RD21_CONCURRENCY_ISSUE.md", + "line": 3, + "text": "**Severity: High. Status: reproduced / unresolved. Safety qualification: FAIL.** This is an existing risk carried from Phase 7, now reproduced with two independently authenticated local clients on isolated synthetic SQLite. The characterization test passing means the observations were captured; it does not mean writes are safe.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-04/RD21_CONCURRENCY_ISSUE.md", + "line": 26, + "text": "- SQLite and supported MariaDB runtime evidence, including constraints, held readers/writers and partial failure.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-04/README.md", + "line": 5, + "text": "The complete backend run passed **1,084/1,084**, no failures/skips, on unchanged backend source. [Exact per-case results](../p9-00/backend-cases.json) retain migration-chain/startup/schema ownership, SQLite WAL/held-reader/parallel writes, dashboard owner-and-revision comparisons, unsafe/future-schema/body-limit guards, CV revision/restore, account isolation, session revocation/context/CSRF, admin/last-admin/self guards, document ownership, attachment validation, import URL/transport protections, account export/deletion and sidecar admission contracts. Test-host authentication and SQLite are identified as such; test names do not certify a deployed endpoint.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-05/README.md", + "line": 23, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-05/diagnostics/sustained.spec.ts", + "line": 96, + "text": " environment: { platform: os.platform(), cpus: os.cpus().length, totalMemoryBytes: os.totalmem(), browser: context.browser()?.version(), database: 'isolated SQLite', frontend: 'production static export' },", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-05/performance.json", + "line": 15, + "text": " \"database\": \"isolated SQLite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-05/volume-results.json", + "line": 9, + "text": " \"limits\": \"Native isolated SQLite API; no100-row history UI or MariaDB/long-term capacity claim.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-05/volume/README.md", + "line": 7, + "text": "| 100 CV revisions | Exact descending1–100 membership; stale99 save rejected409 without appending history; restoring revision2 appends101 with its original headline; canonical Career readback unchanged | Isolated SQLite API. No100-row history UI, MariaDB, long-term growth or real model claim |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-05/volume/volume.spec.ts", + "line": 45, + "text": " await info.attach('phase9-volume-cv', { body: JSON.stringify({ savedRevisions: 100, finalVersions: 101, staleStatus: 409, canonicalUnchanged: true, limits: 'Native isolated SQLite API; no100-row history UI or MariaDB/long-term capacity claim.' }), contentType: 'application/json' });", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-06/README.md", + "line": 15, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-07/FINAL_ACCEPTANCE.md", + "line": 30, + "text": "| Backend Release | **1,084 passed**, 0 failed/skipped. Unchanged backend source/assembly; isolated SQLite/test-host evidence. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-07/FINAL_ACCEPTANCE.md", + "line": 54, + "text": "- **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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-07/FINAL_ACCEPTANCE.md", + "line": 61, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/p9-07/FINAL_ACCEPTANCE.md", + "line": 63, + "text": "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.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/preservation.json", + "line": 1027, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/preservation.json", + "line": 1034, + "text": " \"remaining\": \"Many-item/delete/keyboard/human acceptance; SQLite compatibility repaired with owner SQL preserved, full frontend/production acceptance remains qualified\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 3, + "text": "**The reproduced SQLite stale-write and partial-commit defects are repaired and locally verified.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 16, + "text": "| A. RD21 | **UNRESOLVED (qualification).** SQLite implementation repair passes. The [original required closure evidence](../p9-04/RD21_CONCURRENCY_ISSUE.md) explicitly includes MariaDB runtime constraints, held readers/writers and partial failure. That qualification remains absent. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 19, + "text": "| D. Provider/database qualification | **SQLite verified locally; MariaDB NOT TESTED.** No inference from SQLite or SQL generation to MariaDB runtime. External providers, enabled-worker recovery and model semantics remain separate. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 26, + "text": "authenticated clients and synthetic SQLite data. Both clients read one record. A successfully", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 41, + "text": "boundary. Native SQLite RED tests capture persisted loss and partial commits; see", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 78, + "text": "| Backend Release | **1,109 passed**, zero failed/skipped, exit 0; actual SQLite persisted-state, overlap, rollback, tenant, first-save, stale restore/import and populated migration upgrade/rollback/reapply coverage. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 83, + "text": "| New remediation browser | **6 passed**, no retries/skips: original A/B ordering, independent immediate SQLite reads, navigation/refresh/new authenticated session, missing revisions, native draft retention/recovery, actual cross-origin header, successive Answers saves and fresh source entry after letter save; includes conforming bounded sustained workload. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 101, + "text": "from SQLite immediately after acknowledgement; B receives 409; A's values/history/projection", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md", + "line": 121, + "text": "from a generated SQL script or the local SQLite migration test.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/PLAN.md", + "line": 35, + "text": "SQLite persistence test reproducing stale acknowledged job replacement. Add an application", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/PRESERVATION.md", + "line": 19, + "text": "| Canonical Career and Identity projection | Guarded coherent source and single commit; stale/failed/import/restore cases query SQLite persisted state. Formal supported-provider qualification remains open. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/README.md", + "line": 3, + "text": "**SQLite repair implemented; formal RD21 UNRESOLVED, Phase 9 NO-GO, Phase 10 NO-GO,", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/RELATED_REVIEW.md", + "line": 11, + "text": "| Cover letter / application drafts / structured tailored CV | Additional SQLite tests reproduce actual acknowledged-text loss. Included in the correction; guards cover both current fields and append-only history/related draft rows. Legacy tailored text replacement fails closed too. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/RELATED_REVIEW.md", + "line": 25, + "text": "opportunity and timeline state unchanged. These are tested through actual SQLite rows, not inferred", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/REQUEST.md", + "line": 161, + "text": "Do not claim MariaDB compatibility from SQLite-only evidence.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/REVIEW_RULINGS.md", + "line": 12, + "text": "| Related text writers included | Cover-letter, application-drafts and structured tailored-CV SQLite regressions actually lost approved content before repair. Their source guards are directly related scope, not speculative blanket versioning. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/REVIEW_RULINGS.md", + "line": 17, + "text": "| Formal RD21 disposition | Original issue requires SQLite AND supported MariaDB runtime proof. Local repair passes, but missing provider qualification means formal UNRESOLVED, not an invented closure exception. |", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ROOT_CAUSE.md", + "line": 3, + "text": "Status: SQLite repair implemented and locally qualified. Formal supported-provider closure remains", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ROOT_CAUSE.md", + "line": 17, + "text": "New native SQLite tests additionally query persisted rows through independent DbContexts", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ROOT_CAUSE.md", + "line": 41, + "text": "SQLite tests reproduce the same persisted replacement through cover-letter save and application", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/ROOT_CAUSE.md", + "line": 64, + "text": "qualification is outstanding; SQLite and provider script generation", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/SAVE_CONTRACT.md", + "line": 81, + "text": "Migration `20261023090000_AddJobRevision` adds the job integer column with default 1. SQLite tests", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/SAVE_CONTRACT.md", + "line": 86, + "text": "SQLite runtime tests and provider SQL generation do not prove MariaDB runtime behavior. The local", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/before-regressions.json", + "line": 159, + "text": " \"observed\": \"Both stale and unversioned job snapshot tests returned NoContentResult instead of conflict after immediate SQLite acknowledgement check.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/browser-observations.json", + "line": 205, + "text": " \"case\": \"RD21 original two-session ordering rejects stale snapshots and preserves each acknowledged SQLite commit across navigation and a fresh session\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/browser-observations.json", + "line": 1238, + "text": " \"qualification\": \"Real stale HTTP conflict and real successful SQLite commits; network failure is a controlled browser request abort.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/browser-observations.json", + "line": 1258, + "text": " \"database\": \"isolated SQLite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/browser-observations.json", + "line": 5996, + "text": " \"limits\": \"Native isolated SQLite API; no100-row history UI or MariaDB/long-term capacity claim.\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/persistence.spec.ts", + "line": 158, + "text": "test('RD21 original two-session ordering rejects stale snapshots and preserves each acknowledged SQLite commit across navigation and a fresh session', async ({ page, owner, second, playwright, email }, info) => {", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/persistence.spec.ts", + "line": 290, + "text": " qualification: 'Real stale HTTP conflict and real successful SQLite commits; network failure is a controlled browser request abort.' });", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py", + "line": 1, + "text": "\"\"\"Read only the explicitly named synthetic owner's committed SQLite rows.\"\"\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py", + "line": 5, + "text": "import sqlite3", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py", + "line": 16, + "text": " connection = sqlite3.connect(path.as_uri() + \"?mode=ro\", uri=True)", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py", + "line": 17, + "text": " connection.row_factory = sqlite3.Row", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py", + "line": 56, + "text": " with closing(sqlite3.connect(filename)) as writer, writer:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/readonly-db-proof.py", + "line": 84, + "text": " except sqlite3.OperationalError as error:", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/diagnostics/sustained.spec.ts", + "line": 96, + "text": " environment: { platform: os.platform(), cpus: os.cpus().length, totalMemoryBytes: os.totalmem(), browser: context.browser()?.version(), database: 'isolated SQLite', frontend: 'production static export' },", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/preservation.json", + "line": 1275, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\"", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/preservation.json", + "line": 1282, + "text": " \"remaining\": \"Many-item/delete/keyboard/human acceptance; SQLite compatibility repaired with owner SQL preserved, full frontend/production acceptance remains qualified\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/final-fix-report.md", + "line": 13, + "text": "- `final-fix-browser-red.log`: 2 failed against the unchanged API and pre-fix static export. Actual cross-origin browser JavaScript observed a 204 but a null X-Job-Version while independent SQLite already held Version 2 and the exact answer marker. The cover-save→Answers case exposed the editable answer textbox while the fresh read was held.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/final-fix-report.md", + "line": 44, + "text": "- Browser: **2 passed**, final-fix-browser-green.log/json. Actual JS fetch sees the committed revision; two native consecutive Answers saves acknowledge success and advance revisions with independently read SQLite answer markers. Native cover-letter save advances the shared job revision; subsequent held Answers-entry read exposes no answer textbox; released snapshot allows native answer save using the cover-letter revision and preserves both persisted fields. Attachments contain revision observations and SQLite rows.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/final-fix-report.md", + "line": 47, + "text": "The controlled browser servers use isolated synthetic SQLite data and localhost ports 3300/5302. Existing isolated migration/DataProtection and NO_COLOR/FORCE_COLOR startup warnings remain in logs. No external service calls, production operations or real user data were used.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/final-re-review.md", + "line": 7, + "text": "1. **Committed revision header hidden by CORS: ADDRESSED.** `JobTrackerApi/Program.cs:151` explicitly exposes `X-Job-Version` through the existing allowlisted, credentialed policy. The client still rejects missing/invalid committed revisions. The new browser test reads the header using actual page JavaScript and performs two consecutive native Answers saves with direct SQLite assertions, covering the original browser-specific failure rather than only APIRequestContext headers.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/final-re-review.md", + "line": 19, + "text": "Both code-review findings are closed at `1b89a77`. Broader backend/frontend/browser qualification remains coordinator-owned. Required MariaDB runtime qualification remains unavailable: **formal RD21 closure remains UNRESOLVED** under the unchanged acceptance criteria, even where SQLite implementation evidence passes. This is not Phase 9, Phase 10, production or merge authorization.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/progress.md", + "line": 8, + "text": "- Task 1: implemented and reviewed with no material findings; 14 dedicated SQLite cases included in full backend 1,109 passing. Report task-1-report.md, review task-1-review.md. Remaining MariaDB runtime lane explicit.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/progress.md", + "line": 9, + "text": "- Task 2: coordinator job infrastructure/related writers and tests implemented. Eight dedicated SQLite cases, three legacy bypass cases (replace one obsolete legacy success test), one migration upgrade/rollback case. Full Release backend 1,109 passed, zero failed/skipped. Backend review requested before commit.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/progress.md", + "line": 11, + "text": "- Task 4: browser_proof writing isolated direct-SQLite/navigation/session journey. Root full sidecar 56 passed (model load disabled), offline security/tooling checks all exit 0. Browser/build lanes pending frontend completion.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/progress.md", + "line": 23, + "text": "Ruling: formal RD21 closure remains UNRESOLVED because the authoritative issue explicitly requires SQLite AND supported MariaDB runtime evidence. Local SQLite implementation can be repaired/verified without falsely closing the full supported-provider requirement. All Docker contexts have absent pipes and no native MariaDB/MySQL command/common installation exists; no install/restart/network fetch attempted.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/progress.md", + "line": 26, + "text": "Ruling: related cover letter/application-drafts/structured tailored-CV losses were reproduced directly in SQLite before adding source guards; include them in this repair. Close obsolete /auth/profile projection-only bypass with an explicit 400 and canonical endpoint guidance.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/task-1-review.md", + "line": 9, + "text": "Evidence boundary: test source and the worker's report were inspected; their executions were not independently repeated. The first-save SQLite test starts competing requests after both editors read revision zero; it does not independently exercise the MySQL duplicate-index error branch. Actual MariaDB transaction/constraint qualification, full backend regression and frontend/browser acknowledgement/retention remain coordinator-owned. The worker report explicitly preserves these qualifications and marks its newest revision-zero raw-text case pending the next coordinator run.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/reviews/task-2-review.md", + "line": 11, + "text": "Evidence inspected: `.artifacts/rd21/backend-full/backend-full.trx` counters report 1109 executed/passed, zero failed, error, timeout, aborted or notExecuted. No tests, migrations, servers or network calls were run during this review. The migration regression source covers SQLite upgrade/rollback/content preservation. These checks do not qualify actual MariaDB behavior, browser/session draft retention, or production deployment.", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/source-manifest.json", + "line": 851, + "text": " \"JobTrackerApi.Tests/SavedJobSearchSqliteTests.cs\": \"cce4ec28606b53a4756f6056afbc4ae626cdcb6f624a85ede0268cacd6c1bf50\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/source-manifest.json", + "line": 854, + "text": " \"JobTrackerApi.Tests/SqliteDateTimeOffsetCompatibilityTests.cs\": \"39bada1e50303e250b529efaea96a8a4c0738708a8ccf1bf8c9406d3728e6702\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/source-manifest.json", + "line": 855, + "text": " \"JobTrackerApi.Tests/SqliteMigrationHelperTests.cs\": \"6eb8e5e73d916935afb0d1621788b35bde01e1412bebe20162be34756166ff6b\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/source-manifest.json", + "line": 856, + "text": " \"JobTrackerApi.Tests/SqliteStartupConcurrencyTests.cs\": \"536a801f74b9499340e53c2dcf1e138d00498bc1413558d64db69732f80adc1a\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 17, + "text": " \"reason\": \"SQLite implementation repaired and locally verified. Unchanged issue closure also requires supported MariaDB runtime evidence, unavailable on this host.\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 286, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Usage_and_extraction_run_endpoints_work_on_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 1157, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"name-empty\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 1573, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Affected_workspace_queries_order_dates_and_preserve_owner_scope\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 2145, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Saved_search_endpoints_require_a_current_owner\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 2275, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Foreign_and_missing_search_mutations_are_denied_without_provider_or_writes(missing: False)\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 3549, + "text": " \"testName\": \"JobTrackerApi.Tests.OperationsControllerTests.Operation_and_notification_DTOs_preserve_all_UTC_instants_after_SQLite_roundtrips\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 4329, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteMigrationHelperTests.Export_payload_shape_can_be_serialized\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 4368, + "text": " \"testName\": \"JobTrackerApi.Tests.CareerEvidenceControllerTests.List_orders_owned_evidence_by_actual_timestamp_with_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 5473, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"location-long\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 5863, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"query-long\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 7020, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.MariaDb_branch_translates_the_same_date_ordering_and_range_queries\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 7111, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Foreign_and_missing_search_mutations_are_denied_without_provider_or_writes(missing: True)\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 8008, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Native_sparse_capture_and_missing_attachment_retry_never_publish_partial_packages\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 8333, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.List_reads_owned_persisted_summaries_in_descending_instant_order\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 8463, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteStartupConcurrencyTests.Fresh_and_populated_startup_enable_WAL_without_changing_owned_rows\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 9412, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Invalid_saved_search_filters_do_not_write(invalid: \\\"name-long\\\")\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 10816, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Empty_saved_search_list_succeeds_without_discovery_calls\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 12805, + "text": " \"testName\": \"JobTrackerApi.Tests.SavedJobSearchSqliteTests.Saved_search_filters_run_state_alert_toggle_dismiss_and_delete_survive_sqlite_readback\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 13507, + "text": " \"testName\": \"JobTrackerApi.Tests.EmailDraftsControllerTests.Draft_DTO_timestamps_keep_UTC_shape_and_exact_ticks_after_SQLite_roundtrips\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 13611, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteDateTimeOffsetCompatibilityTests.Tailoring_and_submission_capture_work_on_native_sqlite\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 13897, + "text": " \"testName\": \"JobTrackerApi.Tests.MigrationChainTests.Blank_sqlite_chain_reaches_latest_and_is_idempotent\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 14079, + "text": " \"testName\": \"JobTrackerApi.Tests.SqliteStartupConcurrencyTests.An_open_read_cursor_does_not_block_usage_reservation_or_Identity_preference_save\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 20450, + "text": " \"title\": \"[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/validation.json", + "line": 22943, + "text": " \"title\": \"RD21 original two-session ordering rejects stale snapshots and preserves each acknowledged SQLite commit across navigation and a fresh session\",", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/redesign/phase-9/rd21-remediation/volume/volume.spec.ts", + "line": 45, + "text": " await info.attach('phase9-volume-cv', { body: JSON.stringify({ savedRevisions: 100, finalVersions: 101, staleStatus: 409, canonicalUnchanged: true, limits: 'Native isolated SQLite API; no100-row history UI or MariaDB/long-term capacity claim.' }), contentType: 'application/json' });", + "classification": "required_historical_or_data_preservation", + "reason": "historical_evidence" + }, + { + "file": "docs/roadmap/known-issues.md", + "line": 12, + "text": "- **Open audit carryovers verified against source:** stale CV/profile/job saves still expose version counters without a client revision precondition (F01); startup still falls back to SQLite when the provider or connection is missing (F19); and calendar export still treats unspecified `DateTime` values as UTC, so offset/DST preservation is not proven (F21).", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/roadmap/todo.md", + "line": 7, + "text": "Current21October continuation: P7-00–P7-11 implementation is published CONDITIONAL GO. [P7-12](../redesign/phase-7/p7-12/README.md) is running fresh integrated browser/separate lanes from clean published508d68e after the completed343PASS/8FAILrun and8/8consumer correction. SQLite concurrency/pagination repairs pass17affected native cases; frontend899/101, backend1060 and offline sidecar56 pass freshly. Final acceptance/report/preservation/fidelity/zoom reconciliation/publication remain. Phase8 handoff is planning only; no Phase8 implementation. Main5f835e5 is separately owner-authorized despite retained production NO-GO; release838 failed before deployment in native Node/Jest. Runner diagnosis needs privileged disk/core access; deployment/model activation remain unverified.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/roadmap/todo.md", + "line": 56, + "text": "- **P2-D01 — successor native proof:** [P5-08b readiness](../redesign/phase-5/p5-08b-readiness/README.md) repairs SQLite ordering and executes successful capture plus immutable-content/file/ZIP assertions. Its final baseline records conversion of the original expected failure into an ordinary regression. Historical reproduction remains in Phase 2. P2-O01's initial rules-500 behavior remains unconfirmed.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/roadmap/todo.md", + "line": 61, + "text": "- **P4-04-O02 — existing SQLite notification-save contention:** overlapping native preference read/write requests reproduced HTTP 500 with SQLite error 5 in two of ten local runs. The sequential UI test now awaits and requires the save response before readback; server concurrency remains unresolved. Investigate separately from page-layout/density work. [Evidence](../redesign/phase-4/p4-04/README.md).", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/roadmap/todo.md", + "line": 95, + "text": "- [x] P7-02 [onboarding guidance and Career overview/evidence](../redesign/phase-7/p7-02/README.md): entryad7b419 pushed/verified; onboarding implemented-scope CONDITIONAL GO32/13/4+types/lint/build/13 actual PNG inspections/hygiene, pushedd21501aa/direct receipt23:55:12UTC. Separate actual SQLite evidence-list repair91 guards/HTTP1/Release passed and pushed01281f52/direct receipt00:06:47UTC; unfinished Career work preserved/main unchanged. Career affected46/3/native14/fresh preservation2/types/lint/build and22 actual PNG inspections pass; implemented P7-02 CONDITIONAL GO, final Career hygiene PASS (four commands0,9docs347links0errors) and normal push8b4d5c2 directly verified05:51:04UTC, localHEAD=origin=live/clean worktree/main unchanged. Career0/99 axe incompletes/manual gates retained; fullfrontend610/backend1,034 are derived only, latest fresh full573/89 unchanged.", + "classification": "temporary_transition", + "reason": "provider_runtime" + }, + { + "file": "docs/testing/browser.md", + "line": 3, + "text": "Install Chromium once with `npx playwright install chromium`, then run `npm run test:e2e` from `job-tracker-ui/`. The harness starts isolated API/SQLite and frontend services, normally on ports 5302 and 3300. PDF and rate-limit suites use their dedicated configs.", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 6, + "text": "Run --self-check to exercise only this helper's own temporary SQLite fixtures.", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 13, + "text": "import sqlite3", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 79, + "text": " sqlite3.SQLITE_UPDATE, sqlite3.SQLITE_DELETE,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 80, + "text": " sqlite3.SQLITE_ATTACH, sqlite3.SQLITE_DETACH, sqlite3.SQLITE_ALTER_TABLE,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 81, + "text": " sqlite3.SQLITE_CREATE_TABLE, sqlite3.SQLITE_CREATE_INDEX, sqlite3.SQLITE_CREATE_TRIGGER,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 82, + "text": " sqlite3.SQLITE_CREATE_VIEW, sqlite3.SQLITE_CREATE_TEMP_TABLE, sqlite3.SQLITE_CREATE_TEMP_INDEX,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 83, + "text": " sqlite3.SQLITE_CREATE_TEMP_TRIGGER, sqlite3.SQLITE_CREATE_TEMP_VIEW,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 84, + "text": " sqlite3.SQLITE_DROP_TABLE, sqlite3.SQLITE_DROP_INDEX, sqlite3.SQLITE_DROP_TRIGGER,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 85, + "text": " sqlite3.SQLITE_DROP_VIEW, sqlite3.SQLITE_DROP_TEMP_TABLE, sqlite3.SQLITE_DROP_TEMP_INDEX,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 86, + "text": " sqlite3.SQLITE_DROP_TEMP_TRIGGER, sqlite3.SQLITE_DROP_TEMP_VIEW,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 92, + "text": " return sqlite3.SQLITE_DENY", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 93, + "text": " if action == sqlite3.SQLITE_INSERT and target != \"CvExtractionRuns\":", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 94, + "text": " return sqlite3.SQLITE_DENY", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 95, + "text": " if action == sqlite3.SQLITE_PRAGMA and target != \"table_info\":", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 96, + "text": " return sqlite3.SQLITE_DENY", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 97, + "text": " return sqlite3.SQLITE_OK", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 100, + "text": " with closing(sqlite3.connect(database.as_uri() + \"?mode=rw\", uri=True, timeout=5)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 114, + "text": " if connection.execute(\"SELECT name FROM sqlite_master WHERE type='trigger' AND tbl_name='CvExtractionRuns' LIMIT 1\").fetchone():", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 150, + "text": " with closing(sqlite3.connect(database)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 172, + "text": " with closing(sqlite3.connect(database)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 175, + "text": " rows[\"__schema__\"] = connection.execute(\"SELECT type, name, tbl_name, sql FROM sqlite_master ORDER BY type, name\").fetchall()", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 227, + "text": " with closing(sqlite3.connect(database)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 243, + "text": " with closing(sqlite3.connect(database)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 244, + "text": " connection.row_factory = sqlite3.Row", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 269, + "text": " return {\"selfCheck\": \"PASS\", \"checks\": len(passed), \"passed\": passed, \"databaseScope\": \"own temporary SQLite only\"}", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-career-review.py", + "line": 281, + "text": " except (SeedDenied, json.JSONDecodeError, sqlite3.Error) as error:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 11, + "text": "import sqlite3", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 47, + "text": " if action == sqlite3.SQLITE_INSERT:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 49, + "text": " return sqlite3.SQLITE_OK if target == \"UserOperations\" and inserts == 1 and trigger is None else sqlite3.SQLITE_DENY", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 50, + "text": " if action in {sqlite3.SQLITE_READ, sqlite3.SQLITE_SELECT, sqlite3.SQLITE_TRANSACTION, sqlite3.SQLITE_FUNCTION}:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 51, + "text": " return sqlite3.SQLITE_OK", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 52, + "text": " if action == sqlite3.SQLITE_PRAGMA and target == \"table_info\":", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 53, + "text": " return sqlite3.SQLITE_OK", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 54, + "text": " return sqlite3.SQLITE_DENY", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 79, + "text": " # EF's SQLite Guid converter writes uppercase canonical text.", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 82, + "text": " with closing(sqlite3.connect(database.as_uri() + \"?mode=rw\", uri=True, timeout=5)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 88, + "text": " raise SeedDenied(\"UserOperations must match its existing 28-column SQLite migration\")", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 95, + "text": " if connection.execute(\"SELECT name FROM sqlite_master WHERE type='trigger' AND tbl_name='UserOperations' LIMIT 1\").fetchone():", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 133, + "text": " with closing(sqlite3.connect(database)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 142, + "text": " with closing(sqlite3.connect(database)) as connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 144, + "text": " for table in (\"AspNetUsers\", \"UserOperations\", \"UserNotifications\", \"sqlite_master\")}", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 173, + "text": " with closing(sqlite3.connect(database)) as connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 174, + "text": " connection.row_factory = sqlite3.Row", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 185, + "text": " with closing(sqlite3.connect(database)) as connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 189, + "text": " except sqlite3.DatabaseError:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 206, + "text": " with closing(sqlite3.connect(database)) as connection, connection:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 219, + "text": " return {\"selfTest\": \"PASS\", \"checks\": len(passed), \"passed\": passed, \"databaseScope\": \"own direct temporary SQLite fixtures only\"}", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/helpers/seed-operation.py", + "line": 231, + "text": " except (SeedDenied, json.JSONDecodeError, sqlite3.Error, OSError) as error:", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-application-forms.spec.ts", + "line": 20, + "text": "const boundary = 'Actual owner HTTP fixtures use disposable isolated SQLite and existing application/CV/attachment APIs. Free accounts disable AI; the serial runtime disables model, delivery and alert workers. No provider/model/generation/send endpoint, raw SQL, schema or production write. Controlled precommit HTTP failures and held requests qualify scoped presentation/recovery, not network-uncertain idempotency or production reliability. Request metadata includes only fixture application/CV/file paths and bodies; no auth/CSRF/session headers. Existing seven workspace sections, CV renderer, immutable packages, one-job CV association and append-only cover history are preserved. Existing P2-D01 remains a separately executed ordinary preservation case; this file supplements that corpus. Duplicate-for-job remains two writes; created-copy/failed-attach is explicitly qualified, with no automatic second duplicate. Current AttachmentsTable and its separate ID0-download debt are outside this slice.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-career-editor.spec.ts", + "line": 294, + "text": " qualification: 'First500 is controlled transport failure; retry200 and canonical/history readbacks use actual SQLite HTTP. No canonical stale-write protection is claimed.' }), contentType: 'application/json' });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-career-import-review.spec.ts", + "line": 323, + "text": " qualification: 'Synthetic pending extraction rows seeded in isolated SQLite; all accept/history/source/document reads are actual HTTP. Null incoming artifact is intentional. CURRENT original raw is preserved; no pending-run raw or real extraction qualification is claimed. No explicit preview/render/PDF endpoint or model/provider request.' }), contentType: 'application/json' });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-career-overview.spec.ts", + "line": 106, + "text": "test('[P7-02 PRES-C04 E09] real SQLite evidence list preserves owner boundaries and existing validation', async ({ page, owner, playwright }, info) => {", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-career-overview.spec.ts", + "line": 112, + "text": " expect(listed.status(), 'the actual local SQLite HTTP list must succeed').toBe(200);", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-career-overview.spec.ts", + "line": 132, + "text": " await info.attach('native-evidence-owner-provider-contract', { body: JSON.stringify({ provider: 'Local Playwright SQLite', list200: true,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-career-source-ids.spec.ts", + "line": 161, + "text": " qualification: 'Actual canonical browser Save and local SQLite HTTP readbacks. No PDF/model/provider call; frozen full-detail/HTML proof only, no new attachment-byte proof or concurrency-protection claim.' }), contentType: 'application/json' });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-companies.spec.ts", + "line": 22, + "text": "const boundary = 'Company creation is an API fixture: the existing Companies page has no standalone create interface. Company list/detail/nine-field PUT, job creation/soft deletion and manual correspondence use the actual isolated owner HTTP API and disposable SQLite. Route-held requests continue to that API when released; explicitly controlled failures establish presentation and recovery only. No provider/model/external service is invoked. Browser request records contain only Companies method/path/query/JSON payload; direct fixture/readback requests are verified separately and no session or CSRF headers are recorded.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-companies.spec.ts", + "line": 237, + "text": " // SQLite reloads DateTime without its Kind suffix. Check every recorded UTC", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-companies.spec.ts", + "line": 285, + "text": " excludedDeletedContactId: deletedContact.id, denials, boundary, qualification: 'Actual native owner/foreign/anonymous HTTP and SQLite readbacks; no intercepted response in these admission/projection checks.' }), contentType: 'application/json' });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts", + "line": 16, + "text": "const boundary = 'Real owner job and email-draft create/list/detail/update/delete/new-attempt contracts use isolated disposable SQLite. Browser provider capability is an explicitly labelled presentation fixture; no provider grant or connection is installed. One case permits the real email/send request only after independently proving the fresh owner has no Gmail connection: the server records failed/reauthorization_required before delivery, and its failed-only new-attempt response is real. Every other send endpoint is blocked or fulfilled by explicitly labelled browser fixtures, never a provider delivery. Intercepted uncertain/pending/sending/sent/generic409 states prove UI safeguards, not provider persistence, delivery, model or production qualification. Free accounts and disabled delivery/model/alert workers remain required. No Gmail sync/import/create/unlink, external provider/model, raw SQL/schema, production or deployment action. Receipt bodies contain fixture fields and identities only; no credentials/CSRF/session headers. All enabled axe rules and target-size, complete incomplete vectors, finite keyboard/reflow images and strict language HTTP204 assertions do not replace human reader, device/software keyboard, real zoom, font/photo or production evidence.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-correspondence-read.spec.ts", + "line": 18, + "text": "const boundary = 'Actual owner correspondence POST/page/message/job reads and local nonlinked review-decision POST use disposable isolated SQLite. Provider status/live-copy and paired Gmail queue reads are explicitly controlled local HTTP fixtures; no Google/Outlook/IMAP connection, provider import, generation/model, sync, create-suggested-job, unlink, compose/draft/save/send or delivery request is executed. Manual correspondence DTOs remain provider=manual on the real server. One provider-copy case changes only the browser projection discriminator for one actual-owned row to exercise live-copy fallback; stored body/detail/readback remain actual owner HTTP. Review queue projections are not provider qualification or independent persistence readback. Free accounts and explicit runtime worker disables prevent model/delivery. No raw SQL/schema/production writes; request receipts exclude credentials/CSRF/session headers. Finite all-enabled axe/target-size/keyboard images do not replace human reader, device, real zoom, font/photo or production evidence.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-discovery.spec.ts", + "line": 15, + "text": "const providerBoundary = 'Saved-search list/create/alert PATCH/delete and readbacks use the real isolated owner API and disposable SQLite. Browser vacancy-provider /search and owner /saved-searches/{id}/run responses are intercepted because the server provider has an external NAV base URL. Intercepted runs do not create SavedJobSearchResults: successful intercepted Dismiss establishes presentation only, never runner/history/dismiss persistence or alert delivery. A real missing-result Dismiss 404 is exercised separately. The unchanged saved-search-repair suite and backend fake-provider SQLite tests retain owner/anonymous and real runner/history contracts. External browser traffic and unregistered provider-dependent requests are blocked.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-discovery.spec.ts", + "line": 470, + "text": " qualification: 'Provider-run fixture rows do not exist in SQLite. Native 404 proves the missing-result boundary. The next two PATCHes are explicitly intercepted for keyboard/UI recovery, fallback focus and preservation of user-moved focus; unchanged real counts and reload are not successful dismissal persistence evidence.' }), contentType: 'application/json' });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-documents-contract.spec.ts", + "line": 15, + "text": "const boundary = 'Three API-only native Playwright cases run the actual Program, disposable SQLite, real local Identity login/session cookies and CSRF-protected source writes at localhost5302. Each case creates independent free A/B accounts through the existing admin/users API. The prebuilt UI server on3300 is only the existing launch fixture; no Documents UI, browser crawl, render, PDF, download, storage relocation, provider grant, send, Gmail operation or model request is executed. Metadata response receipts retain only the exact27 public keys and fixture metadata; no authentication/session/CSRF headers or source bodies. Repeated GET and independent source readback prove observable metadata/persistence, not internal service-call or SQL-command counts. No-generation dependencies, bounded database LIMIT/count and all seven resource kinds remain separately qualified by backend contract tests. These cookie-authentication cases supplement those tests, which use a controlled test identity. No schema/raw SQL/production/deployment action. Browser network guards block external origins and delivery/model endpoints if accidentally requested; all API request destinations are the fixed local API. API-only evidence does not establish migrated UI, responsive, visual, axe, human reader/device, production ingress or release readiness.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-documents.spec.ts", + "line": 25, + "text": "const boundary = 'Actual Program/local Identity cookie sessions, CSRF-protected existing source writes and owner Documents GET use disposable isolated SQLite. Setup creates seven genuine existing resource kinds; an explicit setup submitted-package capture invokes the established CV renderer once to create its immutable snapshot. Documents listing itself must issue no source-body/render/preview/PDF/export/AI/provider/send request or mutation. Existing source editors own their own reads, errors, dirty guards and saves after deliberate navigation. Attachment download is an explicit authenticated existing GET; controlled precommit503 qualifies read recovery, not uncertain delivery. Frozen package metadata/archive bytes are independently read after current CV/upload deletion. No provider grant/send/sync/import/model, raw SQL/schema, storage relocation, production/main/deployment or Phase8 action. Free accounts and disabled workers remain mandatory; external/model/delivery browser requests are blocked and recorded without credentials/CSRF/session headers. Exact27-field metadata and finite all-enabled axe/target-size vectors retain every incomplete node. UI evidence does not establish internal SQL/service-call counts, live MariaDB, human screen reader, physical touch/software keyboard, real zoom, production fonts/photos, provider qualification or production readiness. Correspondence opens its existing context without exact-ID Resume; Submission opens history without automatically selecting a package; CV PDF stays the existing explicit export operation.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-job-import.spec.ts", + "line": 14, + "text": "const boundary = 'Actual isolated Program/SQLite/local Identity/CSRF and verified Free owners; actual JSON exporter/download and native browser file chooser; existing company deduplication and additive job creates. The malformed/legacy files are explicitly constructed inputs, not projected backend successes. Only the named partial-result case relays one controlled503 after an actual job POST201 commit, then holds that reply for progress/duplicate-admission evidence. This is a new-job import, not account/history/file/CV restore. No real provider/SMTP/model request, Docker/schema/destructive/deployment/main/Phase8 action. External requests are aborted; exact Google Fonts css2 stylesheet attempts are recorded separately. Emulated viewport/themes/locales and keyboard are finite browser evidence; physical chooser/device/reader/zoom acceptance remains pending.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-notifications.spec.ts", + "line": 18, + "text": "const boundary = 'Actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-offers.spec.ts", + "line": 16, + "text": "const boundary = 'Offers, companies, non-Offer/deleted/foreign rows, dates and salary facts are created through the actual owner HTTP API in disposable isolated SQLite. Free account entitlements prohibit model use; the worker is disabled by the native configuration. Controlled GET failure/hold establish presentation and explicit recovery only. One explicitly marked legacy salary-period projection derives from an actual owned GET because the current write API normalizes unknown periods to null. No provider, model, external service, raw SQL, schema write, decision deadline, paging feature or salary conversion is introduced. Browser records exclude credentials and session/CSRF headers.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-operations.spec.ts", + "line": 18, + "text": "const boundary = 'Operations-page native workflows use the actual Program, local Identity cookies/CSRF, free owner accounts and isolated temporary SQLite. A guarded test-only helper inserts exactly one inert queued native-offline-fixture task; no registered producer/handler, AI entitlement, subject, provider/model, lease, usage or result is created. Actual cancel/retry/read/dismiss endpoints own every recorded persistent transition. Actual terminal notices have operationId and linkPath=null: no result/Open capability is inferred. Explicitly labelled controlled GET projections qualify only long-text and internal-link presentation. Controlled precommit503/held GET responses qualify UI recovery/race handling, not uncertain delivery. Every external request is aborted. Only existing HTTPS GET stylesheet requests to fonts.googleapis.com/css2 are classified separately as blocked font resources; every occurrence is retained, no font is fetched, and other external/provider/model requests remain an ordinary failing assertion. Font-resource counts are separate from forbidden provider/model counts; these captures do not qualify production fonts. No production/main/deployment, worker activation, Docker/model qualification, provider grant/send/sync, renderer or Phase8 action. Finite local Chromium/axe evidence does not establish human screen-reader, physical touch/software keyboard, actual zoom, live MariaDB, real worker execution, production font/photo or production readiness.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-reminders.spec.ts", + "line": 17, + "text": "const boundary = 'Actual owner HTTP fixtures, follow-up PATCH204, reloads, history and ownership checks use disposable isolated SQLite. Free account entitlements disable model access; the serial runtime disables AI, follow-up delivery and saved-search alert workers. No provider/model/send endpoint, raw SQL or schema is invoked. Controlled PATCH/GET failure and held requests qualify presentation and recovery, not production reliability. Browser request metadata excludes session/CSRF headers. The Shell independently requests the identical reminders?upcomingDays=14 endpoint initially and every60s; observed counts retain that source and do not claim one total GET per page. Existing absolute-millisecond-to-UTC-date scheduling and followMode route metadata are preserved; no DST/calendar or deferred composer qualification is claimed.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/phase7-settings-preferences.spec.ts", + "line": 233, + "text": " await info.attach('controlled-notification-recovery-boundary', { body: JSON.stringify({ boundary, controlled: ['first browser GET503', 'first browser PUT503 without backend write'], actual: ['Retry GET200', 'explicit retry PUT200', 'owner readback false'], autoWriteRetries: 0, locale500OrSqliteQualification: 'RD11/RD12/RD13 are not reproduced or closed by controlled503 recovery. Every unprojected response remains a strict status assertion.' }), contentType: 'application/json' });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/redesign-preservation.spec.ts", + "line": 226, + "text": " // separate SQLite defect (P4-04-O02), not this sequential UI preservation flow.", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/responsive-accessibility-audit.spec.ts", + "line": 307, + "text": " await info.attach('phase6-performance', { body: JSON.stringify({ browserVersion: context.browser()?.version(), viewport: page.viewportSize(), environment: { platform: process.platform, application: process.env.PLAYWRIGHT_STATIC_EXPORT === 'true' ? 'production static export' : 'Next development server', prebuiltExport: process.env.PLAYWRIGHT_PREBUILT_EXPORT === 'true', serverReuseAllowed: process.env.PLAYWRIGHT_REUSE_SERVERS === 'true', database: process.env.PLAYWRIGHT_REUSE_SERVERS === 'true' ? 'reused server database not independently verified' : 'isolated synthetic SQLite from native test configuration', api: 'Release API from native test configuration' }, observations, limits: ['Single reproducible diagnostic, no production budget or device qualification', 'Hard-navigation measurements include boot/auth; no React render-count inference', 'CDP heap samples are observations, not a leak diagnosis'] }), contentType: 'application/json' });", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/e2e/saved-search-repair.spec.ts", + "line": 15, + "text": "const providerBoundary = 'Saved-search listing, create, pause/resume, delete, authentication and ownership denials use the native disposable SQLite API. Only vacancy-provider output for one-off /search and the owner UI /saved-searches/{id}/run response is intercepted: NAV has a hard-coded external base URL. This browser suite does not claim runner/history persistence; backend SQLite controller tests cover the real runner with a fake IJobDiscoverySearchService. List faults are explicitly injected 500, malformed payload and delayed native GET.';", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/playwright.auth-recovery.config.ts", + "line": 7, + "text": "// synthetic SQLite and keys; no provider calls or test-only product endpoints.", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/playwright.cv-ai.config.ts", + "line": 46, + "text": " Database__Provider: \"sqlite\",", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/playwright.cv-ai.config.ts", + "line": 47, + "text": " ConnectionStrings__JobTracker: `Data Source=${path.join(dataRoot, \"readiness.sqlite\")}`,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/playwright.cv-ai.config.ts", + "line": 81, + "text": " ConnectionStrings__JobTracker: `Data Source=${path.join(dataRoot, \"production\", \"readiness.sqlite\")}`,", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "job-tracker-ui/playwright.rate-limits.config.ts", + "line": 4, + "text": "// Real API/auth middleware, fresh synthetic SQLite data, no external providers.", + "classification": "temporary_transition", + "reason": "test_coverage" + }, + { + "file": "scripts/s06-acceptance-data.sh", + "line": 214, + "text": "write_json \"$create_job_body\" \"{\\\"jobTitle\\\":$(json_string \"$JOB_TITLE\"),\\\"companyId\\\":$company_id,\\\"status\\\":$(json_string \"Waiting\"),\\\"location\\\":$(json_string \"Oslo / Hybrid\"),\\\"salary\\\":$(json_string \"NOK 900000\"),\\\"nextAction\\\":$(json_string \"Review saved package and send a manual recruiter follow-up from the linked thread.\"),\\\"followUpAt\\\":$(json_string \"$FOLLOW_UP_AT\"),\\\"notes\\\":$(json_string $'Acceptance seed notes for S06.\\n\\n<<>>\\nSaved acceptance application answer with concrete API and workflow evidence.\\n<<>>'),\\\"description\\\":$(json_string \"Lead the backend of an individual-first job tracking platform, maintain recruiter-thread continuity, and keep daily dashboard reminders trustworthy.\"),\\\"translatedDescription\\\":$(json_string \"Backend role focused on workflow trust signals, saved application package reuse, and manual-send follow-up discipline.\"),\\\"descriptionLanguage\\\":$(json_string \"en\"),\\\"tags\\\":$(json_string \"ASP.NET Core, React, SQLite, Workflow, Follow-up\"),\\\"deadline\\\":$(json_string \"2026-04-10T12:00:00Z\"),\\\"coverLetterText\\\":$(json_string \"Saved acceptance cover letter that references workflow trust signals, recruiter continuity, and measured backend delivery.\"),\\\"jobUrl\\\":$(json_string \"$JOB_URL\"),\\\"dateApplied\\\":$(json_string \"$DATE_APPLIED\"),\\\"feedbackRequestedAt\\\":null,\\\"hasResume\\\":true,\\\"hasCoverLetter\\\":true,\\\"hasPortfolio\\\":true,\\\"hasOtherAttachment\\\":false}\"", + "classification": "required_historical_or_data_preservation", + "reason": "domain_vocabulary" + }, + { + "file": "scripts/s06-acceptance-data.sh", + "line": 225, + "text": "write_json \"$update_job_body\" \"{\\\"jobTitle\\\":$(json_string \"$JOB_TITLE\"),\\\"companyId\\\":$company_id,\\\"status\\\":$(json_string \"Waiting\"),\\\"responseReceived\\\":false,\\\"responseDate\\\":null,\\\"location\\\":$(json_string \"Oslo / Hybrid\"),\\\"salary\\\":$(json_string \"NOK 900000\"),\\\"nextAction\\\":$(json_string \"Review saved package and send a manual recruiter follow-up from the linked thread.\"),\\\"followUpAt\\\":$(json_string \"$FOLLOW_UP_AT\"),\\\"hasResume\\\":true,\\\"hasCoverLetter\\\":true,\\\"hasPortfolio\\\":true,\\\"hasOtherAttachment\\\":false,\\\"notes\\\":$(json_string $'Acceptance seed notes for S06.\\n\\n<<>>\\nSaved acceptance application answer with concrete API and workflow evidence.\\n<<>>'),\\\"description\\\":$(json_string \"Lead the backend of an individual-first job tracking platform, maintain recruiter-thread continuity, and keep daily dashboard reminders trustworthy.\"),\\\"translatedDescription\\\":$(json_string \"Backend role focused on workflow trust signals, saved application package reuse, and manual-send follow-up discipline.\"),\\\"descriptionLanguage\\\":$(json_string \"en\"),\\\"tags\\\":$(json_string \"ASP.NET Core, React, SQLite, Workflow, Follow-up\"),\\\"deadline\\\":$(json_string \"2026-04-10T12:00:00Z\"),\\\"coverLetterText\\\":$(json_string \"Saved acceptance cover letter that references workflow trust signals, recruiter continuity, and measured backend delivery.\"),\\\"jobUrl\\\":$(json_string \"$JOB_URL\"),\\\"dateApplied\\\":$(json_string \"$DATE_APPLIED\"),\\\"feedbackRequestedAt\\\":null,\\\"statusChangedAt\\\":null}\"", + "classification": "required_historical_or_data_preservation", + "reason": "domain_vocabulary" + }, + { + "file": "scripts/s06-acceptance-run.sh", + "line": 106, + "text": "import sqlite3", + "classification": "temporary_transition", + "reason": "local_tool" + }, + { + "file": "scripts/s06-acceptance-run.sh", + "line": 127, + "text": "conn = sqlite3.connect(db_path)", + "classification": "temporary_transition", + "reason": "local_tool" + }, + { + "file": "scripts/s06-acceptance-run.sh", + "line": 227, + "text": "- If \"AUTH_TOKEN\" is missing and the API base is the default localhost dev target, the runner attempts a **local dev JWT fallback** using the checked-in dev JWT settings plus the local SQLite admin user so acceptance seeding can proceed without printing a token.", + "classification": "temporary_transition", + "reason": "local_tool" + }, + { + "file": "tools/hostile-fixture-db/Program.cs", + "line": 30, + "text": " .UseSqlite($\"Data Source={dbPath}\")", + "classification": "temporary_transition", + "reason": "local_tool" + }, + { + "file": "tools/hostile-fixture-db/Program.cs", + "line": 37, + "text": "var tables = await db.Database.SqlQueryRaw(\"SELECT name AS Value FROM sqlite_master WHERE type='table' ORDER BY name;\").ToListAsync();", + "classification": "temporary_transition", + "reason": "local_tool" + }, + { + "file": "tools/summarizer/app.py", + "line": 321, + "text": " \"postgres\", \"postgresql\", \"mysql\", \"sqlite\", \"mongodb\", \"redis\", \"aws\", \"azure\", \"gcp\",", + "classification": "required_historical_or_data_preservation", + "reason": "domain_vocabulary" + }, + { + "file": "tools/summarizer/app.py", + "line": 332, + "text": " \"sql\", \"postgresql\", \"postgres\", \"mysql\", \"sqlite\", \"docker\", \"kubernetes\",", + "classification": "required_historical_or_data_preservation", + "reason": "domain_vocabulary" + }, + { + "file": "tools/summarizer/tests/test_app.py", + "line": 185, + "text": " \"bullets\": [\"Full-stack job-application tracker (React, ASP.NET Core, SQLite, Docker).\"],", + "classification": "required_historical_or_data_preservation", + "reason": "domain_vocabulary" + }, + { + "file": "tools/summarizer/tests/test_app.py", + "line": 193, + "text": " response = client.post(\"/cv/classify-block\", json={\"block\": \"JobTrack - Full-stack job-application tracker (React, ASP.NET Core, SQLite, Docker).\"})", + "classification": "required_historical_or_data_preservation", + "reason": "domain_vocabulary" + } + ] +} diff --git a/docs/database/mariadb-standardisation/validation.json b/docs/database/mariadb-standardisation/validation.json new file mode 100644 index 0000000..4ce5ae4 --- /dev/null +++ b/docs/database/mariadb-standardisation/validation.json @@ -0,0 +1,530 @@ +{ + "schemaVersion": 1, + "reportDate": "2026-10-24", + "recordedUtc": "2026-10-23T23:50:33.719141+00:00", + "baselineCommit": "0d16a691e0249fe1264bf960de5e59eaa9b87fed", + "implementationCommit": "a2c9bda0d11940e4ce1fb9fe5efa80b14ab6627b", + "branch": "codex/rd21-mariadb-standardisation", + "mainUnchanged": "5f835e54a9b74e6b71418422e28431b2af06453f", + "countsPolicy": "Distinct lanes only; focused/repeated/native/WSL/Docker runs overlap and are not added into one test total.", + "finalResults": { + "backend": { + "path": ".artifacts/mariadb/final-backend/backend.trx", + "sha256": "771884e589999f625ebbe2f5da7bbc31931d82db28363734f7fe8e88d53de0dc", + "bytes": 1616177, + "counters": { + "total": "1123", + "executed": "1123", + "passed": "1123", + "failed": "0", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + } + }, + "mariaDbCompose": { + "path": ".artifacts/mariadb/compose-final/mariadb.trx", + "sha256": "4e170909ddeddaed51fe52842a4a296e2ca4315b859b1db54a36e34ab8f720d6", + "bytes": 52575, + "counters": { + "total": "32", + "executed": "32", + "passed": "32", + "failed": "0", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "cases": [ + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Database_failure_after_deletion_restores_children_history_and_revision_and_clears_tracker", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Empty_canonical_profile_preserves_legacy_raw_text_in_its_revision_zero_snapshot", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Extraction_history_returns_only_the_ten_newest_owned_runs_with_exact_metadata", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Reviewed_import_commits_or_rolls_back_canonical_projection_and_application_metadata(identitySucceeds: False)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Related_text_save_cannot_silently_replace_a_newer_acknowledged_draft(coverLetter: True)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Unsafe_or_missing_admin_configuration_fails_closed(connection: \"Server=192.0.2.1;Database=development;User ID=test\")", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Stale_tracked_entity_is_guarded_at_database_update_and_stale_restore_is_rejected", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Identity_failure_rolls_back_canonical_children_history_and_projection", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Reviewed_import_commits_or_rolls_back_canonical_projection_and_application_metadata(identitySucceeds: True)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Open_reader_does_not_block_independent_usage_and_identity_writes", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Structured_tailored_cv_snapshot_cannot_replace_a_newer_approved_document", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Rd21_additive_migration_preserves_existing_job_fields_and_backfills_revision_one", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Stale_or_unversioned_snapshot_cannot_erase_an_acknowledged_job_edit(omitRevision: False)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Competing_first_save_sources_have_one_acknowledged_winner", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Unsafe_or_missing_admin_configuration_fails_closed(connection: null)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Admin_database_name_is_never_used_as_the_test_database", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Replacement_restore_parse_and_import_fail_closed_without_valid_revision(expectedVersion: null)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Unsafe_or_missing_admin_configuration_fails_closed(connection: \"Server=database.example.test;User ID=test;Password\"\u00b7\u00b7\u00b7)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Import_acceptance_requires_the_revision_shown_in_its_diff", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Fresh_repeated_and_populated_startup_preserve_owned_data_and_complete_migrations", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.StartupAndLockTests.Full_startup_creates_every_table_and_column_required_by_the_persisted_EF_model", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Parsing_commits_or_rolls_back_its_entire_import_application(identitySucceeds: False)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Independent_stale_snapshot_cannot_replace_acknowledged_career_edit", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Failed_job_transaction_cannot_acknowledge_or_leave_partial_data_for_a_later_save", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Held_writer_timeout_rolls_back_and_a_reviewed_save_recovers_after_release", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Parsing_commits_or_rolls_back_its_entire_import_application(identitySucceeds: True)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Stale_or_unversioned_snapshot_cannot_erase_an_acknowledged_job_edit(omitRevision: True)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Editor_snapshot_uses_relational_canonical_source_and_never_writes_during_read", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Related_text_save_cannot_silently_replace_a_newer_acknowledged_draft(coverLetter: False)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21CareerPersistenceTests.Replacement_restore_parse_and_import_fail_closed_without_valid_revision(expectedVersion: -1)", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Versioned_job_save_cannot_cross_tenant_job_or_company_ownership", + "outcome": "Passed" + }, + { + "name": "JobTrackerApi.MariaDb.Tests.Rd21JobPersistenceTests.Write_that_overlaps_a_delayed_save_wins_without_partial_events_or_opportunity_changes", + "outcome": "Passed" + } + ], + "runner": { + "startedUtc": "2026-10-23T23:45:02.659493+00:00", + "finishedUtc": "2026-10-23T23:45:35.164110+00:00", + "mode": "compose", + "expectedVersion": "12.2.2", + "project": "jobtracker-it-bab4e2d90fda49aca25affafc282e335", + "exitCode": 0, + "commands": [ + { + "command": [ + "docker", + "compose", + "--project-name", + "jobtracker-it-bab4e2d90fda49aca25affafc282e335", + "--project-directory", + "E:\\Storage\\Projects\\Active\\Job tracker", + "-f", + "E:\\Storage\\Projects\\Active\\Job tracker\\docker-compose.database.yml", + "--profile", + "integration", + "up", + "-d", + "--wait", + "--wait-timeout", + "120", + "mariadb-test" + ], + "log": "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\mariadb\\compose-final\\compose-start.log", + "exitCode": 0 + }, + { + "command": [ + "C:/Users/Connor/.dotnet/dotnet.exe", + "restore", + "JobTrackerApi.MariaDb.Tests/JobTrackerApi.MariaDb.Tests.csproj", + "--locked-mode" + ], + "log": "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\mariadb\\compose-final\\restore.log", + "exitCode": 0 + }, + { + "command": [ + "C:/Users/Connor/.dotnet/dotnet.exe", + "test", + "JobTrackerApi.MariaDb.Tests/JobTrackerApi.MariaDb.Tests.csproj", + "--configuration", + "Release", + "--no-restore", + "--logger", + "trx;LogFileName=mariadb.trx", + "--results-directory", + "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\mariadb\\compose-final" + ], + "log": "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\mariadb\\compose-final\\tests.log", + "exitCode": 0 + }, + { + "command": [ + "docker", + "compose", + "--project-name", + "jobtracker-it-bab4e2d90fda49aca25affafc282e335", + "--project-directory", + "E:\\Storage\\Projects\\Active\\Job tracker", + "-f", + "E:\\Storage\\Projects\\Active\\Job tracker\\docker-compose.database.yml", + "--profile", + "integration", + "logs", + "--no-color", + "mariadb-test" + ], + "log": "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\mariadb\\compose-final\\server.log", + "exitCode": 0 + }, + { + "command": [ + "docker", + "compose", + "--project-name", + "jobtracker-it-bab4e2d90fda49aca25affafc282e335", + "--project-directory", + "E:\\Storage\\Projects\\Active\\Job tracker", + "-f", + "E:\\Storage\\Projects\\Active\\Job tracker\\docker-compose.database.yml", + "--profile", + "integration", + "rm", + "--stop", + "--force", + "mariadb-test" + ], + "log": "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\mariadb\\compose-final\\compose-cleanup.log", + "exitCode": 0 + } + ] + }, + "runnerEvidence": { + "path": ".artifacts/mariadb/compose-final/run.json", + "sha256": "08ac2f67e8007e6b83ba2e812d745bf40a0f157d4054747b6ae681a41b9b609a", + "bytes": 3047 + } + }, + "mariaDbBrowser": { + "path": ".artifacts/mariadb/browser-mariadb.json", + "sha256": "debce9f0f52d1e54001c00972c7f93be80fa2b4a2c71f75360ce1e6a55dd662e", + "bytes": 8628, + "stats": { + "startTime": "2026-10-23T23:47:33.278Z", + "duration": 12135.389000000001, + "expected": 1, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "productionQualification": false, + "process": { + "finishedUtc": "2026-10-23T23:47:45.5638011Z", + "startedUtc": "2026-10-23T23:47:32.6487673Z", + "exitCode": 0, + "generatedSchema": "jt_it_79b5902ffa2544a4a45a8eac4ae2ee3b", + "lane": "mariadb" + }, + "provider": "actual pinned Docker MariaDB12.2.2; native hosted API/Chromium/independent SQL" + }, + "historicalDiagnostics": { + "path": ".artifacts/mariadb/browser-historical.json", + "sha256": "ec9e78902125ea1edce586903cd2ea18ba0c85f0f6d85547f5d40ff96ca282fb", + "bytes": 1299337, + "stats": { + "startTime": "2026-10-23T19:06:02.726Z", + "duration": 517487.17799999996, + "expected": 18, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "productionQualification": false, + "provider": "explicit transitional SQLite; never MariaDB qualification" + }, + "historicalVolume": { + "path": ".artifacts/mariadb/browser-volume.json", + "sha256": "9511e090a792bc1c35043ebac6bee29d59d01511f37e10f08763560e9ead2bbb", + "bytes": 8513, + "stats": { + "startTime": "2026-10-23T19:14:43.927Z", + "duration": 71938.38900000001, + "expected": 3, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "productionQualification": false, + "provider": "explicit transitional SQLite; never MariaDB qualification" + }, + "guardTests": [ + { + "path": ".artifacts/mariadb/runner-guards-final.log", + "sha256": "f0b946ced5ae5487e5849e289f84c3390686622aa746b4b55ce588b9f0d94868", + "bytes": 378, + "command": [ + "python", + "scripts/test-mariadb-integration.py" + ], + "exitCode": 0, + "passed": 5, + "realDatabaseEvidence": false + }, + { + "path": ".artifacts/mariadb/browser-guards-final.log", + "sha256": "f3587abaf0d417b4b703416972bec2f3229e2e857c5d84fdf9ff275c7bac8c9c", + "bytes": 1731, + "command": [ + "node", + "--test", + "job-tracker-ui/scripts/mariadb-browser-connection.test.mjs" + ], + "exitCode": 0, + "passed": 10, + "realDatabaseEvidence": false + } + ], + "static": { + "frontendTypecheck": { + "exitCode": 0, + "evidence": { + "path": ".artifacts/mariadb/typecheck.log", + "sha256": "f00c5da05f15ad139b5ce9c171cd10193f95e04a1348638144810e4e4f6cd497", + "bytes": 150 + } + }, + "frontendLint": { + "exitCode": 0, + "finalRerun": "after ESM browser guard conversion; exec session85067" + }, + "targetedBrowserTypeScript": { + "exitCode": 0, + "command": "node node_modules/typescript/bin/tsc --noEmit --skipLibCheck --esModuleInterop --moduleResolution bundler --module esnext --target es2022 --allowJs playwright.mariadb.config.ts mariadb-tests/save-recovery.spec.ts" + } + }, + "localDevelopment": { + "serverVersion": "12.2.2-MariaDB-ubu2404", + "migrations": 51, + "apiHealth": "{\"status\":\"ok\",\"version\":\"1.0.0.0\"}", + "sqlAfterDatabaseStopStart": "VERSION()\n12.2.2-MariaDB-ubu2404\nmigrations\n51\nId\tName\tOwnerUserId\n1\tRD21 persistent development probe\trd21-dev-persistence-probe\n", + "volume": "jobtracker-local_mariadb_dev", + "preexistingVolume": false, + "volumePreserved": true, + "productionTouched": false + } + }, + "earlierFailures": [ + { + "stage": "first actual MariaDB run", + "passed": 13, + "failed": 17, + "cause": "14 missing-Identity-column failures plus3 harness mistakes; not a passing qualification" + }, + { + "stage": "schema census RED", + "missingColumns": [ + "AspNetUsers.FirstName", + "AspNetUsers.LastName", + "AspNetUsers.DisplayName" + ], + "fix": "guarded additive startup reconciliation; historical migrations untouched" + }, + { + "stage": "held writer RED", + "dirtyTrackedEntries": 4, + "cause": "Pomelo1205 wrapped outside DbUpdateException catch", + "fix": "shared update cleanup catches wrapper and rethrows; no silent retry" + }, + { + "stage": "Linux import history RED", + "failed": 1, + "cause": "DTO-projection ordering untranslatable", + "fix": "tenant-filtered entity ordering/limit before DTO projection" + }, + { + "stage": "browser with stale Release binary", + "failed": 1, + "cause": "Debug-only fix build left old Release query", + "fix": "Release rebuild1123pass and final guarded Docker browser1pass" + }, + { + "stage": "missing/unavailable/wrong-version guard probes", + "expectedFailure": true, + "qualificationPassed": false + } + ], + "supplementaryOverlappingResults": { + "nativeWindowsMariaDb": { + "passed": 31, + "artifact": "mariadb.trx" + }, + "officialLinuxFilesystemWsl": { + "passed": 32, + "artifact": "mariadb-linux-32.trx" + }, + "earlierCompose": { + "passed": 32, + "artifact": "compose-integration/mariadb.trx" + } + }, + "review": { + "independent": true, + "importantFindingsResolved": [ + "canonical browser connection prevents duplicate/alias effective-target bypass", + "both browser servers refuse reuse", + "actual SELECT VERSION checked and attached", + "test service uses bridge to avoid per-project network leak" + ], + "remainingActionableFindings": 0 + }, + "cleanup": { + "finalComposeContainerRemoved": true, + "finalComposeProjectHasNoGeneratedNetwork": true, + "earlierOwnedEmptyNetworkRemoved": true, + "browserTestContainerRemoved": true, + "developmentVolumePreserved": true + }, + "verdicts": { + "mariaDb1222Rd21": "PASS_BOUNDED_RESOLUTION", + "localDevelopment": "READY", + "ciIntegration": "LOCAL_READY_HOSTED_UNVERIFIED", + "historicalFixtures": "PASS", + "sqliteRetirement": "PLAN_READY_REMOVAL_NO_GO", + "mariaDb123Lts": "INVESTIGATION_READY_MIGRATION_NO_GO", + "phase9Reacceptance": "NO_GO", + "phase10": "NO_GO", + "production": "NO_GO" + }, + "preservation": { + "groups": 57, + "routes": 33, + "partial": 56, + "deferred": "C11", + "historicalAcceptanceReportsRewritten": false, + "userDataDeleted": false, + "historicalMigrationsChanged": false + }, + "notQualified": [ + "hosted Gitea execution", + "complete application MariaDB coverage", + "production image/config/environment equality", + "production deployment", + "12.3 upgrade/restore/rollback", + "SQLite user-data transfer", + "manual/device/provider/output wider Phase9 acceptance", + "power-loss/storage durability" + ], + "sourceSha256AtImplementationCheckpoint": { + ".env.example": "46259cf55ea73ddb5726e95f98480c5131e8a00519dba9cb1a6d196b1c2eac71", + ".gitea/workflows/mariadb-integration.yml": "621f15d36edc6ea9260fb2586b24b53993ba6202fdcd731bf4babbbc3ab4b8d7", + "JobTrackerApi.MariaDb.Tests/JobTrackerApi.MariaDb.Tests.csproj": "2df22a5b79fae14566b437081932218254eb811c8dc1b2af3d51692d8e0d6825", + "JobTrackerApi.MariaDb.Tests/MariaDbDatabase.cs": "1375d97093f686f77d511ef6d81ad2d62ecf329aa6e7bf53036cd6e199035e40", + "JobTrackerApi.MariaDb.Tests/README.md": "75c687f453662d313a34b5d3c7bb3c957a18afb15a7014569b853d28d69b55f9", + "JobTrackerApi.MariaDb.Tests/Rd21CareerPersistenceTests.cs": "d8fe34ce82a7f111fb75673ff14d44df0b0de778a3e42b050cfbbd9f3c274331", + "JobTrackerApi.MariaDb.Tests/Rd21JobPersistenceTests.cs": "fa70202b58933f293ec6b9655a8a717506cd75ce5824703fa14e532a288267a8", + "JobTrackerApi.MariaDb.Tests/StartupAndLockTests.cs": "f36b0cbf43ac68738997249c6ec6f1963c27a3c350e3ebba9476f27ef7ed9f81", + "JobTrackerApi.MariaDb.Tests/TestHostFactory.cs": "f9f04e0aa7bad06863910564059605a13950540a5b6e04633f7ba7340719fdab", + "JobTrackerApi.MariaDb.Tests/packages.lock.json": "bfc1e47f3c80a061c1002a79db18fa46e1f996665d501a9126c479ae0713e74d", + "JobTrackerApi.Tests/DatabaseConfigurationTests.cs": "597e83474c1067b90647325a73eccd2fe479c4d5eabf3846b3af92ed92ac2d8b", + "JobTrackerApi/Controllers/JobApplicationsController.cs": "03cef66c86a2cb2df86764301e49a747df304abc82109d41467a5038fe01c335", + "JobTrackerApi/Controllers/ProfileCvController.cs": "8afae7680bc699ca525bb2c48cc8fba71922faed68abe21feb6046c3a8e70bda", + "JobTrackerApi/Data/DatabaseConfiguration.cs": "d07e323238b2d3f6a33dc688243a2d3143ffef8e797a412d48d1175587eaf7f5", + "JobTrackerApi/Program.cs": "1956baf3c208185e89cee46a4f9ae340b79d75fb6cb823cec982570dbcdbd201", + "JobTrackerApi/Services/DatabaseBackupRunner.cs": "aa9132378123b712c42c6f56c8fb001f5b86bb6fa2bd3dfce22ef73e06dba42f", + "JobTrackerApi/Services/StartupInitializationExtensions.cs": "4d60f14dc5069e27309f662c32dd15504dbe797dee9d46cb69460f818c0544c6", + "JobTrackerApi/appsettings.Development.json": "6a3efdb176f933bbdf9aa623d617e74e84e2b61cecd20fdef6ef77351554c3f2", + "docker-compose.database.yml": "bc4f0d19ef913f9e0f92540ed9a817e7bbf00d2f00ae80ed5b1acd43d55ba363", + "docker-compose.yml": "97aecfd456f5ad8de8597d1e301a63e1a5be5f3e181032d54c12175df1acfd1c", + "docs/redesign/phase-9/p9-05/diagnostics/data.spec.ts": "b33a99c3b280f7cac8ed4294e0a4a0a297f4761708e5414e3bf768f8146a7780", + "docs/redesign/phase-9/p9-05/diagnostics/sustained.spec.ts": "76db0ac115e4745b67186b116421e2d7c374bd2e8f87a2fd40f04215e7b463c2", + "docs/redesign/phase-9/p9-05/volume/volume.spec.ts": "9a3abd9f4a8fe558e643bf481dc9a0d1857975e9d532fda6c95e27cf437f7908", + "job-tracker-ui/mariadb-tests/save-recovery.spec.ts": "3dc4f32270325fe73db1855d62a7061629834ff6f03f22a8cbb0dad25395f4a8", + "job-tracker-ui/playwright.config.ts": "bbfb6e503d39397bf0b8445a00683197e228852af2579420807463add5c8a646", + "job-tracker-ui/playwright.mariadb.config.ts": "3b427d62ca39ac1e16597e9eb4fdbf6f9abd445a2ed9c3b49f2a8ca279b3e3fa", + "job-tracker-ui/scripts/mariadb-browser-connection.mjs": "2678f51649a007a25d356e6acd35cbec4eda6d89b713ea77309c4455ec0b41fc", + "job-tracker-ui/scripts/mariadb-browser-connection.test.mjs": "39218ff8f671e0f50f8df0bc486b6fbea7699e8959662ac3b4b6d2dfce13573d", + "scripts/mariadb-integration.py": "410cede3ca8794de99735a579ac626a34b6a56ee89c6ef63880d692153c7cd97", + "scripts/test-mariadb-integration.py": "39aa5618724e74b859aceaf814bf08b9ea63a54205452805caa810a302441a80" + } +} diff --git a/docs/database/migrations.md b/docs/database/migrations.md index 1743430..2d299cb 100644 --- a/docs/database/migrations.md +++ b/docs/database/migrations.md @@ -1,6 +1,10 @@ # Migrations and compatibility -The API applies EF Core migrations on startup and performs guarded legacy-schema reconciliation for SQLite and MariaDB/MySQL compatibility. Fresh and repeated disposable SQLite migration chains are the normal local verification; generated provider SQL is not proof of a live production migration. +The API applies EF Core migrations on startup and performs guarded legacy-schema reconciliation. +MariaDB is the standard; fresh/repeated/populated disposable MariaDB startup and persisted-state +tests are the database integration lane. Explicit SQLite compatibility remains temporarily for +existing data/legacy tests. Generated SQL and SQLite passes are not MariaDB runtime evidence. +See [current qualification](mariadb-standardisation/README.md); no production migration is authorized here. SQLite startup explicitly enables write-ahead logging (WAL) before reconciliation opens the database file. This lets concurrent readers coexist with committed usage and preference writes; it changes journaling, not stored fields or ownership. MariaDB/MySQL initialization is unchanged. Use the existing `VACUUM INTO` backup runner for a consistent SQLite snapshot, including committed WAL contents; copying only a running database's `.db` file is insufficient. Disposable startup, held-reader/write and independent backup tests cover this boundary; they do not replace production restore qualification. diff --git a/docs/roadmap/todo.md b/docs/roadmap/todo.md index a5d5698..3721656 100644 --- a/docs/roadmap/todo.md +++ b/docs/roadmap/todo.md @@ -10,6 +10,8 @@ Phase 7 execution started: 2026-10-11, from synchronized `b531998` on `codex/ui- ## Current repository work +- [x] **MariaDB standardisation and RD21 qualification — 24 October 2026:** [acceptance](../database/mariadb-standardisation/ACCEPTANCE.md), branch `codex/rd21-mariadb-standardisation`, baseline `0d16a691`. Pinned official MariaDB 12.2.2 Docker lane 32/32 and native browser recovery 1/1; existing backend 1,123/1,123, repaired diagnostics 18/18 and volume 3/3. Local dev migrations/persistent volume verified. RD21 resolved within qualified scope; hosted CI unverified, SQLite removal/12.3 migration/Phase 9 reacceptance/Phase 10/production remain gated. Docker socket failure recovered with preserved socket-only archives; no persistent Docker data reset or production action. + - [x] **RD21 safe remediation/requalification checkpoints — 23 October 2026:** [dated addendum](../redesign/phase-9/rd21-remediation/ACCEPTANCE_ADDENDUM_2026-10-23.md), branch `fix/rd21-acknowledged-edit-loss`, based on final Phase 9 `8e7e3f6`; product checkpoint `1b89a77`. Original persisted loss and Career partial commit reproduced and locally repaired, both final review findings addressed. Final backend 1,109/frontend 934 (105 suites)/ordinary browser 362/contracts 23/model-disabled sidecar 56/new remediation 6/conforming volume 3 pass; types/lint/build and unchanged PDF oracles 24 fixtures/60 pages pass. Original diagnostics 16 pass/2 fail and volume 2 pass/1 fail retain obsolete unversioned Career-seed failures; no skips or concealed reruns. Formal RD21 **UNRESOLVED** pending required MariaDB runtime qualification; Phase 9/Phase 10/production **NO-GO**. Preserve 56 PARTIAL/C11 DEFERRED and 57 groups/33 routes; historical evidence unchanged. Reporting publication follows the addendum; no production operation or main merge. - **P5-15-01R-03 — GO for bounded Analytics authentication return repair:** [record](../redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/README.md). Original AUTH-01 is RED→GREEN; safe complete pathname/query/hash/context, local retry/history/expiry/logout and native foreign404/tampered-target journeys pass. Fresh backend1,033/frontend490(+18)/browser134(+5cases, formerfailure nowpassing)/diagnostics2; saved-search3, Rules4, P2-D01, revision5 and fidelity16/36+settings8/24 remain green. All57 groups reconcile to56PARTIAL/1DEFERRED. Reproducer and code checkpoints are pushed; final evidence receives its own immediate push. Production NO-GO/main unchanged. Stop before P5-15-02/P5-13/Docker/B07/deployment; human/provider/device, production readiness, existing debt and the CV intermittent observation remain open.