16 KiB
CV-UX-01 acceptance and handoff
26 October 2026. Branch: feature/cv-editor-flowcv-redesign.
Automated development acceptance: PASS. Overall: CONDITIONAL GO for development review. Production and Phase 10 remain NO-GO. The approved editor/document implementation is delivered, with the live-model gate explicitly left BLOCKED at the owner's instruction. Human accessibility, physical-device, language and print acceptance remain open. This report does not certify a production release or unconditional completion of those gates.
Source and scope
Tested application/UI checkpoint: b1817aa52c604f12df3c875b53b8f4e69fa6f2be, descending from accepted 28f83df. All implementation checkpoints were committed, pushed and checked against the requested remote branch. Final publication adds this report/evidence and the qualified Linux harness correction; it changes no tested application or UI source.
ENTRY.md, PLAN.md and CAPABILITIES.md establish the entry decision, architecture reconciliation and preservation inventory. The original research's eight deliverables, 83 verified hashes and 37 screenshot/DOM pairs were reviewed. Its functional patterns were adapted to Jobjakt's existing React/MUI/.NET owners; third-party branding, assets, templates and code were not copied into the product. Phases 1–9 improvements remain part of the preservation baseline.
Delivered changes include adjacent editing/live preview, accurate document context and current-master history wording, section counts/provenance and keyboard reorder feedback, real read-only template samples with explicit reversible application, direct page navigation, revision-bound export, designed letter drafts/preview/PDF, reviewed contact/design snapshots, portable letter design/history and four contextual writing actions. Existing typed/custom sections, locks, sharing, settings inheritance, content overrides, save recovery and frozen application documents remain supported.
Career Profile remains canonical. Letter persistence reuses JobApplication.Version; every intended text writer stages text/design/history atomically. Generic null-clear and draft null-unchanged semantics, no-op acknowledgements, restore-as-new and existing attachment-flag behavior are preserved. The additive 20261025090000_AddCoverLetterDocumentDesign migration adds four nullable columns; provider tests cover migration down/up preservation. No separate letter concurrency token or data backfill was introduced.
Final native evidence
EVIDENCE.json is the committed result/hash index. Raw logs, native reports, screenshots, PDFs and failed attempts remain under .artifacts/cv-ux-01 in this checkout; large generated artifacts are not committed. The index identifies their exact relative paths and SHA-256 values. Passing focused reruns below overlap full suites and are never added to their totals.
| Independent lane | Final result | Native evidence under .artifacts/cv-ux-01 |
|---|---|---|
| Full Release backend | 1,234 passed, zero skipped | final-09/backend/backend.trx, backend-process.json |
| Full frontend | 981 passed / 107 suites, zero pending | frontend-final-03/frontend.json, process/source records |
| Ordinary Chromium | 364 passed, zero skips/retries | final-09/discovery.json, four ordinary-N.json reports |
| CV AI authorization / recovery | 2 passed | final-09/ai.json |
| Authentication recovery | 2 passed | final-09/auth.json |
| Rate limits | 9 passed | final-09/rate.json |
| Ingress | 6 passed | final-09/ingress.json |
| PDF admission/cancellation | 1 passed; inert child contract | final-09/pdf-admission.json |
| Preferences concurrency | 3 passed | final-09/preferences.json |
| RD21 persistence diagnostics | 6 passed | final-09/rd21.json |
| Phase 9 diagnostics | 18 passed | final-09/diagnostics.json |
| Phase 9 volume | 3 passed | final-09/volume.json |
| RD21 volume | 3 passed | final-09/rd21-volume.json |
| Actual local MariaDB 12.2.2 | 64 passed, zero skipped | provider-final-05/mariadb.trx, source/cleanup records |
| Linux native renderer | 6 passed, zero skips/retries | linux-final-02/linux-renderer.json, process.json |
| Windows original CV oracle | 24 documents / 60 pages PASS | final-09/windows/native-pdf.json |
| Linux original CV oracle | 24 documents / 60 pages PASS | linux-final-02/linux-pdf.json |
| Windows letter oracle | 4 documents / 14 pages PASS, zero differences | final-09/windows/letter-fidelity/fidelity-results.json |
| Linux letter oracle | 4 documents / 14 pages PASS, zero differences | linux-final-02/letter-fidelity/fidelity-results.json |
The ordinary reports reconcile exactly to discovery: shard membership 100 + 87 + 88 + 89 = 364 unique cases. The letter producer is one case/four documents; the responsive letter case contains seven scenarios. Neither scenarios nor documents are counted as additional browser cases. Separate lanes retain their own counts rather than being folded into an inflated ordinary total.
Windows final-09 ran from 08:07:24 to 09:17:46 UTC with process exit 0 and unchanged source/runtime hashes. The previously completed full frontend remains current because its 255 source/config inputs still match; subsequent corrections touched backend or E2E fixtures, not frontend product/unit-test inputs. Provider before/after hashes match the final frozen API/test inputs; runner and owned cleanup both exited 0. SDK 9.0.317 and MariaDB 12.2.2 were used without suppressing NuGet audit.
Linux used immutable image sha256:690cf21b2e434b9d484810966d3d9aead1a1c0a0a8b506cb904863f0aa0c5d35, from linux-image-10/build.json. Current portable publish DLL SHA-256: 416728661b24e2ab50f1dba463ce3383e5af6a63da6e7ec8881d13d6cbf48d90. Build/run source SHA-256: 1bc4fdd143fd19ef445177e07308da731f97a8ea8d39e76f7b2e11e9523662c6. It reuses verified cached native runtime sha256:0d1cb44ba8f71d54de77459915a7052b894191cfeb75aa32f0c1e7ffdc21fda6 with current API outputs in a new directory; this is not a hermetic OS rebuild. Chromium was 156.0.8078.47 on Debian 12. Authenticated build metadata and applied migration were verified. All generated API/database/schema/network cleanup steps succeeded.
The Linux helper's final bridge/port correction is included in the build's recorded dirty documentation-source hashes, while application/UI commit remains b1817aa. Windows app/UI freeze does not include this helper. Cross-lane API/UI source binding, image/publish identity and commit equality passed the collector; no application retest is inferred from a documentation-only change.
The unchanged oracle SHA-256 is 64f82e622cc11483c33307d987e969f6cf27f82ab6bdbd72c2aeb1bfbceade87. Original membership remains 16 fixed CV documents/36 pages plus eight settings documents/24 pages per platform. Letter membership is independently four EN/NB × A4/Letter × light/dark documents, with page counts 3/3/4/4. Full extracted contact, multiline recipient, subject, date, formatting text, diacritics, all 24 body markers and final text passed for all eight letter PDFs (final-letter-text.json). Representative CV/letter first and final-page images were inspected. These checks do not establish physical-printer acceptance.
Acceptance trace
“Automated PASS / human OPEN” means the implementation and measured local cases passed, while the original criterion's human component is still outstanding.
| Criterion | Outcome and evidence |
|---|---|
| AC-01 ownership/context | Automated PASS: canonical/source/override/sibling/frozen-package assertions; accurate general/application context. |
| AC-02 candidate selection | Automated PASS: sample before Apply, no save on open/cancel, stale/retry/locked handling, visual-only defaults and undo. Smoke now follows explicit Apply. |
| AC-03 editing/reorder | Automated PASS / physical touch OPEN: typed/custom/hidden/reset/order retained; keyboard focus/live position and coarse-pointer alternative checked. |
| AC-04 CV recovery | Automated PASS: save failure, stale rejection, recovery download, deliberate reload, blank-name validation and no blind overwrite. |
| AC-05 preview accuracy | Automated PASS: real labelled sample, readiness, stale response/last-good behavior, page navigation and native PDF oracles. |
| AC-06 all letter writers | Automated PASS on SQLite and actual MariaDB: create/generic/draft/dedicated/restore history, required/stale versions, atomicity, null/clear/no-op semantics and attachment flags. |
| AC-07 letter draft integrity | Automated PASS: explicit Save, failed/held save retention, dirty navigation Cancel, restore-as-new, late application/session result rejection. |
| AC-08 copy/match | Automated PASS / human review OPEN: explicit reviewed contact/design snapshots, optional location initially off, blank/unselected fields retained, no later live synchronization. |
| AC-09 export fidelity | Automated PASS / physical print OPEN: flush dirty draft, expected saved revision, no stale/failed/late download, ownership, real multipage oracles and extracted text. |
| AC-10 historical integrity | Automated PASS: honest current-master settings history, legacy text-only records, immutable CV/letter HTML/settings/archive bytes after source mutation. |
| AC-11 accessibility | Automated PASS / human AT OPEN: keyboard/modal/region/status semantics, inactive-pane behavior and axe; all incomplete results retained. |
| AC-12 responsive/localized | Automated PASS / phone/language review OPEN: finite EN/NB light/dark widths, actual automated browser 100/200/400% zoom, text spacing, long labels and primary-action hit tests. |
| AC-13 rendering/resources | Automated PASS: escaping/allowlists, owner checks and bounded timeout/admission/cancellation contracts; native rendering separately qualified. |
| AC-14 portability | Automated PASS: account/backup letter design/history, additive migration preservation and unchanged CSV/JSON round trips. |
| AC-15 evidence | PASS within local scope: exact source/process/report identities, discovery membership, unchanged tolerances, retained failures and explicit open gates. No human sign-off is implied. |
The five targeted letter axe states each have zero violations. Each retains one color-contrast incomplete set: 10/3/10/3/10 node observations across desktop write, 320px preview/write and 390px preview/write. These observations overlap and are not 36 unique defects or a completed contrast review. Original broad diagnostics retain their own incomplete vectors. Human screen reader, physical touch/software keyboard, natural-language quality, precise visual contrast and print review remain OPEN.
Mandatory writing assistant
| Action | Implemented and controlled-contract result | Live model |
|---|---|---|
| Improve writing | Direct field action; original/editable proposal, accept/reject/regenerate/cancel/stale/undo; source-language instruction PASS | BLOCKED |
| Suggest content | Direct field action; owned visible career facts required, insufficient source asks for input; reviewed local application PASS | BLOCKED |
| Grammar check | Direct field action; source-language/meaning preservation prompt, explicit review and stale protection PASS | BLOCKED |
| Shorter | Direct field action; source-language/meaning preservation prompt, editable review and cancellation PASS | BLOCKED |
All four use existing self-hosted service contracts, EN/Bokmål UI and existing entitlement/privacy owners. Controlled responses and prompt assertions do not demonstrate actual language or factual quality. CV capability/revision/grounding protections remain. Letter suggestions bind recorded owned job/CV/profile/attachment fingerprints, recheck after inference and validate the source again before Apply; stale or legacy unbound output is refused. Letter semantic grounding still lacks the CV factual evaluator and remains unqualified.
Local sidecar 8001/Ollama 11434 probes previously refused connections; no service/model was started or downloaded. The owner subsequently instructed “Keep live-model checks blocked.” Actual self-hosted EN/Bokmål inference/adversarial semantic acceptance therefore remains BLOCKED by explicit decision. Existing CV production registration is unchanged and disabled. No P5-13 model qualification, new provider or GPU/production readiness is claimed. See AI.md.
Review corrections and failed attempts
Whole-change review and focused re-review found material gaps that were corrected: optional contact selection, persistent document/AI language, recorded-source validation, last-good preview geometry and candidate-dialog keyboard scrolling. Final writer and Documents fixture corrections were independently reviewed without material findings. Final Linux helper was qualified by 11 offline lifecycle tests and the actual six-case render/cleanup run.
Retained failures/supersessions include wrapper logger quoting after a native backend pass; SDK path/apphost locking; provider preparation hash-command failure; the superseded image with an audit override (removed, never used for acceptance); early review supersessions; letter fixture iframe language initialization/breakpoint assumptions; the axe fixture label mismatch; and these aggregates:
final-04: real 7px last-good scroll regression; fixed selector lifetime, unchanged original recovery tolerances passed.final-05: real candidate-dialog keyboard scrolling axe failure; fixed named focusable region, unchanged original settings cases passed.final-06: 96/100 in first shard; blank optional letter headings/unnamed landmark plus preview POST classification. Shared renderer fixed; original 11 form cases passed.final-07: shard 2 passed 87/87; shard 3 failed 86/88. Documents preview counter corrected narrowly; real generic-writer attachment-flag regression fixed at the shared/dedicated owner boundary. New flag tests were RED before fix, then full backend/provider and original import passed.final-08: shard 4 failed 88/89 because smoke assumed immediate template application. Explicit sample/Apply fixture alignment passed without product changes.linux-final-01: internal network did not publish loopback API port; readiness failed before browser rendering. All owned cleanup succeeded. Successor uses the established owned bridge, verifies actual binding and passedlinux-final-02.
No failed full shard is replaced by adding a focused rerun. final-09 is the complete passing successor. Native migration, DataProtection, query-splitting, React test and caught checklist seeding warnings remain in logs; advisories/findings were not suppressed. Existing checklist uniqueness-race recovery was checked against the accepted baseline and left unchanged.
Reproduction and handoff
Use the pinned SDK through rtk proxy, run full backend/frontend checks, and discover then execute all four ordinary Playwright shards with retries 0 against fresh isolated data/static output. Run the ten named configurations in VERIFICATION.md serially; volume lanes run alone. Preserve process exits, source/runtime hashes and each report. The local run-final.py and collect-final.py are retained and hashed by the evidence index; select a new output directory rather than overwriting an accepted or failed attempt.
The repository helper is executable as rtk proxy python -B docs/cv-redesign/linux-run.py build --output <fresh-feature-image-root> followed by run --output <fresh-feature-render-root> --build-record <build.json> --image <immutable-image-id>. It checks identity/migration and owned cleanup. rtk proxy python -B docs/cv-redesign/test-linux-run.py runs the 11 offline checks. Use the unchanged pdf-proof.py per platform and verify-cv-fidelity.py separately for letters after producers stop. The detailed raw record index supplies actual command/process identities and inputs.
CV_IMPORT_HANDOFF.md supplies the revision/history/source/frozen-data compatibility contract. CV-IMPORT-01 has not started. Hosted MariaDB CI remains BLOCKED; hosted runner isolation remains UNVERIFIED; inherited Python security remains CONDITIONAL PASS with unresolved advisory/vendor-query coverage. CPU compatibility is historical tested scope, not GPU, semantic or production proof. Production security/recovery, database upgrade, FINN/NAV, P5-13 and Phase 10 remain separate. No main merge, production deployment, live database/server/model modification or registry publication occurred.