diff --git a/docs/ui-modernisation/CORRESPONDENCE_RECOVERY.md b/docs/ui-modernisation/CORRESPONDENCE_RECOVERY.md new file mode 100644 index 00000000..882e5d3f --- /dev/null +++ b/docs/ui-modernisation/CORRESPONDENCE_RECOVERY.md @@ -0,0 +1,29 @@ +# Correspondence read and manual-note recovery + +Baseline `b9bb3c44`; implementation/test/verifier `c751b427` on `codex/a3-ui-10`. + +## Changes and preservation + +- Superseded message reads cannot replace the current application or its error/loading state. Previous messages clear when the application changes; obsolete callbacks cannot start a previous-job read. The existing job/unmount lifecycle and request counter guard these boundaries. +- Manual note submission locks its captured form and rejects duplicate clicks. Rejected writes retain the draft and permit a deliberate retry. Old-job/unmounted completions cannot clear a newer draft, show an unrelated failure or trigger another read. +- A committed note followed by failed refresh clears the submitted draft and presents the existing read-retry notice. It does not report a failed write or invite another POST. +- Read errors translate at render time without another request or lost draft. Pending note rejection uses the current UI language. Existing Gmail connection/import/linking permissions and the manual note payload remain unchanged. +- Disabled character-count helper text remains readable; the first real-browser pending-state scan measured 4.46:1 before this correction. The input remains disabled. No accessibility rule was suppressed. + +## Verification + +PASSED: 27 frontend cases across correspondence recovery and the existing Gmail import suite: 14 recovery cases plus 13 existing cases. Earlier 18/22/25/26-case runs overlap this final run. Red receipts retain three initial read-boundary failures, three manual-note failures and one unnecessary locale-read failure. An initial TypeScript failure from unsupported test-only `exact` selectors was corrected before the final successful build. + +PASSED: production static build/TypeScript and scoped ESLint. No backend, dependency, schema or migration changed. + +PASSED: eight controlled real-application journeys at 390/1440 widths × EN/NB × light/dark. Forty accessibility captures cover read error, rejected write, pending write, committed-write/read error and recovery. Sixteen intercepted write attempts comprise eight deliberate fixture500 rejections and eight fixture commitments. Each journey checks live language switching without extra reads, retained drafts, keyboard read retry, pending duplicate exclusion and read-only recovery after commitment. Zero page errors/unavailable API reads; external Google Fonts requests were blocked. The single pilot overlaps the final eight configurations. Incomplete-fixture and failed-contrast receipts are retained separately, not counted as passes. + +Desktop light and mobile Bokmål dark captures were visually inspected. Existing nested correspondence surfaces remain a visual follow-up; these states do not establish whole-route parity with A3. + +Evidence: `evidence/correspondence-recovery/`. `CORRESPONDENCE_RECOVERY_SOURCE_MANIFEST.json` binds LF-normalised source/text evidence and raw images/export files. It is content provenance, not a release image or full integrated acceptance. + +## Remaining work and rollback + +Manual pasted-email recording still needs the equivalent pending-write, stale completion and committed-refresh qualification. Gmail candidate/link/refresh mutation races, cross-job unsaved-draft navigation policy and wider mail workflows retain their own open review. Provider-shaped API responses here are synthetic; no real mail is fetched or sent. Human/native-device, assistive-technology, integrated security/recovery, final A3 and release gates remain open. + +Rollback: revert `c751b427`, rebuild and rerun affected correspondence checks. No stored data changes are made by the patch itself. A real in-flight POST may have committed even if the UI is unmounted; no automatic write retry or server idempotency claim is introduced. diff --git a/docs/ui-modernisation/CORRESPONDENCE_RECOVERY_SOURCE_MANIFEST.json b/docs/ui-modernisation/CORRESPONDENCE_RECOVERY_SOURCE_MANIFEST.json new file mode 100644 index 00000000..049383c1 --- /dev/null +++ b/docs/ui-modernisation/CORRESPONDENCE_RECOVERY_SOURCE_MANIFEST.json @@ -0,0 +1,158 @@ +{ + "sourceContentCommit": "c751b4272ecaadc66ef8c8e3306faf00b06853be", + "policy": "LF-normalised source and text evidence; raw PNG/gzip/zip/export. Content binding for offline UI verification; release candidate/image identity remains separate.", + "sources": { + "job-tracker-ui/src/App.tsx": "e0c50ec92954b90cf62b9d8b8e0d5b5802c2408e577e5e255a8d78c3dfdf7135", + "job-tracker-ui/src/ThemeProvider.tsx": "1d25fd091ca632f7671e413db24e917d4ca4a375fddade0ca1ff397a8ae9f950", + "job-tracker-ui/src/DateLocalizationProvider.tsx": "cd46fdfda8c145d7c634e1ed6a714ffeb898a5ef30d705aa019390c9b8456870", + "job-tracker-ui/src/i18n/I18nProvider.tsx": "dfa8d95510a7dd872e1b9bbddf9bb4ab31da4d4b5e932b0099397d11e08ad108", + "job-tracker-ui/src/i18n/translations.ts": "a0b706a859264773418ec3f1275332e97add913de65c4d6efaef04b23ae8e1c5", + "job-tracker-ui/src/components/Correspondence.tsx": "1421f15d4807553f4088680add79e85ead5d1e502b323b5eccf69e07a868b7a3", + "job-tracker-ui/src/components/ViewStateNotice.tsx": "7b6c3e6c311860897eb5327936dbb129e860781929cfd9a4d4e17f81c607c70c", + "job-tracker-ui/src/views/ApplicationWorkspacePage.tsx": "2d31056102c277585bf382a04c8137d3c0502cff068d4bd63f7869bef4b9b7c9", + "job-tracker-ui/src/api.ts": "f75ac7be07a743396843ddad5fd3371e2d5fd3d9c5d933e09e26fae2159f2378", + "job-tracker-ui/src/correspondence-recovery.test.tsx": "74edffc2e7b0e56dd7724ea446ce428bac099566282dae2892098b9a67051d28", + "job-tracker-ui/src/correspondence-gmail-import.test.tsx": "f59abb397a716951399c64dfa6fbaeba3c63aaddd60e45eed7cdd5caf590a1e8", + "job-tracker-ui/scripts/verify-correspondence-recovery.mjs": "005cbdfa53e0eb51d6ec878e39cf92c9351fa37a6110f672f4db84618b35f263", + "job-tracker-ui/package.json": "3745394e406cefa40d30a87e840bccb359be147bac6ffba736e2ae90898a8626", + "job-tracker-ui/package-lock.json": "bf31e90d7af03e8af059db2aaf893925b9e8881a30a1688034ed88ef45d4fcab" + }, + "evidence": { + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-committed-read-error.png": "52a24abfe8ab4335922cbbb77951f95abaadd5ef6ecd179b7baf8218a68494fd", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-read-error.png": "b0c0c0bfa815fb6bf393f9ea26da9a7cb90ea473f3d8e9715908dd5a279a28da", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-recovered.png": "2d69a56b7472c57fedd0f6d90b17e4bfc9145c1e1e5debbf793dcc0770b235cb", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-error.png": "37c94caca9dfee592d7f3c51ae60be5585d6592d0e6f32bbbd132f619f03817f", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-pending.png": "692ddd5744ff1b0f7900345bcdba4471a1a1f8b98cc7f47567a0fdcedd18a65d", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-committed-read-error.png": "374f40e14e3f61282cea9406de8a082386a25db148d7f38048ae78808d28642d", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-read-error.png": "c9dc2eba30e96e97be63164ed9175c958dba47c3328090711c3fd29a83ebfff8", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-recovered.png": "6f492e41eb195628e17d8e0e823acfb30f7820b43557137cbd2771fd59a43fd6", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-error.png": "b1733d9f2483a4ce7333e8d72876288b54ca1bd47da03972ac66e02082f7e600", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-pending.png": "993b11a9b5bf2740e7961c74a25f6e6f426f287efcdf75e0f5d6872a7d2acc90", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-committed-read-error.png": "1d1fa100fa9496a5285f1b1e40155c87b94df27a745469e65d47c06002c8fba5", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-read-error.png": "d9f3c40532f9678be57d414c012b0c61666ef18861b2008f87fd9d7f6801cf2f", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-recovered.png": "571ec92467b4f186aadd3f458e4d509a5f8b5738eebde75aa1fd702f8bcc6b43", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-error.png": "a0dedb967597c0213a89250d101cb580a8c5e22bcf2da88b240de0398868f4fd", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-pending.png": "712d5c2c011f1e34b8c9213b80527f937cf723ecba6b5f64c29a4085f22c8f39", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-committed-read-error.png": "e87b60d74608e16886b069052444f5256898e07516eb9ff67550dae3d740684f", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-read-error.png": "54130b6492f91a44c9202ba559e1ea35463508423a4ba41c762127f3fe833cad", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-recovered.png": "9917bd31d08d295f980cd2a3e3798a80d1e9dfd00836aa442999cbdfeb18c7f6", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-error.png": "aa9ea953aadcab3293885a7bbdddf2d7b5797d01c8e8658eb7c6d51e1899764d", + "docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-pending.png": "72bef0a68b5a58721421312de189760390b7f08ffe72f4b57a60418388bee225", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-committed-read-error.png": "71f98b92819f2da6c3623fca07fdd7e62deb39889828752ab9053667cd65c8ca", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-read-error.png": "db89385e241a7be313d5cd8be9fd7d72caba9fff75e85fca7d4af0f8b028ef71", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-recovered.png": "20f2a1bcb968532478d65be519906c87fe11d1d332fc9d84b8e2abfee7676355", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-error.png": "b9f0980b4ce8bec2a5c2e844fc2db4825a8cafd3710db243cc465970baf8c4f6", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-pending.png": "76622f6bb0209c0a8b4d578179c520dc9ec9c4d414d2725e69ff10afd0309b05", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-committed-read-error.png": "045be4dffacd0646d829306c50898e986a64f00b2b6c5c3af5e20de98367983d", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-read-error.png": "652a024aeb9d7c8ef3613cf707355d31548e75227d4bee154ac1f62940050aff", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-recovered.png": "8db80ba964bd505dc1a4257c16db36b2be8e5fa7a1e705f8bdf33e42e5364c54", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-error.png": "f8615167ccb1818697a05b058caf7a22fac4dae620a7f5eb0c7f0c3b769dc928", + "docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-pending.png": "67b54f4ae84e4ea0f75dfa7308a0fc916151c8f28efe88211fcf38149b3987ba", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-committed-read-error.png": "799a27d3fe790c8dfadd69a1db19f4ea5c3787066250f116c54fa30e019c6b84", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-read-error.png": "60152bda8486dc18556dcd6c4e94134c542de53ec596e562449f4e97a641d552", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-recovered.png": "a08443bcdc65f3f5a056de7f2c528ac631b64622ba43acb5c29086aadb2393ba", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-error.png": "b25e95cb6c96acdfff9597652d121662e933945b8695ff7d627775ce307a207f", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-pending.png": "09a9362c85ec4c84f04f37d9f12f1a61ba6b5b4e6a73b019a89fdc4036138155", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-committed-read-error.png": "d7248cd297e0c6646b2cc6c3ba1ce68d19e78c65b8cb936db2f8a982955927a3", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-read-error.png": "1400fc9102c268a7727573c136e961452d68c50964ea8a11b3cc1d408f55e646", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-recovered.png": "2586fc39be8a1d6cc702765f8049e115d0a92e802921770449a6b19ff5df4835", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-error.png": "ce5dc9ee6819f4e140f75b4cdbfb9a009136408122b2214fbdae9dcccaad5ab9", + "docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-pending.png": "28c3f85deba32cd909b738b387039773fef92d873b64d80aaff40e71be4face0", + "docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.json": "df98ca22872dd532067424724a0dad8fa6f7c7d3a78287261fe008e1286dd3cd", + "docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.txt": "17e88f360f262e0382ebb7cd8edc02a68bddb0b525b219f4dc26dacb6928244d", + "docs/ui-modernisation/evidence/correspondence-recovery/BUILD.txt": "49f28f616feca3e25089dd5330e506badda0714f42e5ee609a0fb17ed45149f2", + "docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.json": "9b8ea7d84e207fbccdb8bcf3c544925e7cacf9881ac89f61e151d6f4aa1048d7", + "docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.txt": "dc1df8ea826a4aecee0492773e42b6707c1889cb7b887185808d51b5539304da", + "docs/ui-modernisation/evidence/correspondence-recovery/LINT.txt": "4fdab9a86694d3bd23b27ed16d9678ff6301455473d7f15c97c04b7d3ecece97", + "docs/ui-modernisation/evidence/correspondence-recovery/PILOT.json": "72a23e7c4670a8616f86a6b446331737b24d2620c3b9dafbf7e9b7bd2c55ea24", + "docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.json": "324b7ff105c934e23606556f0cfd01f581eb2081fe7425e941549cd7f4158f71", + "docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.txt": "2f1d309d491f8bb96719a3cc7d4158f5050899a7fa6c5b08bf95bda4c41dc63f", + "docs/ui-modernisation/evidence/correspondence-recovery/RED_LOCALE.txt": "59e1a4a4c7a6b0776d5cafdcf9490ba05d6921cd7e7ac1e0086d5245ebcfc14c", + "docs/ui-modernisation/evidence/correspondence-recovery/RED_NOTE.txt": "dab2694df1858d6bfca7924434577dbcb7e28f9b9d6b98425dd3ec8e1bb44436", + "docs/ui-modernisation/evidence/correspondence-recovery/RED_READS.txt": "80f85083fabec4c4cc0729ce42ea618c993fea6976cd3eded487069bda371403", + "docs/ui-modernisation/evidence/correspondence-recovery/TESTS.txt": "38f26d7b378200e17979ec1829f8cf7741b38b8dd974fb81eb59dcbe5196bbc4", + "docs/ui-modernisation/CORRESPONDENCE_RECOVERY.md": "5eccd188bfb0c0bb18dd4e18eba98dae332249a01f648b22bba0294acd32c18d" + }, + "export": { + "job-tracker-ui/out/404.html": "04f1f9c9e050a356020515230edb029bf95180f70bb4d556eba38f65339547c6", + "job-tracker-ui/out/__next.__PAGE__.txt": "51f97f33f5a8dbf16a3dcb5c6f01f547fcfa4345fb72345bf7a8ce11d2c6f11a", + "job-tracker-ui/out/__next._full.txt": "60995404429cd72e8d2c9ca8221a0e2e97f1ef98e34ff10c0df46d9b8067c8d6", + "job-tracker-ui/out/__next._tree.txt": "cb486519ee155c2e2d541247fe755bb04fb73e638b4c3052e05b413b5e4bfa97", + "job-tracker-ui/out/_next/static/chunks/0--vhwu1kmht5.js": "426fae50ff0485fb6af8e28a7d1751dfaefcb6118a24dab39b3a7099d38c18dd", + "job-tracker-ui/out/_next/static/chunks/0-_aq6ipzcshj.js": "39f90c215bf52aef6274ed3dcc0f8af32e21a37fe8845b3bca0d6ea60da6a8c2", + "job-tracker-ui/out/_next/static/chunks/00sdty8f_wo6_.js": "047077072852a0211c228c75d5e29836ba970771382ba0da4bac9fdd0bfac29f", + "job-tracker-ui/out/_next/static/chunks/05rgc5zsm9p5i.js": "1da7305ab9d8e95795327cce11a16db4c56d90429d7e1dea4c4088c085f20d69", + "job-tracker-ui/out/_next/static/chunks/0afg9bl7a8pj5.js": "bd0cec651950d5007f84273af5be8d8255806da4db54238f5c512442c7449459", + "job-tracker-ui/out/_next/static/chunks/0ah1fzqmie05a.js": "5c65505a7dcbac63ac71d254e619a4c800943bfb4fa16cd40c10cdbe7e9b6e31", + "job-tracker-ui/out/_next/static/chunks/0b3nrgli_w65x.js": "bf23e1a05a97de3a950e76eb206b2fbbe9003460891ecd5ab091155aa385badc", + "job-tracker-ui/out/_next/static/chunks/0bdt7ln111t48.js": "6184b1a61f22e2a640c17941634fdc75678ce93d142848d9f07f163e0d1fd201", + "job-tracker-ui/out/_next/static/chunks/0cz1d0mv5g_q7.js": "0973c1d64c88adc8e3c950410cb58b288f72118d5965b78049438deb8f2f9683", + "job-tracker-ui/out/_next/static/chunks/0og1crk78cn4a.js": "aa5031605cb2f46a612e94d9d71473f48a71aa4a5acfe8fe5f2dfc66d951ab40", + "job-tracker-ui/out/_next/static/chunks/0pvbhqkwp15b6.js": "f210cc1a8c203de6008b6137c0324afabb33f233c1ab56800fe9e6c963c0c34a", + "job-tracker-ui/out/_next/static/chunks/0q20g9o8x-k8z.js": "3d4d9086985419aa8866b032158196c774acb8bf318f3c8245508c8daa9c5148", + "job-tracker-ui/out/_next/static/chunks/0q_pwu9jxv4-d.js": "42a43b3d7245a413c7c29b4cbe87823037a6dbc637e2e282c92405470e0f575d", + "job-tracker-ui/out/_next/static/chunks/0qxm1h9uqfgpa.js": "a5af3192c76f3b8dac5c17afbe90d96a5c7652810ce69b7f39fbcf1f1231fd8c", + "job-tracker-ui/out/_next/static/chunks/0ta69108309yl.js": "07b8069d13ddaf7aaa24daf1070144a2e98b444ca162b628b8bfb8e1068d2967", + "job-tracker-ui/out/_next/static/chunks/0tfel3w7fxsh1.js": "3855f980ca8a126b94efa47d3afd369e56a34cdddb13e5542d27704945f85909", + "job-tracker-ui/out/_next/static/chunks/0vo4_3wcjs1gy.js": "5e4d305fc346f9ecf48328ab0416397d8bd7c100f0de99dea16d2a1463b386a9", + "job-tracker-ui/out/_next/static/chunks/0zep-wknuuxm3.js": "cc13d0dc908a4b047a165a50a226b787ee7707135b3f2c5894aab8cbd618a29c", + "job-tracker-ui/out/_next/static/chunks/1-8ykqf0n88k2.js": "eb208124ec838cb9a9ae366745bd81fba1c35eeceac128c567bbb7977ebb6a2e", + "job-tracker-ui/out/_next/static/chunks/10qxrc5f9nore.js": "512bfc44077703fa4e03e15ca48acf3501231c5e2cb9bf7beb2ec30224fe287b", + "job-tracker-ui/out/_next/static/chunks/1435in_k_-dhc.js": "4757476512d5c4dd25f9264a18b304ed4824b23aff1c09e134fcbff21d9c36b6", + "job-tracker-ui/out/_next/static/chunks/145oicobmjvm7.js": "d6bbbdeed1381652dc7412e5ce673a077579ecd5cee8934cb6b533c814098764", + "job-tracker-ui/out/_next/static/chunks/14e7ovj0s3elm.js": "070567dd4d23fb9fa0b9ba132185a697af6578045d43b2b1c7bbb2a1594d935d", + "job-tracker-ui/out/_next/static/chunks/15saa2mllmdp7.js": "6664972f61e1669d2ca1ed9af467df87d316efeadf59496ce8c68d8c84fd7512", + "job-tracker-ui/out/_next/static/chunks/16lfece6cnlln.js": "716363ba044f30b0e70440756b4e5eafa2d25f2e1628e855e3bc4ab9eabee3d3", + "job-tracker-ui/out/_next/static/chunks/188aj_hr_p4eq.js": "f10e4af24bebfb8b9e7306a5688ef45f07f280c920dc01815ac578fbe18e2182", + "job-tracker-ui/out/_next/static/chunks/1avt7t-z_q80r.js": "8cbd919d971eaf46e508f9e6b073a9183a29457c3c42c9566ec74b018894c061", + "job-tracker-ui/out/_next/static/chunks/1ke8pzecwofrg.css": "32e9ab963ebadebcbe2c68dffb24cfbfc8cc24255ad91b48b7941fc777bf7439", + "job-tracker-ui/out/_next/static/chunks/1req80b9jj38r.js": "eee4d2e3789e1215195dba99ad0f09d34f8c83da848322b76054722233e9dae3", + "job-tracker-ui/out/_next/static/chunks/1svx1qnrof8xa.js": "111c502a1ca939f7bf971ed1b3e3cda011b130c313a7f7df742ae4b1e14486ae", + "job-tracker-ui/out/_next/static/chunks/1w3q8yrcjn2jk.js": "365200e241ee9290e93d7c2fdba169f2b0a8e774541e3cbf3f6f2781110fa644", + "job-tracker-ui/out/_next/static/chunks/1xn023_28rgzj.js": "4f7f2108d030a48d039930736c92a55710975dddf419fe673f84d92899b1f575", + "job-tracker-ui/out/_next/static/chunks/1xwc-b795syag.css": "f73c002233f931ca14d0ae58815c47ca9f2659f25b1547a6d1fdca12a2a00b3f", + "job-tracker-ui/out/_next/static/chunks/22wx8--1b9tnq.js": "3f7d8e762371262c6a740b4dac21725b424847319afac46055e97074a99ff5f5", + "job-tracker-ui/out/_next/static/chunks/274f8aifi_wup.js": "bc5bc5617b4acbbbb1c7966322c508bb5554024d78e71e523e27f7f5bba5a8ab", + "job-tracker-ui/out/_next/static/chunks/29jdblthf0w7a.js": "e84b4f7c225d58099aa89999544f7318cb23c0c71f2385c31b3c9181a62ab7f0", + "job-tracker-ui/out/_next/static/chunks/2edynwqicn6ym.js": "c694af15bb117955e6f7f0962f47495b2be017dfdea93b6d4ede4d5e4fcd7efd", + "job-tracker-ui/out/_next/static/chunks/2ha8nlh4rv92e.js": "5cb4b4cee708f35ed54ef6289269fa866afbaa64fd47bf9275ff691664d3132e", + "job-tracker-ui/out/_next/static/chunks/2php_9zkhprrb.js": "4f91e63b1181693e7a3b269b1b24004d9abee13413b8396a916799b8c01620e8", + "job-tracker-ui/out/_next/static/chunks/2pllop_q35dkw.js": "21c9a7c53763010317a2d09460066017e1fd192691e6a0bd83ed20ea6e1fe9dd", + "job-tracker-ui/out/_next/static/chunks/2s2gjr6ro25dj.js": "7489e2ac285a05b563c2bcb4eaf9274bf930f2a7385f17d6d5e6850064b88b10", + "job-tracker-ui/out/_next/static/chunks/2sj7ufu_6n9af.js": "69d7471c01b8001d52abc848910a8c35457dac3aaa4ce66eae2a03ca29ad623b", + "job-tracker-ui/out/_next/static/chunks/30-q9iimktiql.js": "db89d5da1f101216d7f99e9518dc7f5ed84f8b40ac84a6ea55f73c01bf1aca1b", + "job-tracker-ui/out/_next/static/chunks/315n7snxk3fgw.js": "1993429aafa0753d5e9fd1ca63a4f6079ce7f7f37faa44716191f59c972c4d41", + "job-tracker-ui/out/_next/static/chunks/33at73n-mzpir.js": "1605cc3311cc6ca3b2f44b2e0217fe5441a2799fa32b0b0c94d7634f4861ac83", + "job-tracker-ui/out/_next/static/chunks/357yqeklh7414.js": "0192ab7198ebbe299d34a934c504dd4b562d1cccebb6e9d4c5163930c881b14c", + "job-tracker-ui/out/_next/static/chunks/35pq4ixaltkev.js": "f1e9d53e2481de01d7b04aa938397c2545b7d7dc42ce3d0ac5cd3f1141bda182", + "job-tracker-ui/out/_next/static/chunks/38su3jk5728xn.js": "739aa11cfaf9c252af387a31db658f707099b59e27b79b54c316b36da645e0e7", + "job-tracker-ui/out/_next/static/chunks/3_4dnl1l3809g.js": "50288c2864a9e8c7ef25c93762edb86e4e617778737b5b5a028c53c5b93d3b70", + "job-tracker-ui/out/_next/static/chunks/3_50_lnzqdlp4.js": "31de490feabaef5ce9c57b0c6ad94e3bb3f3df03348cd402962f6bc3e1fa8964", + "job-tracker-ui/out/_next/static/chunks/3bqn9b34na0b9.js": "f1b8ebcc1b22251c33c9f3a5d11c1f893cad2da2e8744a441e790f7347aa9e73", + "job-tracker-ui/out/_next/static/chunks/3gkylew_qn7cw.js": "7e6c74c81be0c41ab433e36d65b914f62c48f332922e27f7cc953476f4dd78cb", + "job-tracker-ui/out/_next/static/chunks/3la4obitihzpv.js": "9a5a57b46db389b98f1fd5baa86eba1a360300dae9d1ff3ffeae7bc3378135b9", + "job-tracker-ui/out/_next/static/chunks/3nzgmz1t8r_64.js": "de2688cd6bfc8b411e9445d857cd1d776f9960f9d63e9f06c24cbc2a98040fca", + "job-tracker-ui/out/_next/static/chunks/3q4v10rrqy40n.js": "d87ff7b7a0f07d0d92eab3876481eb686a12d9c43d8b92cbe406aefa227a11c1", + "job-tracker-ui/out/_next/static/chunks/3xbcgmkebja05.js": "bb1e98db2657a4b067676ead2ea26172478a79c1b384a9f9fe6588e1481d33ee", + "job-tracker-ui/out/_next/static/chunks/turbopack-25fzg9ay_1ss-.js": "c40f39e993a30c96d6247bb3a7b581538bb046efe8ef8ec07bea3ba32291750f", + "job-tracker-ui/out/_next/static/hiDMI7mhgNrQe04qeFv2j/_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea", + "job-tracker-ui/out/_next/static/hiDMI7mhgNrQe04qeFv2j/_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a", + "job-tracker-ui/out/_next/static/hiDMI7mhgNrQe04qeFv2j/_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00", + "job-tracker-ui/out/_not-found/__next._full.txt": "e31a15438afbb38c5cc95cf47f06634342e329211fd58efd92dc3f365757ed18", + "job-tracker-ui/out/_not-found/__next._not-found/__PAGE__.txt": "aa58fca9e59519154c78d2323da5b377fc81afc6fe37e0f2bf8c8f2fff9e77bf", + "job-tracker-ui/out/_not-found/__next._tree.txt": "b47beea9be8f022b2cfe5879dc1765b3c80ac3ef52f9d338886f30f3ad5e1b68", + "job-tracker-ui/out/_not-found.html": "04f1f9c9e050a356020515230edb029bf95180f70bb4d556eba38f65339547c6", + "job-tracker-ui/out/_not-found.txt": "e31a15438afbb38c5cc95cf47f06634342e329211fd58efd92dc3f365757ed18", + "job-tracker-ui/out/favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a", + "job-tracker-ui/out/favicon.svg": "63ecf8f37f8bb146ecfae3917187c6b692d4e801641e8a314486a4007912f3a3", + "job-tracker-ui/out/index.html": "f182d10f02356bc977f0a07d7e97d1c258da49022127ab41306fa0264e9acf8b", + "job-tracker-ui/out/index.txt": "60995404429cd72e8d2c9ca8221a0e2e97f1ef98e34ff10c0df46d9b8067c8d6", + "job-tracker-ui/out/logo192.png": "bc652031597fabd19b9f14e22a71f809490d218037521b3b64d013418c1390b4", + "job-tracker-ui/out/logo512.png": "5129e9bc1ba812b711fd9a646d3a38a906d365a26ee685df183b8752458944d4", + "job-tracker-ui/out/manifest.json": "2667ce63c2e0835b7007239816a5597639321d333da396a78638dfa9e8a7c935", + "job-tracker-ui/out/mockups/dashboard.svg": "318be3adb1324c26eb30f05572a29528a3e38331c6a604652eef75b54f8c29dc", + "job-tracker-ui/out/mockups/pipeline.svg": "db2ef41faabeb90e7ce85413e168581686c54535d970fc7d8deda3888a479de4", + "job-tracker-ui/out/mockups/workspace.svg": "9bbab22349147c7b01d6e18c93c622a6f8aed6dedaf23715189ab54d60e1ddbd", + "job-tracker-ui/out/robots.txt": "e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c" + } +} diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-committed-read-error.png new file mode 100644 index 00000000..c92cd8e1 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-read-error.png new file mode 100644 index 00000000..3ee7cdfe Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-recovered.png new file mode 100644 index 00000000..fe18f813 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-error.png new file mode 100644 index 00000000..00d1ebb1 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-pending.png new file mode 100644 index 00000000..6d0d6018 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-committed-read-error.png new file mode 100644 index 00000000..925e5f86 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-read-error.png new file mode 100644 index 00000000..4afce3e3 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-recovered.png new file mode 100644 index 00000000..5238c7e9 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-error.png new file mode 100644 index 00000000..2bcdace6 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-pending.png new file mode 100644 index 00000000..503b7666 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-en-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-committed-read-error.png new file mode 100644 index 00000000..b84b0971 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-read-error.png new file mode 100644 index 00000000..3929c78b Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-recovered.png new file mode 100644 index 00000000..4a663f50 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-error.png new file mode 100644 index 00000000..d7e2531b Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-pending.png new file mode 100644 index 00000000..692aedf6 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-committed-read-error.png new file mode 100644 index 00000000..0af9cf91 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-read-error.png new file mode 100644 index 00000000..f3acbb31 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-recovered.png new file mode 100644 index 00000000..0fa26e3b Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-error.png new file mode 100644 index 00000000..529fea03 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-pending.png new file mode 100644 index 00000000..28ed0484 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/1440-nb-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-committed-read-error.png new file mode 100644 index 00000000..609f1cfa Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-read-error.png new file mode 100644 index 00000000..9f29d8b2 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-recovered.png new file mode 100644 index 00000000..db03dbe7 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-error.png new file mode 100644 index 00000000..14a66ca7 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-pending.png new file mode 100644 index 00000000..08153af2 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-committed-read-error.png new file mode 100644 index 00000000..4ffd029d Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-read-error.png new file mode 100644 index 00000000..f5b04a18 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-recovered.png new file mode 100644 index 00000000..1202bd70 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-error.png new file mode 100644 index 00000000..007eb0fd Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-pending.png new file mode 100644 index 00000000..b19a30bb Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-en-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-committed-read-error.png new file mode 100644 index 00000000..d72f010a Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-read-error.png new file mode 100644 index 00000000..28d841d8 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-recovered.png new file mode 100644 index 00000000..1d28693c Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-error.png new file mode 100644 index 00000000..a7d02a97 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-pending.png new file mode 100644 index 00000000..a2744227 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-committed-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-committed-read-error.png new file mode 100644 index 00000000..07ae7ca8 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-read-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-read-error.png new file mode 100644 index 00000000..bbef3030 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-recovered.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-recovered.png new file mode 100644 index 00000000..09a5f958 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-error.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-error.png new file mode 100644 index 00000000..4b3c0be9 Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-pending.png b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-pending.png new file mode 100644 index 00000000..17e4583a Binary files /dev/null and b/docs/ui-modernisation/evidence/correspondence-recovery/390-nb-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.json b/docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.json new file mode 100644 index 00000000..1da8d938 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.json @@ -0,0 +1,452 @@ +{ + "journeys": [ + { + "name": "390-en-light", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + }, + { + "name": "390-en-dark", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + }, + { + "name": "390-nb-light", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + }, + { + "name": "390-nb-dark", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + }, + { + "name": "1440-en-light", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + }, + { + "name": "1440-en-dark", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + }, + { + "name": "1440-nb-light", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + }, + { + "name": "1440-nb-dark", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + } + ], + "captures": [ + { + "name": "390-en-light", + "state": "read-error", + "violations": [] + }, + { + "name": "390-en-light", + "state": "write-error", + "violations": [] + }, + { + "name": "390-en-light", + "state": "write-pending", + "violations": [] + }, + { + "name": "390-en-light", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "390-en-light", + "state": "recovered", + "violations": [] + }, + { + "name": "390-en-dark", + "state": "read-error", + "violations": [] + }, + { + "name": "390-en-dark", + "state": "write-error", + "violations": [] + }, + { + "name": "390-en-dark", + "state": "write-pending", + "violations": [] + }, + { + "name": "390-en-dark", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "390-en-dark", + "state": "recovered", + "violations": [] + }, + { + "name": "390-nb-light", + "state": "read-error", + "violations": [] + }, + { + "name": "390-nb-light", + "state": "write-error", + "violations": [] + }, + { + "name": "390-nb-light", + "state": "write-pending", + "violations": [] + }, + { + "name": "390-nb-light", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "390-nb-light", + "state": "recovered", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "read-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-pending", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "recovered", + "violations": [] + }, + { + "name": "1440-en-light", + "state": "read-error", + "violations": [] + }, + { + "name": "1440-en-light", + "state": "write-error", + "violations": [] + }, + { + "name": "1440-en-light", + "state": "write-pending", + "violations": [] + }, + { + "name": "1440-en-light", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "1440-en-light", + "state": "recovered", + "violations": [] + }, + { + "name": "1440-en-dark", + "state": "read-error", + "violations": [] + }, + { + "name": "1440-en-dark", + "state": "write-error", + "violations": [] + }, + { + "name": "1440-en-dark", + "state": "write-pending", + "violations": [] + }, + { + "name": "1440-en-dark", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "1440-en-dark", + "state": "recovered", + "violations": [] + }, + { + "name": "1440-nb-light", + "state": "read-error", + "violations": [] + }, + { + "name": "1440-nb-light", + "state": "write-error", + "violations": [] + }, + { + "name": "1440-nb-light", + "state": "write-pending", + "violations": [] + }, + { + "name": "1440-nb-light", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "1440-nb-light", + "state": "recovered", + "violations": [] + }, + { + "name": "1440-nb-dark", + "state": "read-error", + "violations": [] + }, + { + "name": "1440-nb-dark", + "state": "write-error", + "violations": [] + }, + { + "name": "1440-nb-dark", + "state": "write-pending", + "violations": [] + }, + { + "name": "1440-nb-dark", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "1440-nb-dark", + "state": "recovered", + "violations": [] + } + ], + "writes": [ + { + "name": "390-en-light", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "390-en-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + }, + { + "name": "390-en-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "390-en-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + }, + { + "name": "390-nb-light", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "390-nb-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + }, + { + "name": "390-nb-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "390-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-en-light", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "1440-en-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-en-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "1440-en-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-nb-light", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "1440-nb-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-nb-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "1440-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + } + ], + "errors": [], + "unavailableReads": [], + "blockedExternal": [ + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com", + "https://fonts.googleapis.com" + ] +} \ No newline at end of file diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.txt b/docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.txt new file mode 100644 index 00000000..1acc173b --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/BROWSER.txt @@ -0,0 +1,9 @@ +Checking 390-en-light +Checking 390-en-dark +Checking 390-nb-light +Checking 390-nb-dark +Checking 1440-en-light +Checking 1440-en-dark +Checking 1440-nb-light +Checking 1440-nb-dark +PASS 8 recovery journeys, 40 accessibility captures, 16 intercepted write attempts diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/BUILD.txt b/docs/ui-modernisation/evidence/correspondence-recovery/BUILD.txt new file mode 100644 index 00000000..d2c62d96 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/BUILD.txt @@ -0,0 +1,23 @@ + +> job-tracker-ui@0.1.0 build +> node --max-old-space-size=4096 ./node_modules/next/dist/bin/next build + +▲ Next.js 16.4.1 (Turbopack) +✓ Running next.config.js took 26ms + + Creating an optimized production build ... +✓ Compiled successfully in 540ms + Running TypeScript ... + Finished TypeScript in 5.6s ... + Collecting page data using 4 workers ... + Generating static pages using 4 workers (0/3) ... +✓ Generating static pages using 4 workers (3/3) in 814ms + Finalizing page optimization ... + +Route (app) +┌ ○ / +└ ○ /_not-found + + +○ (Static) prerendered as static content + diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.json b/docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.json new file mode 100644 index 00000000..907f6fa3 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.json @@ -0,0 +1,70 @@ +{ + "journeys": [ + { + "name": "390-nb-dark", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + } + ], + "captures": [ + { + "name": "390-nb-dark", + "state": "read-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-pending", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "recovered", + "violations": [] + } + ], + "writes": [ + { + "name": "390-nb-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "390-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + } + ], + "errors": [], + "unavailableReads": [ + "/api/jobapplications/reminders", + "/api/companies" + ], + "blockedExternal": [ + "https://fonts.googleapis.com" + ] +} \ No newline at end of file diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.txt b/docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.txt new file mode 100644 index 00000000..5a1fa405 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/INCOMPLETE_FIXTURE.txt @@ -0,0 +1,24 @@ +Checking 390-nb-dark +node:internal/modules/run_main:107 + triggerUncaughtException( + ^ + +AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal: ++ actual - expected + ++ [ ++ '/api/jobapplications/reminders', ++ '/api/companies' ++ ] +- [] + + at file:///C:/Users/Connor/.codex/worktrees/direct-roadmap-integration/Job%20tracker/job-tracker-ui/scripts/verify-correspondence-recovery.mjs:92:47 { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: [ '/api/jobapplications/reminders', '/api/companies' ], + expected: [], + operator: 'deepStrictEqual', + diff: 'simple' +} + +Node.js v24.19.0 diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/LINT.txt b/docs/ui-modernisation/evidence/correspondence-recovery/LINT.txt new file mode 100644 index 00000000..92403dd8 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/LINT.txt @@ -0,0 +1,6 @@ + +C:\Users\Connor\.codex\worktrees\direct-roadmap-integration\Job tracker\job-tracker-ui\src\components\Correspondence.tsx + 281:37 warning The ref value 'messageRequest.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'messageRequest.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + +✖ 1 problem (0 errors, 1 warning) + diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/PILOT.json b/docs/ui-modernisation/evidence/correspondence-recovery/PILOT.json new file mode 100644 index 00000000..98b274a4 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/PILOT.json @@ -0,0 +1,67 @@ +{ + "journeys": [ + { + "name": "390-nb-dark", + "readRetryPreservesDraft": true, + "rejectedWritePreservesDraft": true, + "pendingWriteExcludesDuplicate": true, + "committedReadFailureRetriesGetOnly": true, + "reads": 4, + "posts": 2 + } + ], + "captures": [ + { + "name": "390-nb-dark", + "state": "read-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-pending", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "committed-read-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "recovered", + "violations": [] + } + ], + "writes": [ + { + "name": "390-nb-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "390-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + } + ], + "errors": [], + "unavailableReads": [], + "blockedExternal": [ + "https://fonts.googleapis.com" + ] +} \ No newline at end of file diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.json b/docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.json new file mode 100644 index 00000000..f32930ce --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.json @@ -0,0 +1,106 @@ +{ + "journeys": [], + "captures": [ + { + "name": "390-nb-dark", + "state": "read-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-error", + "violations": [] + }, + { + "name": "390-nb-dark", + "state": "write-pending", + "violations": [ + { + "id": "color-contrast", + "impact": "serious", + "tags": [ + "cat.color", + "wcag2aa", + "wcag143", + "TTv5", + "TT13.c", + "EN-301-549", + "EN-9.1.4.3", + "ACT", + "RGAAv4", + "RGAA-3.2.1" + ], + "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds", + "help": "Elements must meet minimum color contrast ratio thresholds", + "helpUrl": "https://dequeuniversity.com/rules/axe/4.13/color-contrast?application=playwright", + "nodes": [ + { + "any": [ + { + "id": "color-contrast", + "data": { + "fgColor": "#8b8a95", + "bgColor": "#282334", + "contrastRatio": 4.46, + "fontSize": "9.0pt (12px)", + "fontWeight": "normal", + "messageKey": null, + "expectedContrastRatio": "4.5:1" + }, + "relatedNodes": [ + { + "html": "
", + "target": [ + "#app-main-content" + ] + } + ], + "impact": "serious", + "message": "Element has insufficient color contrast of 4.46 (foreground color: #8b8a95, background color: #282334, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1" + } + ], + "all": [], + "none": [], + "impact": "serious", + "html": "

25 tegn

", + "target": [ + "#_r_18_-helper-text" + ], + "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.46 (foreground color: #8b8a95, background color: #282334, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1" + } + ] + } + ] + } + ], + "writes": [ + { + "name": "390-nb-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixture500" + }, + { + "name": "390-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "content": "Retain the synthetic note" + }, + "result": "fixtureCommitted" + } + ], + "errors": [], + "unavailableReads": [ + "/api/jobapplications/reminders", + "/api/companies" + ], + "blockedExternal": [ + "https://fonts.googleapis.com" + ] +} \ No newline at end of file diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.txt b/docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.txt new file mode 100644 index 00000000..254e6bd6 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/RED_BROWSER.txt @@ -0,0 +1,106 @@ +Checking 390-nb-dark +node:internal/modules/run_main:107 + triggerUncaughtException( + ^ + +AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal: ++ actual - expected + ++ [ ++ { ++ description: 'Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds', ++ help: 'Elements must meet minimum color contrast ratio thresholds', ++ helpUrl: 'https://dequeuniversity.com/rules/axe/4.13/color-contrast?application=playwright', ++ id: 'color-contrast', ++ impact: 'serious', ++ nodes: [ ++ { ++ all: [], ++ any: [ ++ { ++ data: { ++ bgColor: '#282334', ++ contrastRatio: 4.46, ++ expectedContrastRatio: '4.5:1', ++ fgColor: '#8b8a95', ++ fontSize: '9.0pt (12px)', ++ fontWeight: 'normal', ++ messageKey: null ++ }, ++ id: 'color-contrast', ++ impact: 'serious', ++ message: 'Element has insufficient color contrast of 4.46 (foreground color: #8b8a95, background color: #282334, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1', ++ relatedNodes: [ ++ { ++ html: '
', ++ target: [ ++ '#app-main-content' ++ ] ++ } ++ ] ++ } ++ ], ++ failureSummary: 'Fix any of the following:\n' + ++ ' Element has insufficient color contrast of 4.46 (foreground color: #8b8a95, background color: #282334, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1', ++ html: '

25 tegn

', ++ impact: 'serious', ++ none: [], ++ target: [ ++ '#_r_18_-helper-text' ++ ] ++ } ++ ], ++ tags: [ ++ 'cat.color', ++ 'wcag2aa', ++ 'wcag143', ++ 'TTv5', ++ 'TT13.c', ++ 'EN-301-549', ++ 'EN-9.1.4.3', ++ 'ACT', ++ 'RGAAv4', ++ 'RGAA-3.2.1' ++ ] ++ } ++ ] +- [] + + at capture (file:///C:/Users/Connor/.codex/worktrees/direct-roadmap-integration/Job%20tracker/job-tracker-ui/scripts/verify-correspondence-recovery.mjs:60:14) + at async file:///C:/Users/Connor/.codex/worktrees/direct-roadmap-integration/Job%20tracker/job-tracker-ui/scripts/verify-correspondence-recovery.mjs:80:29 { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: [ + { + id: 'color-contrast', + impact: 'serious', + tags: [ + 'cat.color', 'wcag2aa', + 'wcag143', 'TTv5', + 'TT13.c', 'EN-301-549', + 'EN-9.1.4.3', 'ACT', + 'RGAAv4', 'RGAA-3.2.1' + ], + description: 'Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds', + help: 'Elements must meet minimum color contrast ratio thresholds', + helpUrl: 'https://dequeuniversity.com/rules/axe/4.13/color-contrast?application=playwright', + nodes: [ + { + any: [ [Object] ], + all: [], + none: [], + impact: 'serious', + html: '

25 tegn

', + target: [ '#_r_18_-helper-text' ], + failureSummary: 'Fix any of the following:\n' + + ' Element has insufficient color contrast of 4.46 (foreground color: #8b8a95, background color: #282334, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1' + } + ] + } + ], + expected: [], + operator: 'deepStrictEqual', + diff: 'simple' +} + +Node.js v24.19.0 diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/RED_LOCALE.txt b/docs/ui-modernisation/evidence/correspondence-recovery/RED_LOCALE.txt new file mode 100644 index 00000000..c8dc16fa --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/RED_LOCALE.txt @@ -0,0 +1,37 @@ + +> job-tracker-ui@0.1.0 test +> jest --runInBand correspondence-recovery.test.tsx + +FAIL src/correspondence-recovery.test.tsx + ● a displayed read error follows UI language without another request or lost draft + + expect(received).toEqual(expected) // deep equality + + - Expected - 0 + + Received + 3 + + @@ -3,6 +3,9 @@ + "/correspondence/42", + ], + Array [ + "/gmail/status", + ], + + Array [ + + "/correspondence/42", + + ], + ] + + 187 | expect(screen.getAllByText(translations.nb.correspondenceLoadFailed)[0]).toBeVisible(); + 188 | expect(screen.getByLabelText(translations.nb.correspondenceLogNoteOrMessage)).toHaveValue("Retain while translating error"); + > 189 | expect(client.get.mock.calls).toEqual(reads); expect(client.post).not.toHaveBeenCalled(); + | ^ + 190 | }); + 191 | + + at Object.toEqual (src/correspondence-recovery.test.tsx:189:33) + +Test Suites: 1 failed, 1 total +Tests: 1 failed, 13 passed, 14 total +Snapshots: 0 total +Time: 4.558 s +Ran all test suites matching correspondence-recovery.test.tsx. diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/RED_NOTE.txt b/docs/ui-modernisation/evidence/correspondence-recovery/RED_NOTE.txt new file mode 100644 index 00000000..b87ff4c1 --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/RED_NOTE.txt @@ -0,0 +1,201 @@ + +> job-tracker-ui@0.1.0 test +> jest --runInBand correspondence-recovery.test.tsx + + console.error + An update to Correspondence inside a test was not wrapped in act(...). + + When testing, code that causes React state updates should be wrapped into act(...): + + act(() => { + /* fire events that update state */ + }); + /* assert on the output */ + + This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + 177 | const res = await api.get(`/correspondence/${jobId}`); + 178 | if (request !== messageRequest.current) return; + > 179 | setMessages(res.data); + | ^ + 180 | setMessagesError(null); + 181 | } catch (error) { + 182 | if (request !== messageRequest.current) return; + + at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19 + at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9) + at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11) + at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13) + at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7) + at setMessages (src/components/Correspondence.tsx:179:7) + + console.error + An update to Correspondence inside a test was not wrapped in act(...). + + When testing, code that causes React state updates should be wrapped into act(...): + + act(() => { + /* fire events that update state */ + }); + /* assert on the output */ + + This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + 178 | if (request !== messageRequest.current) return; + 179 | setMessages(res.data); + > 180 | setMessagesError(null); + | ^ + 181 | } catch (error) { + 182 | if (request !== messageRequest.current) return; + 183 | setMessagesError(getApiErrorMessage(error, t("correspondenceLoadFailed"))); + + at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19 + at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9) + at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11) + at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13) + at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7) + at setMessagesError (src/components/Correspondence.tsx:180:7) + + console.error + An update to Correspondence inside a test was not wrapped in act(...). + + When testing, code that causes React state updates should be wrapped into act(...): + + act(() => { + /* fire events that update state */ + }); + /* assert on the output */ + + This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + 184 | throw error; // Existing mutation callers still handle their own operation failure. + 185 | } finally { + > 186 | if (request === messageRequest.current) setMessagesLoading(false); + | ^ + 187 | } + 188 | }, [jobId, t]); + 189 | + + at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19 + at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9) + at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11) + at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13) + at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7) + at setMessagesLoading (src/components/Correspondence.tsx:186:47) + + console.error + An update to Correspondence inside a test was not wrapped in act(...). + + When testing, code that causes React state updates should be wrapped into act(...): + + act(() => { + /* fire events that update state */ + }); + /* assert on the output */ + + This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + 192 | setGmailLoading(true); + 193 | const res = await api.get("/gmail/status"); + > 194 | setGmailStatus(res.data); + | ^ + 195 | } catch { + 196 | setGmailStatus({ connected: false }); + 197 | } finally { + + at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19 + at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9) + at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11) + at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13) + at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7) + at setGmailStatus (src/components/Correspondence.tsx:194:7) + + console.error + An update to Correspondence inside a test was not wrapped in act(...). + + When testing, code that causes React state updates should be wrapped into act(...): + + act(() => { + /* fire events that update state */ + }); + /* assert on the output */ + + This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + 196 | setGmailStatus({ connected: false }); + 197 | } finally { + > 198 | setGmailLoading(false); + | ^ + 199 | } + 200 | }, []); + 201 | + + at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19 + at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9) + at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11) + at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13) + at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7) + at setGmailLoading (src/components/Correspondence.tsx:198:7) + +FAIL src/correspondence-recovery.test.tsx + ● one pending note submission excludes duplicate writes and draft edits + + expect(jest.fn()).toHaveBeenCalledTimes(expected) + + Expected number of calls: 1 + Received number of calls: 2 + + 81 | const log = screen.getByRole("button", { name: translations.en.correspondenceAdd, exact: true }); + 82 | fireEvent.click(log); fireEvent.click(log); + > 83 | expect(client.post).toHaveBeenCalledTimes(1); + | ^ + 84 | expect(input).toBeDisabled(); expect(log).toBeDisabled(); + 85 | await act(async () => pending.resolve({ data: {} })); + 86 | expect(input).toHaveValue(""); expect(input).toBeEnabled(); + + at Object.toHaveBeenCalledTimes (src/correspondence-recovery.test.tsx:83:23) + + ● a committed note followed by a failed refresh is retried as a read, not reported as a failed write + + expect(element).not.toBeInTheDocument() + + expected document not to contain element, found
Failed to add message.
instead + + 114 | fireEvent.click(screen.getByRole("button", { name: translations.en.correspondenceAdd, exact: true })); + 115 | const retry = await screen.findByRole("button", { name: translations.en.retry, exact: true }); + > 116 | expect(screen.queryByText(translations.en.correspondenceAddFailed)).not.toBeInTheDocument(); + | ^ + 117 | expect(input).toHaveValue(""); + 118 | fireEvent.click(retry); await screen.findByText("Committed note"); + 119 | expect(client.post).toHaveBeenCalledTimes(1); + + at Object.toBeInTheDocument (src/correspondence-recovery.test.tsx:116:75) + + ● an old job's pending note cannot clear the next draft or reload the previous application + + expect(element).toHaveValue(Next draft) + + Expected the element to have value: + Next draft + Received: + + 130 | const reads = [...client.get.mock.calls]; + 131 | await act(async () => pending.resolve({ data: {} })); + > 132 | expect(screen.getByLabelText(translations.en.correspondenceLogNoteOrMessage)).toHaveValue("Next draft"); + | ^ + 133 | expect(client.get.mock.calls).toEqual(reads); + 134 | }); + 135 | + + at Object.toHaveValue (src/correspondence-recovery.test.tsx:132:81) + +Test Suites: 1 failed, 1 total +Tests: 3 failed, 6 passed, 9 total +Snapshots: 0 total +Time: 4.066 s +Ran all test suites matching correspondence-recovery.test.tsx. diff --git a/docs/ui-modernisation/evidence/correspondence-recovery/RED_READS.txt b/docs/ui-modernisation/evidence/correspondence-recovery/RED_READS.txt new file mode 100644 index 00000000..8560019a --- /dev/null +++ b/docs/ui-modernisation/evidence/correspondence-recovery/RED_READS.txt @@ -0,0 +1,254 @@ + +> job-tracker-ui@0.1.0 test +> jest --runInBand correspondence-recovery.test.tsx + +FAIL src/correspondence-recovery.test.tsx + ● a late previous-job success cannot overwrite current messages or error state + + TestingLibraryElementError: Unable to find an element with the text: Current application message. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + + Ignored nodes: comments, script, style + +
+
+ + Content loaded. + +
+
+
+
+

+ Stale previous application +

+
+ + Company + - Note + - 11/11/2026, 1:00:00 PM + + +
+
+
+
+
+
+ + Linked Gmail thread continuity + +

+ Linked Gmail refresh only checks threads already tied to this job, so new correspondence can appear here without re-importing the whole thread. +

+
+
+ + Gmail not connected + +
+
+ + No linked threads yet + +
+
+
+
+
+ + +
+ +
+ +
+