test(correspondence): retain recovery and accessibility evidence

This commit is contained in:
cesnimda
2026-11-11 14:02:11 +01:00
parent c751b4272e
commit 1f3bdbcd31
55 changed files with 1552 additions and 0 deletions
@@ -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.
@@ -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"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -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"
]
}
@@ -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
@@ -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
@@ -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"
]
}
@@ -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
@@ -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)
@@ -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"
]
}
@@ -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": "<main class=\"MuiBox-root css-jk08jh\" id=\"app-main-content\" tabindex=\"-1\">",
"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": "<p class=\"MuiFormHelperText-root Mui-disabled MuiFormHelperText-sizeSmall MuiFormHelperText-contained MuiFormHelperText-filled css-5w5z23\" id=\"_r_18_-helper-text\">25 tegn</p>",
"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"
]
}
@@ -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: '<main class="MuiBox-root css-jk08jh" id="app-main-content" tabindex="-1">',
+ 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: '<p class="MuiFormHelperText-root Mui-disabled MuiFormHelperText-sizeSmall MuiFormHelperText-contained MuiFormHelperText-filled css-5w5z23" id="_r_18_-helper-text">25 tegn</p>',
+ 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: '<p class="MuiFormHelperText-root Mui-disabled MuiFormHelperText-sizeSmall MuiFormHelperText-contained MuiFormHelperText-filled css-5w5z23" id="_r_18_-helper-text">25 tegn</p>',
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
@@ -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.
@@ -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<CorrespondenceMessage[]>(`/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<GmailStatus>("/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 <div class="MuiAlert-message css-zioonp-MuiAlert-message">Failed to add message.</div> 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.
@@ -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
<body>
<div>
<div
class="MuiBox-root css-0"
>
<span
aria-atomic="true"
aria-live="polite"
class="MuiBox-root css-ty8jgw"
role="status"
>
Content loaded.
</span>
<div
class="MuiPaper-root MuiPaper-outlined MuiPaper-rounded css-1h1w43f-MuiPaper-root"
>
<div
class="MuiBox-root css-1821gv5"
>
<div
class="MuiBox-root css-1w1vbxm"
>
<div
class="MuiBox-root css-1o0cahp"
>
<p
class="MuiTypography-root MuiTypography-body1 css-u35b64-MuiTypography-root"
>
Stale previous application
</p>
<div
class="MuiBox-root css-ipmqpd"
>
<span
class="MuiTypography-root MuiTypography-caption css-2qd4a1-MuiTypography-root"
>
Company
- Note
- 11/11/2026, 1:00:00 PM
</span>
<button
aria-label="Delete message"
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeSmall css-1374xo4-MuiButtonBase-root-MuiIconButton-root"
tabindex="0"
type="button"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root MuiSvgIcon-fontSizeSmall css-120dh41-MuiSvgIcon-root"
data-testid="DeleteOutlineIcon"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
<div
class="MuiBox-root css-2a1bwi"
>
<span
class="MuiTypography-root MuiTypography-overline css-12l99mj-MuiTypography-root"
>
Linked Gmail thread continuity
</span>
<p
class="MuiTypography-root MuiTypography-body2 css-sn1rsr-MuiTypography-root"
>
Linked Gmail refresh only checks threads already tied to this job, so new correspondence can appear here without re-importing the whole thread.
</p>
<div
class="MuiBox-root css-1mcghfl"
>
<div
class="MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-outlinedDefault css-1w2bku1-MuiChip-root"
>
<span
class="MuiChip-label MuiChip-labelSmall css-19m61dl-MuiChip-label"
>
Gmail not connected
</span>
</div>
<div
class="MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-outlinedDefault css-1w2bku1-MuiChip-root"
>
<span
class="MuiChip-label MuiChip-labelSmall css-19m61dl-MuiChip-label"
>
No linked threads yet
</span>
</div>
</div>
</div>
<div
class="MuiBox-root css-280wdd"
>
<div
class="MuiToggleButtonGroup-root MuiToggleButtonGroup-horizontal css-1qb8o-MuiToggleButtonGroup-root"
role="group"
>
<button
aria-pressed="true"
class="MuiButtonBase-root MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButton-root Mui-selected MuiToggleButton-sizeSmall MuiToggleButton-standard MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButtonGroup-firstButton css-uuq42u-MuiButtonBase-root-MuiToggleButton-root"
tabindex="0"
type="button"
value="Me"
>
Me
</button>
<button
aria-pressed="false"
class="MuiButtonBase-root MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButton-root MuiToggleButton-sizeSmall MuiToggleButton-standard MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButtonGroup-lastButton css-uuq42u-MuiButtonBase-root-MuiToggleButton-root"
tabindex="0"
type="button"
value="Company"
>
Company
</button>
</div>
<button
class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary css-74b9is-MuiButtonBase-root-MuiButton-root"
tabindex="0"
type="button"
>
Import email
</button>
<div
class="MuiFormControl-root MuiTextField-root css-9f1m7e-MuiFormControl-root-MuiTextField-root"
>
<label
class="MuiFormLabel-root MuiInputLabel-root MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-outlined MuiFormLabel-colorPrimary MuiInputLabel-root MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-outlined css-10i8ezf-MuiFormLabel-root-MuiInputLabel-root"
data-shrink="false"
for="_r_4_"
id="_r_4_-label"
>
Log note or message
</label>
<div
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-formControl MuiInputBase-multiline css-hk3xm4-MuiInputBase-root-MuiOutlinedInput-root"
>
<textarea
aria-describedby="_r_4_-helper-text"
aria-invalid="false"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputMultiline css-1cuox7w-MuiInputBase-input-MuiOutlinedInput-input"
id="_r_4_"
style="height: 0px; overflow: hidden;"
/>
<textarea
aria-hidden="true"
class="MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputMultiline css-1cuox7w-MuiInputBase-input-MuiOutlinedInput-input"
readonly=""
style="visibility: hidden; position: absolute; overflow: hidden; height: 0px; top: 0px; left: 0px; transform: translateZ(0); padding-top: 0px; padding-bottom: 0px; width: 100%;"
tabindex="-1"
/>
<fieldset
aria-hidden="true"
class="MuiOutlinedInput-notchedOutline css-18p5xg2-MuiNotchedOutlined-root-MuiOutlinedInput-notchedOutline"
>
<legend
class="css-1n64csd-MuiNotchedOutlined-root"
>
<span>
Log note or message
</span>
</legend>
</fieldset>
</div>
<p
class="MuiFormHelperText-root MuiFormHelperText-sizeMedium MuiFormHelperText-contained css-1h0qynx-MuiFormHelperText-root"
id="_r_4_-helper-text"
>
0 characters
</p>
</div>
<button
class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButton-colorPrimary Mui-disabled MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButton-colorPrimary css-83fk99-MuiButtonBase-root-MuiButton-root"
disabled=""
tabindex="-1"
type="button"
>
Add
</button>
</div>
</div>
</div>
</body>
40 | else old.reject(new Error("previous job unavailable"));
41 | });
> 42 | expect(screen.getByText("Current application message")).toBeVisible();
| ^
43 | expect(screen.queryByText("Stale previous application")).not.toBeInTheDocument();
44 | expect(screen.queryByText(translations.en.correspondenceLoadFailed)).not.toBeInTheDocument();
45 | expect(client.post).not.toHaveBeenCalled();
at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)
at node_modules/@testing-library/dom/dist/query-helpers.js:76:38
at node_modules/@testing-library/dom/dist/query-helpers.js:52:17
at node_modules/@testing-library/dom/dist/query-helpers.js:95:19
at getByText (src/correspondence-recovery.test.tsx:42:17)
● a late previous-job failure cannot overwrite current messages or error state
expect(element).not.toBeInTheDocument()
expected document not to contain element, found <p class="MuiTypography-root MuiTypography-body1 css-bergga-MuiTypography-root">Could not load this application's correspondence.</p> instead
42 | expect(screen.getByText("Current application message")).toBeVisible();
43 | expect(screen.queryByText("Stale previous application")).not.toBeInTheDocument();
> 44 | expect(screen.queryByText(translations.en.correspondenceLoadFailed)).not.toBeInTheDocument();
| ^
45 | expect(client.post).not.toHaveBeenCalled();
46 | });
47 |
at toBeInTheDocument (src/correspondence-recovery.test.tsx:44:76)
● changing application clears displayed messages while the next read is pending
expect(element).not.toBeInTheDocument()
expected document not to contain element, found <p class="MuiTypography-root MuiTypography-body1 css-u35b64-MuiTypography-root">Previous application only</p> instead
52 | rendered.rerender(view(43));
53 | await waitFor(() => expect(client.get).toHaveBeenCalledWith("/correspondence/43"));
> 54 | expect(screen.queryByText("Previous application only")).not.toBeInTheDocument();
| ^
55 | await act(async () => next.resolve({ data: [message(43, "Next application only")] }));
56 | expect(await screen.findByText("Next application only")).toBeVisible();
57 | });
at Object.toBeInTheDocument (src/correspondence-recovery.test.tsx:54:63)
Test Suites: 1 failed, 1 total
Tests: 3 failed, 2 passed, 5 total
Snapshots: 0 total
Time: 4.095 s
Ran all test suites matching correspondence-recovery.test.tsx.
@@ -0,0 +1,10 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand correspondence-recovery.test.tsx correspondence-gmail-import.test.tsx
Test Suites: 2 passed, 2 total
Tests: 27 passed, 27 total
Snapshots: 0 total
Time: 9.147 s
Ran all test suites matching correspondence-recovery.test.tsx|correspondence-gmail-import.test.tsx.