# Reproduce the qualification Run from the repository root on a dedicated development checkout. Preserve previous evidence directories and developer data. Use new attempt names/directories; the helpers refuse to overwrite evidence. All database credentials are development-only. Do not point these commands at production. ## Runtime and artifacts Use the exact local image identities in [model/RUNTIME.json](model/RUNTIME.json). They are local image IDs, not pullable registry manifest references. Verify them with `docker image inspect`. The source runtime build, exact installed inventory, native packages, lock SHA256 values and command outcomes are retained in the qualification records. A rebuild with different base/apt/bootstrap inputs requires a new image identity and qualification; this package does not claim a hermetic OS rebuild. The application lock contains55 exact hash-checked Linux packages; the development lock retains all55 and adds6 exact test packages. The actual qualified test environment has63 distributions, including its2 separately inventoried bootstrap tools. Use `pip --require-hashes` and the official PyTorch CPU index, never an unrestricted upgrade. [Qualification.Dockerfile](model/Qualification.Dockerfile) adds only the6 locked test extras to the verified runtime; its retained build context is `.artifacts/p9-sec-02/test-lock-patched/`. For the small fixtures, verify the retained [capsule identity](model/fixture-capsule.json), copy only its manifest-listed members into **new** `.artifacts/p9-sec-02/artifact/` and `artifact-bin/` directories, and validate with [verify_fixture](model/verify.py) against the committed [manifest](model/ARTIFACTS.json). The binary weights are intentionally absent from Git. A regenerated fixture with different bytes needs a new manifest and qualification. For the original trained model, use: ```powershell python docs/redesign/phase-9/p9-sec-02/full-model/prepare.py NEW_NONPRODUCTION_DIRECTORY ``` The exact reviewed revision, Apache-2.0 declaration, HTTPS source paths, storage bound, file sizes and hashes are checked before loading. This prepares approximately1.23GB of artifact data. It does not change Ollama or an existing cache. Replay the **actual retained full-model Docker command** with that new directory as the read-only `/fixture` mount; retain `--network none`, offline flags, nonroot user, read-only root filesystem and resource limits. The command/probe/manifest/image identity and positive container cleanup are part of the result, not optional environment assumptions. The six smaller/runtime lanes are individually replayable with unique attempt names: ```powershell python docs/redesign/phase-9/p9-sec-02/model/run.py sidecar NEW_SIDECAR_ATTEMPT python docs/redesign/phase-9/p9-sec-02/model/run.py safetensors NEW_SAFETENSORS_ATTEMPT python docs/redesign/phase-9/p9-sec-02/model/run.py weights-only NEW_WEIGHTS_ATTEMPT python docs/redesign/phase-9/p9-sec-02/model/run.py cache NEW_CACHE_ATTEMPT python docs/redesign/phase-9/p9-sec-02/model/run.py parsers NEW_PARSER_ATTEMPT python docs/redesign/phase-9/p9-sec-02/model/run.py inventory NEW_INVENTORY_ATTEMPT ``` These use the exact qualified image and isolated test artifacts; no inference is mocked in the dedicated inference probes. The59-case sidecar suite includes controlled/model-disabled units separately, including real parser-child timeout, capacity release and process-tree termination tests. It does not establish application-level cancellation of in-flight model HTTP requests. ## Application and database regression Use `C:/Users/Connor/.dotnet/dotnet.exe`9.0.317 and the repository's installed locked Node dependencies. Actual commands, environment, timestamps, exit codes, TRX/JUnit/Playwright reports, discovery and input hashes are indexed by [validation.json](validation.json). Backend, frontend, four serial ordinary shards, six separate browser-contract lanes, RD21 companions, diagnostics and both volume lanes have separate totals. Disable Playwright retries; do not add focused or failed predecessor executions to the complete successor totals. Use [the existing MariaDB integration runner](../../../../scripts/mariadb-integration.py) with the pinned official12.2.2 image and generated disposable schemas. The local database service has loopback-only port33308, tmpfs data and no persistent development volume. [mariadb-lane.py](mariadb-lane.py) retains browser recovery, independent HTTP observations and the paced15-minute workload. Run that workload alone, without model loads, builds, browser suites or rendering jobs. Keep current server/version/image and generated-schema ownership checks. Cleanup removes only owned disposable resources; never use `down -v`, broad prune or a production endpoint. ## PDF and source preservation [linux-run.py](linux-run.py) reuses the original renderer lifecycle, verifies the local immutable image and API source lineage, and retains the unchanged fixture readiness token. The first guard-rejected attempt is preserved separately. The `representative-linux` attempt selects the existing2-document supplemental configuration; use a fresh evidence checkout if that reserved attempt already exists. Normal fidelity attempts take unique names. Run the existing `p9-requal-01/pdf-proof.py` with the new fidelity/settings roots, output directory and explicit `--platform windows` or `linux`. Preserve the original `scripts/verify-cv-fidelity.py` hash `64f82e622cc11483c33307d987e969f6cf27f82ab6bdbd72c2aeb1bfbceade87`. A renderer exit code alone cannot satisfy the24-fixture content/layout oracle. Physical printing and owner image review remain separate. [reconcile.py](reconcile.py) checks exact discovery membership, native reports, fixture supersession, image/artifact/input identities and positive cleanup. `--collect-only` records incomplete results honestly; its exit0 means collection succeeded, not acceptance. Normal reconciliation remains nonzero while required hosted automation is BLOCKED. [verdicts.json](verdicts.json) makes the independently scoped development/entry/release decisions.