From 7db3b4a3b6aeacb786b77ba1bf4849c96965cb73 Mon Sep 17 00:00:00 2001 From: cesnimda Date: Wed, 11 Nov 2026 18:54:58 +0100 Subject: [PATCH] docs(cv): bind library lifetime verification and E-drive graph --- docs/ui-modernisation/CV_LIBRARY_LIFETIME.md | 22 ++++++++++++++++++ .../cv-library-lifetime/SOURCE_RECEIPTS.json | 19 +++++++++++++++ .../evidence/cv-library-lifetime/graph.txt | 22 ++++++++++++++++++ .../evidence/cv-library-lifetime/green.txt | 7 ++++++ .../evidence/cv-library-lifetime/lint.txt | 0 .../evidence/cv-library-lifetime/red.txt | Bin 0 -> 116076 bytes .../evidence/cv-library-lifetime/results.json | 1 + .../evidence/cv-library-lifetime/types.txt | 0 8 files changed, 71 insertions(+) create mode 100644 docs/ui-modernisation/CV_LIBRARY_LIFETIME.md create mode 100644 docs/ui-modernisation/evidence/cv-library-lifetime/SOURCE_RECEIPTS.json create mode 100644 docs/ui-modernisation/evidence/cv-library-lifetime/graph.txt create mode 100644 docs/ui-modernisation/evidence/cv-library-lifetime/green.txt create mode 100644 docs/ui-modernisation/evidence/cv-library-lifetime/lint.txt create mode 100644 docs/ui-modernisation/evidence/cv-library-lifetime/red.txt create mode 100644 docs/ui-modernisation/evidence/cv-library-lifetime/results.json create mode 100644 docs/ui-modernisation/evidence/cv-library-lifetime/types.txt diff --git a/docs/ui-modernisation/CV_LIBRARY_LIFETIME.md b/docs/ui-modernisation/CV_LIBRARY_LIFETIME.md new file mode 100644 index 00000000..4a28f3c3 --- /dev/null +++ b/docs/ui-modernisation/CV_LIBRARY_LIFETIME.md @@ -0,0 +1,22 @@ +# CV library action lifetime + +11 November 2026. Source commit `de2fb452`, based on `cef45404`, branch `codex/a3-ui-10`. + +The library allowed a create response to navigate after unmount and a PDF response to trigger a download after leaving or session invalidation. Confirmed delete and a rename read could also continue into a write after session loss. Duplicate completion could start another read and announce success in the stale context. + +Reused the existing session-boundary cookie/context/invalidation functions and the BackupCard mount-generation pattern. Guarded profile-outline completion, create navigation, duplicate reload/feedback, deletion confirmation/completion, rename prompt/read/write completion, PDF download and asynchronous error decoding. Existing action locking, focus, drafts, current-language feedback, revision payloads and confirmations remain. No JSX, route, schema, canonical profile, renderer or PDF style changes. + +## Verification + +- RED: seven new deferred-response cases failed on the original source; 24 other library cases were filtered out. The first wrapper had environment-assignment errors before Jest; Jest still executed and produced the seven expected assertion failures. Its raw receipt is retained, not presented as a clean command execution. +- GREEN: 85 distinct cases across five suites passed, no skips: CV library 35, CV API helpers 15, session boundary 15, job-export lifetime 16, backup lifetime four. This includes 11 added library cases. The earlier 31-case library pass overlaps this result. +- TypeScript `tsc --noEmit --incremental false`: exit 0. Scoped ESLint on the two changed files: exit 0. `git diff --check`: passed. +- Tests use real React/MUI dialogs with mocked API responses and controlled boundary signals. Existing session-boundary suite checks the actual boundary implementation separately. Active PDF test uses synthetic bytes and observes filename and URL revocation. + +## Limits and preservation + +No fresh export build/native browser journey, real API/session/cookie-switch integration, physical PDF or accessibility acceptance is claimed. The previous export is stale for this frontend change. No cancellation or rollback of an already accepted server write is promised; stale completions are discarded. Initial library reads remain owned by the existing useViewResource/API path, which is outside this fix. All final A3, security, Phase 10 and release gates remain open. AttachmentStorage destination-ownership race remains source-backed and unproven; it was not changed. + +Evidence is under [cv-library-lifetime](evidence/cv-library-lifetime/SOURCE_RECEIPTS.json). Normalised source hashes and raw receipt hashes bind this bounded result. + +AST graph refresh PASSED on an exact 1,003-file tracked-code snapshot on E: (E:/Storage/Projects/Active/temp docs/jobjakt-local-build/a3-cv-library-source). SOURCE_MANIFEST.json binds files to source commit de2fb452; 10,345 nodes and 36,111 edges. 51 no-symbol warnings retained. Code-only snapshot excludes documentation. Stale generated integration graph: all 2,721 files (97,063,540 bytes) preserved and SHA256-verified on E before replacing its C directory with a junction; no tracked source or evidence removed. diff --git a/docs/ui-modernisation/evidence/cv-library-lifetime/SOURCE_RECEIPTS.json b/docs/ui-modernisation/evidence/cv-library-lifetime/SOURCE_RECEIPTS.json new file mode 100644 index 00000000..8d749679 --- /dev/null +++ b/docs/ui-modernisation/evidence/cv-library-lifetime/SOURCE_RECEIPTS.json @@ -0,0 +1,19 @@ +{ + "sourceCommit": "de2fb452210b128a8b5a3729e5971b8e2ddbba7c", + "sourcesLfSha256": { + "job-tracker-ui/src/views/CvBuilderPage.tsx": "63eb7348efcf4aaf5f3cb7e5d98fe6c5223896ac7ad64caa4111e251135f162e", + "job-tracker-ui/src/cv-builder-page.test.tsx": "5871bfef73499f2c7b2d9424e245436ded8f2e0838c4d5e6c08b49525f9822b7", + "job-tracker-ui/src/sessionBoundary.ts": "09edca77c98294818d2ad0c409ce595f1b6ca0c1f60419fc1078b70f96f5b7b9", + "job-tracker-ui/src/cvBuilder.ts": "c021bafeabbc8ad3526d1b10b90ad8f7f0958ded8ed26eac8c1d28b53098b64d", + "job-tracker-ui/jest.config.cjs": "de323cd3aa8693b11a028b2c026682f05ab988d182ed860861a051d66e53c286" + }, + "evidenceSha256": { + "green.txt": "cdd95bb125faddbc952d3b3588b3329eb8100dda6c6322b04b10ae150393230f", + "lint.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "red.txt": "658bccf93a58b3ea639635ccc33810ef7b87163c45ab91425673d0b50afec9c1", + "results.json": "f9c9dccfd13445d19aa803467ebd3aa3410a2b10054b278b22dfa90709224c8a", + "SOURCE_RECEIPTS.json": "609aade9b200454fc4bf05cc7913615d2faba6718e2a64b74e1533f1311db183", + "types.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "graph.txt": "b2b80b86f868b619d66445bd6d71d750ca091f8d6bee5dc40758fade72f22a67" + } +} diff --git a/docs/ui-modernisation/evidence/cv-library-lifetime/graph.txt b/docs/ui-modernisation/evidence/cv-library-lifetime/graph.txt new file mode 100644 index 00000000..75c5bd08 --- /dev/null +++ b/docs/ui-modernisation/evidence/cv-library-lifetime/graph.txt @@ -0,0 +1,22 @@ +Re-extracting code files in . (no LLM needed)... + AST cache: 0/1004 files served from cache (0%); 1004 to extract + AST extraction: 100/1004 uncached files (9%) [16 workers] + AST extraction: 200/1004 uncached files (19%) [16 workers] + AST extraction: 300/1004 uncached files (29%) [16 workers] + AST extraction: 400/1004 uncached files (39%) [16 workers] + AST extraction: 500/1004 uncached files (49%) [16 workers] + AST extraction: 600/1004 uncached files (59%) [16 workers] + AST extraction: 700/1004 uncached files (69%) [16 workers] + AST extraction: 800/1004 uncached files (79%) [16 workers] + AST extraction: 900/1004 uncached files (89%) [16 workers] + AST extraction: 1000/1004 uncached files (99%) [16 workers] + AST extraction: 1004/1004 uncached files (100%) [16 workers] + warning: 8 .sql file(s) contributed nothing to the graph because a dependency is missing: tree_sitter_sql not installed. Install it with: pip install "graphifyy[sql]" (#1745) + warning: 51 code file(s) yielded no symbols (0.12 MB) — a data file, or source this extractor models no symbols for: JobTrackerApi.Tests/PdfBrowserStub/Program.cs, JobTrackerApi/Program.cs, JobTrackerApi/Properties/AssemblyInfo.cs, browser-extension/tests/capture-url.test.mjs, docs/cv-import/benchmarks/harness/Program.cs (+46 more) +Graph has 10345 nodes (above 5000 limit). Building aggregated community view... +graph.html written (aggregated: 273 community nodes, 2404 cross-community edges) +Tip: run with --obsidian for full node-level detail. +[graphify watch] Rebuilt: 10345 nodes, 36111 edges, 273 communities +[graphify watch] graph.json, graph.html and GRAPH_REPORT.md updated in graphify-out +Code graph updated. For doc/paper/image changes run /graphify --update in your AI assistant. +Tip: set GEMINI_API_KEY or GOOGLE_API_KEY to use Gemini for semantic extraction. diff --git a/docs/ui-modernisation/evidence/cv-library-lifetime/green.txt b/docs/ui-modernisation/evidence/cv-library-lifetime/green.txt new file mode 100644 index 00000000..bac61c8e --- /dev/null +++ b/docs/ui-modernisation/evidence/cv-library-lifetime/green.txt @@ -0,0 +1,7 @@ + +Test Suites: 5 passed, 5 total +Tests: 85 passed, 85 total +Snapshots: 0 total +Time: 25.539 s +Ran all test suites matching src/cv-builder-page.test.tsx|src/cvBuilder.test.ts|src/session-boundary.test.ts|src/backup-lifetime.test.tsx|src/job-export-lifetime.test.tsx. +Test results written to: E:\Storage\Projects\Active\temp docs\jobjakt-local-build\cv-library-results.json diff --git a/docs/ui-modernisation/evidence/cv-library-lifetime/lint.txt b/docs/ui-modernisation/evidence/cv-library-lifetime/lint.txt new file mode 100644 index 00000000..e69de29b diff --git a/docs/ui-modernisation/evidence/cv-library-lifetime/red.txt b/docs/ui-modernisation/evidence/cv-library-lifetime/red.txt new file mode 100644 index 0000000000000000000000000000000000000000..9c180fb54e9d4e36837801d525b8a17a408a87f5 GIT binary patch literal 116076 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