docs(cv): publish qualified acceptance and import handoff

This commit is contained in:
cesnimda
2026-10-26 10:37:31 +01:00
parent b1817aa52c
commit 4a0af6273b
10 changed files with 272 additions and 39 deletions
+10
View File
@@ -39,6 +39,16 @@ separates actual runtime evidence, exact-image limits, remaining CI qualificatio
The older [architecture/current.md](current.md) path is retained as a compatibility pointer to this overview. The older [architecture/current.md](current.md) path is retained as a compatibility pointer to this overview.
CV-UX-01 development architecture, 26 October 2026: the existing MUI CV editor and
physical-page renderer remain the owners. Career Profile is canonical; CV overrides
and null-as-inherit settings remain document-specific. All letter text/design/history
writers stage atomically through `ApplicationAssetsService` under `JobApplication.Version`.
Contact/design copies are reviewed snapshots; application packages freeze recorded
HTML/settings/artifacts. Letter AI records source fingerprints and validates them before
Apply. The additive letter-design migration and current acceptance limits are documented
in [CV-UX-01 acceptance](../cv-redesign/ACCEPTANCE.md). This is development evidence;
live-model checks are owner-blocked, and production/Phase 10 remain NO-GO.
## Important boundaries ## Important boundaries
- `Job` is the opportunity; `JobApplication` is the user's pursuit of it. Compatibility columns and dual writes remain until the production cutover gate is completed. - `Job` is the opportunity; `JobApplication` is the user's pursuit of it. Compatibility columns and dual writes remain until the production cutover gate is completed.
+111
View File
@@ -0,0 +1,111 @@
# 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](ENTRY.md), [PLAN.md](PLAN.md) and [CAPABILITIES.md](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](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](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 passed `linux-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](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](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.
+6
View File
@@ -1,5 +1,11 @@
# CV-UX-AI — contextual writing assistance # CV-UX-AI — contextual writing assistance
## Final qualification — 26 October 2026
[ACCEPTANCE.md](ACCEPTANCE.md) and [EVIDENCE.json](EVIDENCE.json) supersede the intermediate totals below. Final automated evidence passed: backend 1,234; frontend 981/107 suites; ordinary Chromium 364; dedicated CV AI authorization/recovery two cases; actual MariaDB 64 (including source-boundary/persistence tests). These suites overlap focused counts and do not establish actual inference quality. All four actions are implemented with controlled-contract tests, reviewed local application, missing-fact refusal and stale/cancel protection.
The owner explicitly instructed **“Keep live-model checks blocked.”** Actual self-hosted English/Bokmål generation, semantic grounding and adversarial language quality therefore remain BLOCKED. No model/service was started or downloaded. Letter source fingerprint freshness is qualified; it does not replace the absent letter factual evaluator. Existing disabled production CV registration, P5-13 deferral and production NO-GO remain unchanged. Human accessibility/language/contrast review remains open.
Owner-approved addition, 25 October 2026. This checkpoint is part of CV-UX-01 and does not close AI-P5-13 or authorise production activation. Owner-approved addition, 25 October 2026. This checkpoint is part of CV-UX-01 and does not close AI-P5-13 or authorise production activation.
## Existing owners and contracts ## Existing owners and contracts
@@ -1,5 +1,7 @@
# CV-UX implementation checkpoint — 25 October 2026 # CV-UX implementation checkpoint — 25 October 2026
**Superseded by final evidence:** see [ACCEPTANCE.md](ACCEPTANCE.md) and [EVIDENCE.json](EVIDENCE.json). This document retains intermediate implementation/review history, not current acceptance totals.
Workspace, section, candidate-template, letter-document and contextual AI implementation is ready for final integration qualification. This is not final CV-UX acceptance. Commands and remaining lanes are in VERIFICATION.md. Workspace, section, candidate-template, letter-document and contextual AI implementation is ready for final integration qualification. This is not final CV-UX acceptance. Commands and remaining lanes are in VERIFICATION.md.
The existing editor retains its save queue, content/settings ownership, preview and undo. Document context/history provenance are explicit; movement announces position and retains boundary focus; previews have page selection. Template candidates use real renderer samples, make no writes until Apply, reject late responses and use reversible visual-only application. The existing editor retains its save queue, content/settings ownership, preview and undo. Document context/history provenance are explicit; movement announces position and retains boundary focus; previews have page selection. Template candidates use real renderer samples, make no writes until Apply, reject late responses and use reversible visual-only application.
+4
View File
@@ -1,11 +1,15 @@
# CV-IMPORT-01 handoff — implementation not started # CV-IMPORT-01 handoff — implementation not started
Final CV-UX application/UI checkpoint: `b1817aa52c604f12df3c875b53b8f4e69fa6f2be`, descending from `28f83df`. [ACCEPTANCE.md](ACCEPTANCE.md) records automated development PASS with conditional overall acceptance, owner-blocked live-model checks and open human/hosted/production gates. The final report/evidence and tested Linux helper correction are published separately from application source. This handoff does not activate CV-IMPORT-01.
This document supplies compatibility requirements from CV-UX-01. It does not authorise or start Docling, model qualification, legacy-parser replacement or Phase10 cleanup. This document supplies compatibility requirements from CV-UX-01. It does not authorise or start Docling, model qualification, legacy-parser replacement or Phase10 cleanup.
Career Profile remains the canonical career-data owner. An eventual import must preview and explicitly reconcile facts through the established profile service; it must preserve CV-specific overrides, hidden/order choices, null-as-inherit design settings and existing revisions. CV settings history resolves the current Career Profile; it is not a historical full-profile snapshot. Career Profile remains the canonical career-data owner. An eventual import must preview and explicitly reconcile facts through the established profile service; it must preserve CV-specific overrides, hidden/order choices, null-as-inherit design settings and existing revisions. CV settings history resolves the current Career Profile; it is not a historical full-profile snapshot.
Cover letters use the parent JobApplication.Version for optimistic concurrency. Every intended writer stages current text, normalized document settings and history through ApplicationAssetsService before the parent transaction commits. Preserve generic null-clear versus draft null-unchanged semantics, no-op acknowledgements, recovery of previously uncovered legacy text, restore-as-new and owner filtering. Do not introduce an independent revision counter or write CoverLetterText directly from import code. Cover letters use the parent JobApplication.Version for optimistic concurrency. Every intended writer stages current text, normalized document settings and history through ApplicationAssetsService before the parent transaction commits. Preserve generic null-clear versus draft null-unchanged semantics, no-op acknowledgements, recovery of previously uncovered legacy text, restore-as-new and owner filtering. Do not introduce an independent revision counter or write CoverLetterText directly from import code.
Preserve attachment flags independently: generic/create/application-draft text writers retain the previous `HasCoverLetter` value; only a changed nonempty dedicated letter Save retains its historical promotion behavior. Imported text must not imply an imported attachment. Checklist readiness already considers actual nonempty text. New regression coverage proves both flag values and clear/no-op/restore behavior on SQLite and MariaDB.
Contact/design copies are explicit reviewed snapshots. Imported facts or later CV edits must not silently rewrite saved letters. Historical text-only letters and submitted packages remain readable. New submitted packages freeze letter HTML/settings and CV output; future source changes must not rewrite their bytes. Account/backup portability includes letter design/history. Contact/design copies are explicit reviewed snapshots. Imported facts or later CV edits must not silently rewrite saved letters. Historical text-only letters and submitted packages remain readable. New submitted packages freeze letter HTML/settings and CV output; future source changes must not rewrite their bytes. Account/backup portability includes letter design/history.
CV AI proposals are bound to owned source/revision capabilities and reviewed acceptance. Letter AI requires an owned linked CV with actual visible career evidence. Advert requirements, identity/header text and a previous letter do not establish experience. Import text is untrusted data, never model instructions. Reuse the existing approved self-hosted infrastructure; do not infer semantic, GPU or production readiness from CPU compatibility or mocked UI tests. CV AI proposals are bound to owned source/revision capabilities and reviewed acceptance. Letter AI requires an owned linked CV with actual visible career evidence. Advert requirements, identity/header text and a previous letter do not establish experience. Import text is untrusted data, never model instructions. Reuse the existing approved self-hosted infrastructure; do not infer semantic, GPU or production readiness from CPU compatibility or mocked UI tests.
+94
View File
@@ -0,0 +1,94 @@
{
"status": "AUTOMATED_EVIDENCE_RECONCILED",
"production": "NO-GO",
"ordinary": 364,
"separateLanes": {
"ai": 2,
"auth": 2,
"rate": 9,
"ingress": 6,
"pdf-admission": 1,
"preferences": 3,
"rd21": 6,
"diagnostics": 18,
"volume": 3,
"rd21-volume": 3
},
"backend": {
"passed": 1234,
"sha256": "6de8d7d9713b15d4f7c5898f3eca5f2098a0a6c7b29e78002bccbcf5ba876d64",
"testNamesSha256": "fabd1b637359562ca08399dde21187a01e1f243bb516f789efc01bc09dc31159"
},
"frontendPassed": 981,
"frontendSuites": 107,
"mariaDb": {
"passed": 64,
"sha256": "304f3ea474f3e74d2fdfb4b79e6d64f7d1d73bfeff73d511278b756c373341ce",
"testNamesSha256": "bbe0f06a43c7566b2f39b9232ae6bde50cc7c36b6e8eec58f2c63f67f0953941"
},
"pdf": {
"windows": {
"cvProofSha256": "72c0c9c649585a2406f64e83b76b4d58cc9e2371e8ff5ce57e43ff7961cb094a",
"letterPassed": 4,
"letterReportSha256": "9096ba0c70445609ab186c0517d656ad20699254d8d606a7e0ad940f81a6928a"
},
"linux": {
"cvProofSha256": "b27f2053910c5e826efd611e6c09aefb07f6b4f8ba6b6b180fba10885c210401",
"letterPassed": 4,
"letterReportSha256": "4f9d8e992425d3eaedf40255f73541e67ce828bcac6d950cb373f5a73b2ac685"
}
},
"testedHead": "b1817aa52c604f12df3c875b53b8f4e69fa6f2be",
"linuxImage": "sha256:690cf21b2e434b9d484810966d3d9aead1a1c0a0a8b506cb904863f0aa0c5d35",
"openGates": [
"Actual self-hosted inference unavailable",
"Human accessibility/device/language/print review",
"Hosted MariaDB blocked; runner isolation unverified",
"Production security/recovery/release audit",
"Phase10 and CV-IMPORT not started"
],
"artifactRoot": "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\cv-ux-01",
"ownerLiveModelDecision": "Keep live-model checks blocked",
"rawEvidence": {
"reconciled-final.json": "56b473a0777a9b9eafe178d4f5b4225d5999bd125a67a88822e6a5f4ad4aaaae",
"final-letter-text.json": "bd8cbe8c9942a5615694f6bbbf54469799842a82a2457c63ec55cf20f3c9959d",
"collect-final.py": "8d97cb9256fad42a18cb602f0021850422cae6109b49838fa9c29d1ee436b0f2",
"final-09/git.json": "ae29869aec8a1859cb418f955c6724f078691a04932c93847f9bbdb23a32beaf",
"final-09/process.json": "228cbe69dea9339a034aea61ecf919587e21d50e457202676b02687c31c7d789",
"final-09/backend/backend.trx": "6de8d7d9713b15d4f7c5898f3eca5f2098a0a6c7b29e78002bccbcf5ba876d64",
"final-09/source-before.json": "797057237b37913ae9605918253190aa82dca1c3dfd64db6946fbd4ece23f6b5",
"final-09/source-after.json": "797057237b37913ae9605918253190aa82dca1c3dfd64db6946fbd4ece23f6b5",
"final-09/runtime-before.json": "0704a326c3d37c0277d6864587998024976f62f36d5f830539deea698901d53c",
"final-09/runtime-after.json": "0704a326c3d37c0277d6864587998024976f62f36d5f830539deea698901d53c",
"frontend-final-03/frontend.json": "88aedfc62c762423402b56784012fb81b2657c6b96263b8833d0a7fbd8d90049",
"frontend-final-03/process.json": "fbdad4e948d442a62f76b4f1b563c43a7965b16a080e43edd18923a2f6e6361e",
"frontend-final-03/source-before.json": "c476824e60b69926e1c00bd94b556629f099884e326ccabc2e48b5226d2f6309",
"frontend-final-03/source-after.json": "c476824e60b69926e1c00bd94b556629f099884e326ccabc2e48b5226d2f6309",
"provider-final-05/mariadb.trx": "304f3ea474f3e74d2fdfb4b79e6d64f7d1d73bfeff73d511278b756c373341ce",
"provider-final-05/run.json": "6cc6138a345c2646fdae70a96bd3a9b0a7e2e03a5f1797f6d3b383509ddcedea",
"provider-final-05/source-check.json": "1b7a731ac80008ea6c529060ee50595ee77f4adb61820473134595b94a949765",
"provider-final-05/compose-cleanup.log": "05b6834d5bef8e843cddf370bb1eeaa57ce8374beffae7a21c2604ba38669a7c",
"linux-image-10/build.json": "7ec3b08f7f1d6f7f9b9fe2577105fdcad468f18726aa007c4ee24919104ac3a8",
"linux-final-02/process.json": "630a21941292e5fa88464d189879a3b6244f781a47953b4c5bf933921201f67d",
"linux-final-02/linux-renderer.json": "0c587ba32d4c787484701f01db74232148a8653c1a30d82ad14083e983f99389",
"final-09/windows/native-pdf.json": "72c0c9c649585a2406f64e83b76b4d58cc9e2371e8ff5ce57e43ff7961cb094a",
"linux-final-02/linux-pdf.json": "b27f2053910c5e826efd611e6c09aefb07f6b4f8ba6b6b180fba10885c210401",
"final-09/windows/letter-fidelity/fidelity-results.json": "9096ba0c70445609ab186c0517d656ad20699254d8d606a7e0ad940f81a6928a",
"linux-final-02/letter-fidelity/fidelity-results.json": "4f9d8e992425d3eaedf40255f73541e67ce828bcac6d950cb373f5a73b2ac685",
"final-09/discovery.json": "052a9911668131f803dbdc0d0e024d33a676e378600d4186de8717ff7b251321",
"final-09/ordinary-1.json": "c0302607f124d68d680d43dc7368cbe5273535c75167b11600e58a0c1139fb45",
"final-09/ordinary-2.json": "ce70dc928381b298cfc3130b8a5b399edb7f174a9f8aa55dbc888780586472ec",
"final-09/ordinary-3.json": "22f2dc7e261227ebe47ff22fd6b04fcc62bcf49c90410285c352045a518cd1c1",
"final-09/ordinary-4.json": "67f01b56200bd523543ee1d5cdb7e82dd05a79b61255c515ff9e7a40afccb9fd",
"final-09/ai.json": "15e86d9a807e97846fefc6f57bd19f62e7f7d40d74851e3daab2b14ab68abc96",
"final-09/auth.json": "144d92d0689e51439fed3648e8cb9c9ad3ce3eef75d9f940f5cef4b8ab2320c6",
"final-09/rate.json": "a7c7ad16aa95fb0d3e641a577e3229d260cf2aff738b4be614062a027c1d8e5f",
"final-09/ingress.json": "b577012092b84fc14596a0e032c86ecd66f6755d512dde88b8d39b5e057f2fef",
"final-09/pdf-admission.json": "19705e7e7ff458530f9ff5bf6a8896587a81a8e08fc384819a4060627fc7c987",
"final-09/preferences.json": "d4e736f60c96bcfabc4687a6cde24d8f5a9ef1563e4e242082fbe0c412d410d5",
"final-09/rd21.json": "2bc097a58817f0ce9839d4d2ceee852d95586b0a36abc79d5b6828c28da2ec26",
"final-09/diagnostics.json": "0a9d6329bf7f25225f720fa1e57eb65e79a9f04b2db317d8a7f26210b96b36d9",
"final-09/volume.json": "7d0865b29dacc70cee4d85591dbcce70d077028e502b4449ffa92f551f646e41",
"final-09/rd21-volume.json": "4d59e89c803bc896962aa7aaf7126d578c63188f7036c8de66c31ec95c882a94"
}
}
+17 -24
View File
@@ -1,29 +1,22 @@
# CV-UX-01 checkpoint ledger # CV-UX-01 checkpoint ledger
- [x] Verify accepted baseline `28f83df`, clean checkout and current architecture. Current decision: **automated development acceptance PASS; overall CONDITIONAL GO**. [ACCEPTANCE.md](ACCEPTANCE.md) and [EVIDENCE.json](EVIDENCE.json) supersede intermediate counts and pending-run notes. Production and Phase 10 remain NO-GO.
- [x] Verify accepted baseline `28f83df`, current architecture and dependency gates.
- [x] Create requested feature branch and formal scope/entry decision. - [x] Create requested feature branch and formal scope/entry decision.
- [x] CV-UX-00: finish research traceability/import and validate portable evidence. - [x] CV-UX-00: original research review, 83 hashes/37 screenshot-DOM pairs, preservation inventory and architecture reconciliation.
- [ ] CV-UX-01: workspace/context/history improvements with preserved save owners. - [x] CV-UX-01: workspace/context/history improvements retaining current save owners.
- [ ] CV-UX-02: section interaction/focus/accessibility improvements. - [x] CV-UX-02: section discovery, reorder feedback/focus and source preservation.
- [ ] CV-UX-03: actual candidate preview and explicit reversible application. - [x] CV-UX-03: real candidate sample, explicit Apply/cancel, reversible design and page navigation.
- [ ] CV-UX-04: qualify all-writer letter dependency and approved document integration. - [x] CV-UX-04: qualify all letter writers and document/cover-letter integration.
- [ ] CV-UX-05: persistence/recovery/concurrency preservation. - [x] CV-UX-05: persistence, recovery, concurrency and historical/frozen-data protection.
- [ ] CV-UX-06: responsive/accessibility/localisation qualification. - [x] CV-UX-06: automated responsive, accessibility and localisation checks.
- [ ] CV-UX-AI: four contextual actions, source-grounded review, stale-response protection, EN/Bokmål and separate actual-model qualification; see AI.md. - [x] CV-UX-AI: implement four contextual actions, reviewed local acceptance, source refusal and stale/cancel protection with controlled-contract tests.
- [ ] CV-UX-07: full regression/PDF/acceptance and CV-IMPORT handoff. - [x] CV-UX-07: complete local regression, Windows/Linux PDF oracles, acceptance report and CV-IMPORT compatibility handoff.
- [ ] Live-model EN/Bokmål semantics: **BLOCKED by explicit owner instruction to keep checks blocked**; no model/service startup or qualification.
- [ ] Human screen reader, physical device/software keyboard, language, contrast-incomplete and print review: OPEN.
- [ ] Hosted CI MariaDB/isolation and production release/security/recovery: separate workstreams, not authorised here.
Entry ruling: user explicitly authorises autonomous implementation; no additional design-approval round is required. Reuse the clean requested branch in place, retaining installed build/test dependencies. No worktree/setup dependency installation is necessary. Final evidence: backend 1,234; frontend 981/107 suites; ordinary browser 364 exact discovered cases; local MariaDB 64; Linux renderer six cases; ten separate contract/diagnostic/volume lanes. Each platform passed original CV24/60-page and separate letter4/14-page oracles. All final native lanes have zero skips/retries where applicable. Focused reruns overlap these totals and are not added.
Implementation/focused checks are complete for CV-UX-01–05 and CV-UX-AI; their acceptance boxes remain open pending final integration reconciliation. See CHECKPOINT_IMPLEMENTATION.md for intermediate evidence, including superseded attempts. Mocked AI results do not establish model quality. Validated checkpoints were committed/pushed to `feature/cv-editor-flowcv-redesign`. Failed/superseded attempts remain identified in acceptance and raw artifacts. No main merge, production deployment, live infrastructure/model changes, CV-IMPORT implementation, P5-13, FINN/NAV or Phase 10 work started.
Reviewed successor:65/65 prompt contract tests,972/972 full frontend,56/56 fresh actual MariaDB and one seven-scenario responsive letter browser case passed. Linux lifecycle self-checks10/10. Full ordinary discovery increases from362 historical to364 (one physical letter producer and one responsive case). Final independent contract/PDF/browser lanes remain open. Actual local inference is blocked by absent approved local services; human/hosted/production gates remain open.
Independent review corrections complete: optional contact selection, persistent physical/AI language, and recorded-source validation after inference/before Apply. Full Release backend1227/1227 and full frontend981/981/107suites passed; source hashes stable. Two focused real letter browser cases and unchanged Windows letter oracle4documents/14pages passed. Final aggregate and actual MariaDB source-transaction lanes remain open. Superseded final-01/02/03 attempts are retained and cannot establish full browser acceptance.
Actual provider source-boundary suite59/59 passed with stable sources and positive cleanup; five targeted letter axe scans and real403/404 authorization checks passed. Final aggregate browser/contract/volume and Windows/Linux original CV+letter PDF gates remain open.
`final-04` found and retained a preview scroll regression. One-condition selector lifetime fix passed the unchanged two EN/NB recovery scenarios and50 focused editor tests; static build/review pass. Full frontend successor and `final-05` aggregate qualification remain pending.
`final-05` found and retained candidate-dialog keyboard-scroll accessibility failure. Focusable labelled DialogContent fix passed all four unchanged settings/source/history/native-output cases plus6 candidate unit tests/build/review. Fresh full frontend and `final-06` aggregate remain pending.
Historical evidence: Phase 9 conditional acceptance is inherited, not fresh CV-UX test execution. Hosted isolation/production/manual/provider/AI semantic limitations remain open. Research checksum verification: 83/83; screenshot pairs: 37/37; contact sheets inspected locally. Raw third-party imagery stays outside Git/product assets.
+15 -13
View File
@@ -1,5 +1,7 @@
# CV-UX verification execution plan # CV-UX verification execution plan
**Final status, 26 October:** execution completed. [ACCEPTANCE.md](ACCEPTANCE.md) and [EVIDENCE.json](EVIDENCE.json) are authoritative for current results. The prospective instructions below and dated checkpoint notes are retained for provenance; statements that a feature adapter or collector is not yet implemented are historical. Current helper: `linux-run.py`; offline checks: 11/11; actual successor: `linux-final-02`. All shell reproduction examples use `rtk proxy`. Live-model checks remain BLOCKED at the owner's explicit instruction.
Prepared 25 October 2026 from the existing Phase 9 reproduction instructions and runners. This document is a prospective execution plan, not passing evidence. The parent owns the final source freeze, serial execution, reconciliation and publication. Do not execute while workers are changing backend/frontend sources. Preserve every failed or superseded attempt. Prepared 25 October 2026 from the existing Phase 9 reproduction instructions and runners. This document is a prospective execution plan, not passing evidence. The parent owns the final source freeze, serial execution, reconciliation and publication. Do not execute while workers are changing backend/frontend sources. Preserve every failed or superseded attempt.
## Fresh identity and lifecycle ## Fresh identity and lifecycle
@@ -37,8 +39,8 @@ The model-disable variables retain the established local application regression
Root cwd: Root cwd:
```powershell ```powershell
rtk C:/Users/Connor/.dotnet/dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore --logger 'trx;LogFileName=backend.trx' --results-directory "$cvUxRoot/backend" rtk proxy C:/Users/Connor/.dotnet/dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-restore --logger 'trx;LogFileName=backend.trx' --results-directory "$cvUxRoot/backend"
rtk C:/Users/Connor/.dotnet/dotnet.exe build JobTrackerApi/JobTrackerApi.csproj --configuration Release --no-restore rtk proxy C:/Users/Connor/.dotnet/dotnet.exe build JobTrackerApi/JobTrackerApi.csproj --configuration Release --no-restore
``` ```
The backend test build also creates the Release PDF process stub required by the separate admission config. If locked restore is actually required, record that separate command/outcome; never treat a restore-only exit as a test result. The backend test build also creates the Release PDF process stub required by the separate admission config. If locked restore is actually required, record that separate command/outcome; never treat a restore-only exit as a test result.
@@ -46,10 +48,10 @@ The backend test build also creates the Release PDF process stub required by the
UI cwd `E:/Storage/Projects/Active/Job tracker/job-tracker-ui`: UI cwd `E:/Storage/Projects/Active/Job tracker/job-tracker-ui`:
```powershell ```powershell
rtk node node_modules/jest/bin/jest.js --runInBand --json "--outputFile=$cvUxRoot/frontend.json" rtk proxy node node_modules/jest/bin/jest.js --runInBand --json "--outputFile=$cvUxRoot/frontend.json"
rtk node node_modules/typescript/bin/tsc --noEmit --incremental false rtk proxy node node_modules/typescript/bin/tsc --noEmit --incremental false
rtk node node_modules/eslint/bin/eslint.js . --max-warnings=0 rtk proxy node node_modules/eslint/bin/eslint.js . --max-warnings=0
rtk node --max-old-space-size=4096 node_modules/next/dist/bin/next build rtk proxy node --max-old-space-size=4096 node_modules/next/dist/bin/next build
``` ```
Record fresh native totals rather than fixing expected counts to the historical backend 1130/frontend 935. Compare discovery/membership with baseline; every added/removed/renamed case needs an explicit source-backed explanation. Do not add earlier focused worker checks to the full-suite totals. Record fresh native totals rather than fixing expected counts to the historical backend 1130/frontend 935. Compare discovery/membership with baseline; every added/removed/renamed case needs an explicit source-backed explanation. Do not add earlier focused worker checks to the full-suite totals.
@@ -60,7 +62,7 @@ Keep UI cwd and the environment above. First retain ordinary discovery:
```powershell ```powershell
$env:PLAYWRIGHT_JSON_OUTPUT_NAME = "$cvUxRoot/discovery.json" $env:PLAYWRIGHT_JSON_OUTPUT_NAME = "$cvUxRoot/discovery.json"
rtk node node_modules/@playwright/test/cli.js test --list --retries=0 --reporter=list,json rtk proxy node node_modules/@playwright/test/cli.js test --list --retries=0 --reporter=list,json
``` ```
Execute four complete shards **one at a time**, with process metadata/logs and a separate native JSON for each: Execute four complete shards **one at a time**, with process metadata/logs and a separate native JSON for each:
@@ -79,7 +81,7 @@ Execute each configuration below separately using this exact command pattern, se
```powershell ```powershell
$env:PLAYWRIGHT_JSON_OUTPUT_NAME = "$cvUxRoot/$cvUxLane.json" $env:PLAYWRIGHT_JSON_OUTPUT_NAME = "$cvUxRoot/$cvUxLane.json"
rtk node node_modules/@playwright/test/cli.js test --retries=0 --reporter=list,json "--output=$cvUxRoot/$cvUxLane-results" "--config=$cvUxConfig" rtk proxy node node_modules/@playwright/test/cli.js test --retries=0 --reporter=list,json "--output=$cvUxRoot/$cvUxLane-results" "--config=$cvUxConfig"
``` ```
| Lane | Configuration relative to UI cwd | Historical expected membership (verify fresh) | | Lane | Configuration relative to UI cwd | Historical expected membership (verify fresh) |
@@ -102,7 +104,7 @@ The six contract lanes historically total 23; RD21/diagnostics/volume lanes rema
The letter-persistence worker owns provider qualification. Its earlier 47-case all-writer gate predates document design/migration; it is not the final additive-schema gate. Its later checkpoint at `.artifacts/cv-ux-01/letter-design-mariadb` reported 56/56 passing with the additive migration and provider downgrade/reupgrade preservation, and positive generated-project cleanup. That is separately reported worker evidence, not a fresh parent frozen-source full regression. The guarded runner already supports fresh output and generated projects/schemas: The letter-persistence worker owns provider qualification. Its earlier 47-case all-writer gate predates document design/migration; it is not the final additive-schema gate. Its later checkpoint at `.artifacts/cv-ux-01/letter-design-mariadb` reported 56/56 passing with the additive migration and provider downgrade/reupgrade preservation, and positive generated-project cleanup. That is separately reported worker evidence, not a fresh parent frozen-source full regression. The guarded runner already supports fresh output and generated projects/schemas:
```powershell ```powershell
rtk python scripts/mariadb-integration.py --output "$cvUxRoot/mariadb" rtk proxy python scripts/mariadb-integration.py --output "$cvUxRoot/mariadb"
``` ```
Run only after final source freeze and record actual new TRX membership/count, exact pinned image/server 12.2.2, schema ownership and positive cleanup. The runner's default mode creates a generated `jobtracker-it-<uuid>` project, loopback random port and tmpfs test data, then removes only its owned test service. Do not substitute SQLite or developer `mariadb-dev`; do not use broad prune/down -v. An earlier worker checkpoint may support development sequencing but cannot be added to this fresh full provider total. Run only after final source freeze and record actual new TRX membership/count, exact pinned image/server 12.2.2, schema ownership and positive cleanup. The runner's default mode creates a generated `jobtracker-it-<uuid>` project, loopback random port and tmpfs test data, then removes only its owned test service. Do not substitute SQLite or developer `mariadb-dev`; do not use broad prune/down -v. An earlier worker checkpoint may support development sequencing but cannot be added to this fresh full provider total.
@@ -114,7 +116,7 @@ Existing MariaDB browser/HTTP-observation/15-minute workload helpers have fixed
Ordinary shards produce the existing 16-fixture fidelity corpus and four settings-browser cases containing eight settings states in the fresh Windows roots above. Stop all producers before proof. Root cwd, use the bundled Python (verify available; retained installation path shown): Ordinary shards produce the existing 16-fixture fidelity corpus and four settings-browser cases containing eight settings states in the fresh Windows roots above. Stop all producers before proof. Root cwd, use the bundled Python (verify available; retained installation path shown):
```powershell ```powershell
rtk C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B docs/redesign/phase-9/p9-requal-01/pdf-proof.py --platform windows --fidelity-root "$cvUxRoot/windows/fidelity" --settings-root "$cvUxRoot/windows/settings-fidelity" --output "$cvUxRoot/windows/proof" --record "$cvUxRoot/windows/native-pdf.json" rtk proxy C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B docs/redesign/phase-9/p9-requal-01/pdf-proof.py --platform windows --fidelity-root "$cvUxRoot/windows/fidelity" --settings-root "$cvUxRoot/windows/settings-fidelity" --output "$cvUxRoot/windows/proof" --record "$cvUxRoot/windows/native-pdf.json"
``` ```
`pdf-proof.py` accepts fresh roots unchanged and checks exact 16/36-page plus 8/24-page membership using `scripts/verify-cv-fidelity.py`. Retain original oracle SHA256 `64f82e622cc11483c33307d987e969f6cf27f82ab6bdbd72c2aeb1bfbceade87`; never edit tolerances or fixture expectations to make this feature pass. A real regression stays FAIL with artifacts. `pdf-proof.py` accepts fresh roots unchanged and checks exact 16/36-page plus 8/24-page membership using `scripts/verify-cv-fidelity.py`. Retain original oracle SHA256 `64f82e622cc11483c33307d987e969f6cf27f82ab6bdbd72c2aeb1bfbceade87`; never edit tolerances or fixture expectations to make this feature pass. A real regression stays FAIL with artifacts.
@@ -143,7 +145,7 @@ Set fresh `CV_FIDELITY_OUTPUT`, `CV_SETTINGS_FIDELITY_OUTPUT`, `LETTER_FIDELITY_
After successful Linux producers and positive cleanup, root cwd: After successful Linux producers and positive cleanup, root cwd:
```powershell ```powershell
rtk C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B docs/redesign/phase-9/p9-requal-01/pdf-proof.py --platform linux --fidelity-root "$cvUxRoot/linux/fidelity" --settings-root "$cvUxRoot/linux/settings-fidelity" --output "$cvUxRoot/linux/proof" --record "$cvUxRoot/linux/linux-pdf.json" rtk proxy C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B docs/redesign/phase-9/p9-requal-01/pdf-proof.py --platform linux --fidelity-root "$cvUxRoot/linux/fidelity" --settings-root "$cvUxRoot/linux/settings-fidelity" --output "$cvUxRoot/linux/proof" --record "$cvUxRoot/linux/linux-pdf.json"
``` ```
## Separate letter physical fidelity ## Separate letter physical fidelity
@@ -153,8 +155,8 @@ The new `e2e/cover-letter-document-fidelity.spec.ts` is a real authenticated pro
Its measurements use the existing oracle's schema. The unchanged lower-level oracle supports arbitrary corpus size, so **no new PDF oracle or widened tolerances are needed**. Run separately after each platform's producers stop: Its measurements use the existing oracle's schema. The unchanged lower-level oracle supports arbitrary corpus size, so **no new PDF oracle or widened tolerances are needed**. Run separately after each platform's producers stop:
```powershell ```powershell
rtk C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B scripts/verify-cv-fidelity.py "$cvUxRoot/windows/letter-fidelity" rtk proxy C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B scripts/verify-cv-fidelity.py "$cvUxRoot/windows/letter-fidelity"
rtk C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B scripts/verify-cv-fidelity.py "$cvUxRoot/linux/letter-fidelity" rtk proxy C:/Users/Connor/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe -B scripts/verify-cv-fidelity.py "$cvUxRoot/linux/letter-fidelity"
``` ```
Require exactly the four fixture names `light-en-a4`, `dark-nb-a4`, `light-nb-letter`, `dark-en-letter`, each native result passing without failures, no duplicate/missing marker, matching physical page count/geometry/fonts/colors/safe areas. Retain `fidelity-results.json`, actual PDF page images/comparison images and producer inputs/hashes. Do not add these four documents to either original CV24 count. Review extracted PDF text for full sender email/phone/location, multiline recipient, subject, bold/italic content and final diacritics; marker checks alone do not establish every unmarked string. No physical printer/human fidelity claim follows from this oracle. Require exactly the four fixture names `light-en-a4`, `dark-nb-a4`, `light-nb-letter`, `dark-en-letter`, each native result passing without failures, no duplicate/missing marker, matching physical page count/geometry/fonts/colors/safe areas. Retain `fidelity-results.json`, actual PDF page images/comparison images and producer inputs/hashes. Do not add these four documents to either original CV24 count. Review extracted PDF text for full sender email/phone/location, multiline recipient, subject, bold/italic content and final diacritics; marker checks alone do not establish every unmarked string. No physical printer/human fidelity claim follows from this oracle.
+5 -1
View File
@@ -268,7 +268,8 @@ def run(args):
assert sql(f"SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='{schema}'") == '0' assert sql(f"SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='{schema}'") == '0'
sql(f'CREATE DATABASE `{schema}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci') sql(f'CREATE DATABASE `{schema}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci')
created = True created = True
commands.run(['docker', 'network', 'create', '--internal', '--label', 'task=cv-ux-01', network]) # A regular owned bridge permits Docker's loopback-only published API port.
commands.run(['docker', 'network', 'create', '--label', 'task=cv-ux-01', network])
network_created = True network_created = True
commands.run(['docker', 'network', 'connect', '--alias', 'mariadb', network, db]) commands.run(['docker', 'network', 'connect', '--alias', 'mariadb', network, db])
attached = True attached = True
@@ -287,6 +288,9 @@ def run(args):
commands.run(create + [args.image]) commands.run(create + [args.image])
assert commands.run(['docker', 'inspect', '--format', '{{.Image}}', api]) == args.image assert commands.run(['docker', 'inspect', '--format', '{{.Image}}', api]) == args.image
commands.run(['docker', 'start', api]) commands.run(['docker', 'start', api])
bindings = json.loads(commands.run(['docker', 'inspect', '--format', '{{json .NetworkSettings.Ports}}', api]))
if bindings.get('8080/tcp') != [{'HostIp': '127.0.0.1', 'HostPort': '5302'}]:
raise ValueError('Owned API loopback port was not published.')
deadline = time.monotonic() + 120 deadline = time.monotonic() + 120
while True: while True:
try: try:
+8 -1
View File
@@ -135,6 +135,8 @@ class LifecycleTests(unittest.TestCase):
if args[:2] == ['docker', 'inspect'] and args[-1] == DB: if args[:2] == ['docker', 'inspect'] and args[-1] == DB:
return json.dumps([database()]) return json.dumps([database()])
if args[:2] == ['docker', 'inspect']: if args[:2] == ['docker', 'inspect']:
if '{{json .NetworkSettings.Ports}}' in args:
return json.dumps({'8080/tcp': [] if failure == 'port' else [{'HostIp': '127.0.0.1', 'HostPort': '5302'}]})
return IMAGE return IMAGE
if '--entrypoint' in args and args[args.index('--entrypoint') + 1] == 'sha256sum': if '--entrypoint' in args and args[args.index('--entrypoint') + 1] == 'sha256sum':
return 'f' * 64 + ' ' + runner.APP + '/JobTrackerApi.dll' return 'f' * 64 + ' ' + runner.APP + '/JobTrackerApi.dll'
@@ -191,11 +193,16 @@ class LifecycleTests(unittest.TestCase):
return calls return calls
def test_success_records_positive_cleanup(self): def test_success_records_positive_cleanup(self):
self.exercise() calls = self.exercise()
network = next(args for args in calls if args[:3] == ['docker', 'network', 'create'])
self.assertNotIn('--internal', network)
def test_api_startup_failure_still_cleans_every_owned_resource(self): def test_api_startup_failure_still_cleans_every_owned_resource(self):
self.exercise('startup') self.exercise('startup')
def test_unpublished_api_port_fails_and_cleans_every_owned_resource(self):
self.exercise('port')
def test_log_failure_cannot_suppress_removal_or_pass(self): def test_log_failure_cannot_suppress_removal_or_pass(self):
self.exercise('log') self.exercise('log')