Files
jobtrackingapp/docs/redesign/phase-9/p9-remed-02/ACCEPTANCE_ADDENDUM_2026-10-25.md
T

85 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P9-REMED-02 — remediation and acceptance addendum
Date: 25 October 2026. Final local functional qualification is complete. Global automation and broader acceptance remain withheld as described below.
## Baseline and scope
Development branch `fix/p9-pdf-security-requalification` descends from accepted development checkpoint `3727a723e8d0d9066ef3a0a4eed3e5313ff9cc28`, the RD21 repair and MariaDB standardisation history. Application source checkpoint is `b313e20bade4def9b8c23d32410278e0333d642c`; the final runtime manifest freezes 1,098 inputs. Documentation and qualification helpers are recorded separately. Main remains `5f835e54a9b74e6b71418422e28431b2af06453f`.
Historical reports remain intact. No production system, database, model, storage, workflow deployment, SQLite retirement, Phase 10, CV-UX-01 or CV-IMPORT-01 implementation was performed.
## Repairs and evidence
The original Linux environment substituted six DejaVu system faces for requested CV fonts. Eleven of the original 24 fixtures failed. Licensed, unmodified static fonts are now embedded at the shared renderer owner and published with their notices and source hashes. Stored template settings and revision contracts are preserved. Segoe UI, Georgia and Arial-family selections have explicitly disclosed portable substitutions. Existing frozen document bytes are not rewritten. See [pipeline](PDF_PIPELINE.md), [font packaging](FONT_PACKAGING.md) and [fixture-by-fixture evidence](PDF_REMEDIATION.md).
A variable-font investigation was rejected after actual PDF font descriptors exposed Type 3 metric problems. Static upstream fonts passed the unchanged original oracle: 16 fixtures/36 pages plus eight settings states/24 pages. Four independent representative reprints had identical glyph geometry and page pixels; changing PDF creation timestamps mean byte identity is not claimed. All 24 documents retained rendered text under the documented ligature/case/whitespace normalisation. These checkpoint results are separate from final successor runs.
The first complete browser attempt exposed a preview recovery defect: focus-triggered scrolling moved Retry by 190 pixels between pointer-down and pointer-up, preventing the native click and HTTP request. One guard at the existing focus owner preserves direct region scrolling while keeping focused child controls stationary. Unit and held-pointer browser regressions failed before the repair and passed afterward. The stale-draft fixture now observes actual PUT responses instead of racing the transient Save control; all persistence, history and recovery assertions remain. An unchanged admin matrix passed in isolation after a competing-load deadline failure. Failed predecessor reports remain available and are never counted as accepted final passes.
Five bounded Python upgrades change only Pillow, pypdf, certifi, urllib3 and setuptools among 49 pinned dependencies. Two parser regressions and actual authenticated sidecar startup/extraction preserve existing contracts. Sixty-five of 109 baseline advisory alias groups were remediated; the remaining filelock/Torch/Transformers findings require qualified compatible fixes or explicit risk disposition. Alias groups are not asserted to be independent exploits. No owner risk acceptance, model inference qualification or model download is implied. See [advisory inventory](security/ADVISORIES.md) and [remediation](security/REMEDIATION.md).
## Hosted CI
Historical run 853/job 1743 exited at its first isolation guard before checkout or MariaDB execution. Its job preparation showed host networking and a host Docker-socket bind. The fresh read-only metadata inspection confirms Gitea 1.26.0 and bounded visible run/runner metadata, but supplies no current live private-network/HostConfig proof. No new hosted database execution is claimed. A CLI installation would not establish safe daemon access. See [operator handoff](CI_ISOLATION.md) and [25 October metadata refresh](CI_REFRESH_2026-10-25.md).
Operator prerequisites remain a dedicated nonproduction runner, verified job/service private network, disposable MariaDB lifecycle, no job socket/privileged execution/public database port/persistent database data or production credentials, and success/failure/cancellation/crash cleanup evidence. The existing guard remains fail-closed. Local Docker results do not satisfy hosted acceptance.
## Final regression ledger
[Machine execution ledger](validation.json), [runtime source manifest](runtime-source.json), [qualification helpers](qualification-inputs.json) and [advisory refresh](security/final-refresh.json) retain actual identities and outcomes. There is no drift across1,098 runtime inputs and42 execution helpers. Final application source isb313e20; no product edit followed the freeze.
| Lane | Actual final outcome |
| --- | --- |
| Backend |1130 passed,0 failed/skipped |
| Frontend |935 passed across105 suites,0 failed/pending/todo |
| Ordinary browser |362 passed; exact discovery membership across98+87+88+89,0 retries/skips |
| Six browser contracts |23 passed: AI2,auth2,rate9,ingress6,PDF admission1,preferences3 |
| RD21 companions |6 passed; separate from real-provider totals |
| Diagnostics / route matrix |18 passed, including33 routes across12 viewport/locale/theme combinations and bounded sustained fixture |
| Volume / RD21 volume |3+3 passed, separate lanes |
| Actual MariaDB12.2.2 |35 integration +1 browser recovery +2 HTTP observations passed; startup51 migrations, independent reads and teardown retained |
| Linux producers |5 passed for original24 fixture states; supplemental2 passed separately |
| Model-disabled sidecar |58 passed,0 skips; selected-model inference NOT TESTED |
| PDF original corpora |Windows24/24 andLinux24/24; each16/36pages+8/24pages, unchanged oracle |
| Supplemental PDF |2/2: minimalEN2pages,technicalNB8pages; all64skills and header/footer suppression |
| Type checks / lint / production build |PASS |
| Existing security helpers / audits |12 commands PASS, including secrets,SBOM,NuGet/npm and boundary guards; not Python risk acceptance |
| Offline evidence guards |24 passed (12+2+2+8), separate from application totals |
| Fifteen-minute MariaDB workload |PASS:900003ms,250jobs,8Career roles,2readers,3360reads/0failures,20navigations/0failures; p50=25.9ms,p95=36.5ms,p99=43.8ms,max=70.5ms |
The workload compares IDs, owner/deletion/tenant counts, canonical profile/revision, Identity projection and history count before/after, plus exact Board membership and profile HTTP reads. These are selected invariants, not a full database fingerprint, capacity SLA, production benchmark or server-CPU attribution. Host/Node/CDP resource samples are descriptive and retained. No competing qualification workload ran during its15minutes.
Failed predecessor95PASS/3FAIL ordinary shard, earlier934 frontend run, variable-font trial and failed obsolete-image repeat remain retained. Focused46-unit/6-browser checks, four pixel-identical reprints and parser-only Linux supplements are not added to complete-suite totals. Final successor suites have no hidden retries/skips. Reconciliation deliberately exits1 for `python-advisories:FINDINGS` and `hosted-mariadb:BLOCKED`; `localFunctionalComplete:true`, `automationComplete:false`.
The [renderer capsule](renderer-capsule.json) preserves exact local replay identity and full package/locale inventory. It is not a registry reference or database backup; nothing was uploaded/deployed. Source rebuilds with floating base/apt inputs require new qualification. [Cleanup](cleanup.json) verifies no generated test schemas remained, only the owned tmpfs test service was removed and the stopped persistent development container/volume were unchanged. Managed integration server logs are retained. The final shared-container collector retained stdout only; teardown warnings on stderr were observed in tool output, so that one file is not claimed as a complete stderr archive.
## Preservation and human acceptance
The [57-group reconciliation](PRESERVATION.md) preserves 56 PARTIAL statuses and C11 DEFERRED, plus all 33 supported routes. PARTIAL is neither automatic failure nor completion. No AI activation, deletion eligibility or semantic provider acceptance is invented. Null-as-inherit design settings, frozen document bytes, Career Profile ownership, revision and tenant boundaries remain required.
All M09-01–10 human cards remain NOT TESTED; [owner steps](MANUAL_ACCEPTANCE.md) separate screen-reader, keyboard, contrast, zoom, physical-device, Bokmål, print and provider checks. Automated axe, synthetic pointer tests and finite image inspection cannot close these human rows. REQUEST §6 permits unfinished genuine human checks to carry into release gates; missing production evidence alone does not veto isolated development qualification.
The [60-finding register](FINDINGS.md) retains each original criterion/source, owner, severity, evidence, dependency and closure requirement, with independent Phase 9, Phase 10, production and debt impacts. Creation-intent idempotency remains a separate contract concern; duplicate reminder reads remain documented debt. Neither is silently folded into RD21 stale-write closure.
## Decisions and remaining conditions
| Gate | Decision | Basis |
| --- | --- | --- |
| Linux PDF Fidelity |PASS |Original24 and supplemental2 pass in actual Linux; finite scope, no physical-print claim |
| Python Security Advisories |BLOCKED |65 baseline alias groups remediated;44 remain acrossfilelock/Torch/Transformers; model/cache qualification and serious-risk disposition unclosed |
| Hosted MariaDB CI |BLOCKED |No verified private runner/service lifecycle;0 hosted database cases |
| RD21 |RESOLVED |Original six repair clauses remain satisfied within tested save/concurrency scope; creation idempotency separate |
| Phase9 |NO-GO |Acceptance-risk judgment retains the unclosed selected-model/cache security qualification; local functional defects are repaired |
| Phase10 Readiness |NO-GO |Independent route/caller/unused-code and functionality-inventory entry evidence remains unproven/unwaived; security risk disposition remains open |
| Production |NO-GO |Task restrictions plus independent infrastructure, recovery, deployed identity/security, provider and human gates |
REQUEST §§9/13/14 call for individual investigation and transparent disposition, not a mechanical veto for every advisory. The model-loading/artifact and shared-cache uncertainty remains material after source-limited assessment; no serious residual risk is accepted on the owner's behalf. Missing production-only evidence and carried human checks do not independently create this Phase9 NO-GO. The final refresh has the same99 provider records/44 alias groups and metadata, plus the disclosed vendorPyPI404; no exact vendor result is fabricated.
Phase 10 requires the authoritative affected-test, functionality inventory and unused-code/caller evidence; no carry-forward waiver or permission to begin cleanup is inferred. CV-UX-01 remains withheld under the explicit mission instruction. A new feature must receive its own scope and authorisation after applicable entry conditions are satisfied.
The next development action is to qualify applicable filelock/Torch/Transformers fixes against an approved immutable model artifact, without an unapproved model download, then record per-advisory compatibility/reachability and any owner-only risk decision. Operator runner isolation and owner human acceptance can proceed independently.
## Publication
Checkpoint commits: `0554e27` (Python patches), `57dd883` (baseline evidence), `e80815f` (portable static fonts), `b313e20` (preview focus repair and regression fixtures). The evidence checkpoint is the Git commit containing this addendum; [publication ledger](publication.json) records checkpoint identities and verification procedure. Direct post-push HEAD/remote equality, clean tree, ancestry and unchanged main are recorded in the retained publication receipt and final delivery. No force-push, merge or deployment is authorised or performed.