# Reproducing the qualification lanes Run from the repository root on the dedicated development branch. Use the pinned .NET9 SDK and the existing frontend lock. Build Release API/tests and the production static export before browser execution. Preserve each prior run directory; a successor is separate evidence, never a hidden retry. The accepted result ledger records actual commands, timestamps, process outcomes, native case identities and report hashes. Commands below describe the mechanism, not passing results. All shell commands in this environment use `rtk proxy`. Windows examples use the existing native MariaDB client under `.artifacts/mariadb/runtime/mariadb-12.2.2-winx64/bin/`; obtain and verify it using the [database setup instructions](../../../database/mariadb-standardisation/README.md). No command connects to production. Development credentials in fixtures are intentionally local. ## Existing full suites - Backend: `dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore --logger "trx;LogFileName=backend.trx" --results-directory /backend`. - Real provider: `python scripts/mariadb-integration.py --output /mariadb`. - Frontend, from `job-tracker-ui`: `node node_modules/jest/bin/jest.js --runInBand --json --outputFile=/frontend.json`. - Types/lint/static build, from that directory: `node node_modules/typescript/bin/tsc --noEmit --incremental false`, `node node_modules/eslint/bin/eslint.js . --max-warnings=0`, `node --max-old-space-size=4096 node_modules/next/dist/bin/next build`. - Sidecar, from `tools/summarizer`: set `SKIP_MODEL_LOAD=1` and `AI_SERVICE_SKIP_MODEL_LOAD=1`, then `.venv/Scripts/python.exe -m pytest -q tests --junitxml=/sidecar.xml`. This does not qualify a model. For ordinary browser discovery and execution, use the production static export with `PLAYWRIGHT_STATIC_EXPORT=true`, `PLAYWRIGHT_PREBUILT_EXPORT=true`, `PLAYWRIGHT_REUSE_SERVERS=false`, `NEXT_PUBLIC_API_BASE_URL=http://localhost:5302/api` and `DOTNET_HOST_PATH=`. Direct fidelity outputs to fresh `CV_FIDELITY_OUTPUT` and `CV_SETTINGS_FIDELITY_OUTPUT` directories. From `job-tracker-ui`, run `node node_modules/@playwright/test/cli.js test --list --reporter=json`, then four **serial** executions with `--shard=1/4` through `--shard=4/4`, each with `--retries=0 --reporter=list,json`, a unique `--output` directory and `PLAYWRIGHT_JSON_OUTPUT_NAME`. Discovery-only empty results are not runtime skips. Reconciliation requires exact discovery membership across all four shards. Run each separate config serially with the same zero-retry/report settings: | Lane | Config relative to `job-tracker-ui` | | --- | --- | | AI contract | `playwright.cv-ai.config.ts` | | Auth recovery | `playwright.auth-recovery.config.ts` | | Rate limits | `playwright.rate-limits.config.ts` | | Ingress | `playwright.ingress.config.ts` | | PDF admission | `playwright.pdf.config.ts` | | Preferences | `../docs/redesign/phase-5/p5-15/p5-15-01/diagnostics/playwright.config.ts` | | RD21 | `../docs/redesign/phase-9/rd21-remediation/diagnostics/playwright.config.ts` | | Corrected diagnostics | `../docs/redesign/phase-9/p9-05/diagnostics/playwright.config.ts` | | Volume | `../docs/redesign/phase-9/p9-05/volume/playwright.config.ts` | | RD21 volume | `../docs/redesign/phase-9/rd21-remediation/volume/playwright.config.ts` | Ordinary and these historical contract fixtures retain transitional SQLite where their current configuration specifies it. They are never counted as MariaDB qualification. ## Dedicated MariaDB browser and sustained workload Use only the pinned disposable service from `docker-compose.database.yml`, project `jobtracker-it-p9-requal`, integration profile, with `MARIADB_TEST_PORT=33308`. Start only `mariadb-test` with `up -d --wait`. The persistent `mariadb-dev` service and its volume are separate. The helper verifies the exact container, Compose ownership, image pin, tmpfs, loopback binding and server version before creating its generated schema. It refuses to overwrite earlier evidence. With ports5302/3300 free and no other qualification workload, run these separately: ```powershell rtk proxy python docs/redesign/phase-9/p9-requal-01/mariadb-lane.py mariadb-browser rtk proxy python docs/redesign/phase-9/p9-requal-01/mariadb-lane.py mariadb-observations rtk proxy python docs/redesign/phase-9/p9-requal-01/mariadb-lane.py performance ``` The performance lane takes at least15minutes after setup/preflight. Do not shorten it or run competing tests/builds. Read [PERFORMANCE.md](PERFORMANCE.md) for its bounded claims. Each invocation drops only the exact schema it created, after stopping its own test process. Failures retain logs and cleanup evidence; an uncertain process shutdown retains the schema. After all lanes, remove only this owned disposable service using Compose `rm --stop --force mariadb-test` with the same file/project/profile. Never use `down -v` or remove the development volume. ## Native and Linux PDF fidelity Once both existing CV producer files have completed, use Python with the repository's existing PDF tooling (`pdfplumber`, `pypdfium2`, Pillow): ```powershell rtk proxy -B docs/redesign/phase-9/p9-requal-01/pdf-proof.py --platform windows --fidelity-root .artifacts/p9-requal-01/fidelity --settings-root .artifacts/p9-requal-01/settings-fidelity --output .artifacts/p9-requal-01/windows-pdf-oracle --record .artifacts/p9-requal-01/native-pdf.json ``` The helper stages copies, merges all eight settings states, runs the **unchanged** existing oracle, checks fixture/page membership and hashes original inputs before/after. It will not overwrite output. The Linux lane builds the **existing** API Dockerfile locally with tag `jobtracker-p9-requal-api:security-check`, while retaining the build log and source identity. With all other browser/API lanes stopped and the same verified disposable MariaDB service running, execute `rtk proxy python docs/redesign/phase-9/p9-requal-01/linux-run.py`. It starts a generated, task-labelled API container with tmpfs data and a private network, publishes only loopback5302, verifies API identity/readiness and actual migration history, and executes five unchanged CV producer cases. It records renderer/runtime/image identities and removes only its own resources. Then run `pdf-proof.py --platform linux` against `.artifacts/p9-requal-01/linux/fidelity` and `linux/settings-fidelity`, using fresh `linux-pdf-oracle` output and `linux-pdf.json` record. This qualifies the Linux API renderer with a Windows Chromium preview client; physical printing, Linux desktop browser behavior and human visual acceptance remain distinct. ## Fail-closed evidence checks `test-reconcile.py`, `test-linux-run.py`, `test-mariadb-lane.py` and `mariadb-lane.py self-check` are offline harness checks, not provider tests. `reconcile.py` reads the fixed fresh artifact paths and writes `validation.json`; its default process fails if required gates are missing or not passing. `--collect-only` deliberately collects partial evidence and cannot establish acceptance. Frozen runtime input hashes must still match. Advisory findings and unavailable human/provider/ production evidence retain their own dispositions even when functional tests pass.