diff --git a/docs/ui-modernisation/PASTED_EMAIL_RECOVERY.md b/docs/ui-modernisation/PASTED_EMAIL_RECOVERY.md new file mode 100644 index 00000000..aa7a328c --- /dev/null +++ b/docs/ui-modernisation/PASTED_EMAIL_RECOVERY.md @@ -0,0 +1,23 @@ +# Manual pasted-email recording recovery + +Baseline `1f3bdbcd`; implementation/test/verifier `5f61d8f7`. + +The manual note and pasted-email forms now share their existing submission guard. Pasted-email recording locks the captured source, tabs and dismissal actions during a pending POST, excludes duplicate clicks and preserves the complete source on rejection. Late previous-job completions cannot clear or close the next application's draft. Committed recording followed by failed refresh uses the message-list read notice; Retry performs GET only. The source field now has a visible accessible label using the existing translation key. + +Parser behaviour, date/header conversion, sender selection and `/correspondence` payload are preserved. This records pasted text; it neither connects to a mailbox nor sends email. + +## Verification + +- RED: five of six new cases failed against the preceding implementation: duplicate/pending exclusion, false failure after commitment, two stale-context completions and the missing field label. Rejected-write draft retention already passed. +- PASSED:33 cases/two suites:20 recovery cases (six new) and13 existing Gmail cases. Earlier27 overlap this count. The unit checks preserve exact parsed synthetic headers, body, timestamp, sender and job ID. A transient incomplete setter rename was corrected before the final passing run/build. +- PASSED: static production build/TypeScript and scoped ESLint. +- PASSED:eight actual exported-application fixture journeys,390/1440 ×EN/NB ×light/dark;40 accessibility captures;16 intercepted write attempts (eight pre-commit fixture failures/eight fixture commitments). Each journey covers read failure/language change, rejected recording, pending duplicate/close/tab exclusion, committed-recording/refresh failure and GET-only recovery. The separate unsaved note remains intact. Zero page errors/unavailable reads; external fonts blocked. The single pilot overlaps the final eight configurations. +- Mobile Bokmål dark pending dialog was visually inspected. The labelled pasted source fits its scrollable dialog and footer actions remain available after failure/completion. + +Evidence: `evidence/pasted-email-recovery/`; source/evidence/export content bindings: `PASTED_EMAIL_SOURCE_MANIFEST.json`. Prior note matrices remain bound to their earlier source; do not add overlapping suite or journey counts. + +## Limits and rollback + +This is controlled API traffic, not database, provider, native-device or final security/recovery acceptance. The pending guard prevents repeated clicks in this mounted UI; it does not establish server idempotency or settle an ambiguous real network failure after server commitment. No automatic POST retry was added. Cross-job unsaved-draft navigation policy, other Gmail mutation/candidate races and remaining correspondence visual surfaces remain open. + +Rollback: revert `5f61d8f7`, rebuild and run affected correspondence checks. No dependency, migration, backend or stored data changes are involved. Final A3, Phase10, human/device, security and release gates remain separate. diff --git a/docs/ui-modernisation/PASTED_EMAIL_SOURCE_MANIFEST.json b/docs/ui-modernisation/PASTED_EMAIL_SOURCE_MANIFEST.json new file mode 100644 index 00000000..cde32739 --- /dev/null +++ b/docs/ui-modernisation/PASTED_EMAIL_SOURCE_MANIFEST.json @@ -0,0 +1,152 @@ +{ + "sourceContentCommit": "5f61d8f72ab00404d6a04853a3384973362de313", + "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": "89a9ae154c6fc8b6dcc518e77789c54ab3e3122c4726d09e682b851b9b8e3f30", + "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": "8cf78e2e288eb4750bf1f67a9380820d82a66dad8b66f497e4c4cd61e097fd7f", + "job-tracker-ui/src/correspondence-gmail-import.test.tsx": "f59abb397a716951399c64dfa6fbaeba3c63aaddd60e45eed7cdd5caf590a1e8", + "job-tracker-ui/scripts/verify-correspondence-recovery.mjs": "524976e9c42dae55807c8efd6ef844bd11d6407bc96f84010df5809905693a0c", + "job-tracker-ui/package.json": "3745394e406cefa40d30a87e840bccb359be147bac6ffba736e2ae90898a8626", + "job-tracker-ui/package-lock.json": "bf31e90d7af03e8af059db2aaf893925b9e8881a30a1688034ed88ef45d4fcab" + }, + "evidence": { + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-committed-read-error.png": "6bf4cfce275e929ace27087fd917c21745ac64b960527589f3627def933c0a7b", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-read-error.png": "b0c0c0bfa815fb6bf393f9ea26da9a7cb90ea473f3d8e9715908dd5a279a28da", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-recovered.png": "736b33e505014b6f1a71a0c4f0cf07b0eee1e925599b04074543e9f983b2854c", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-error.png": "8dbc58b7cc08a930daead9e232fc139ef4bcc15dd1171862b097f2f974afae11", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-pending.png": "761cc275d30ea9951c5083fe09713aeb76a1788359c375d87bf73cc90325db23", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-committed-read-error.png": "e127024b0c488b202563b1c71095507961ebe742cc6aaa6a47077a901130f1c4", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-read-error.png": "c9dc2eba30e96e97be63164ed9175c958dba47c3328090711c3fd29a83ebfff8", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-recovered.png": "4ba9865733c64a43814a5e881035436a810101bd5228288fa485efdd8434d454", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-error.png": "389be66756374262bf5965313b40cd8064ed8a1f40607b299738713bf5d78753", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-pending.png": "53342e26591fbaa79ff2b06ba6ecc511c522aac79264c1fcdceabb6a9cd8d370", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-committed-read-error.png": "02dcf3f2d744e3314b4ad4bd68bad1c45834b7dce134ea89926811e2959d63e8", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-read-error.png": "d9f3c40532f9678be57d414c012b0c61666ef18861b2008f87fd9d7f6801cf2f", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-recovered.png": "122ca4be13e500712b1cf86728937624aa5e1651c825a0417f3aec20abe48300", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-error.png": "219a7914ac932dd948cea7f2f265afbcf4ca03ad2e3b74167208b9c45f793810", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-pending.png": "604f4f3da52025ceaf120646d21859a44abb4f49453b41ba0a98acb492d6c990", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-committed-read-error.png": "7dce8abf6bf4988ab6a06eec46b98696b0e018982ff4a822652dd0d51b807e87", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-read-error.png": "54130b6492f91a44c9202ba559e1ea35463508423a4ba41c762127f3fe833cad", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-recovered.png": "6d8ee32deaa63983f4a68b60bb49dcc99b8a757b8d67bf94b77449e5df8a2e9d", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-error.png": "9b765a7df4746e07f30376e5fa9816d0a011fe339b88968c2ad6bf56c57fd2a8", + "docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-pending.png": "06b8bc3e39a455759c82e5de6475525beb992b92c8b69316c7a45b18731eab88", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-committed-read-error.png": "6fd25b9ed38d211a69d0be825c77603fc343bfd7d9a0355ec8bfdccba76b24b3", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-read-error.png": "db89385e241a7be313d5cd8be9fd7d72caba9fff75e85fca7d4af0f8b028ef71", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-recovered.png": "5994e9912d4cd2253867296f9dd677cc8bc94e1ec8eefafd160cb69380445377", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-error.png": "542ff4d5f3be59ca12e8c4332f33b53bf88bc0e93c92b1b0d4caf76d9c244eda", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-pending.png": "b7d91c68cd9503d682c927c7f20b1b3869cce0d1be2cc4f562c5124908c8f4f2", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-committed-read-error.png": "9f480d7bb35d34857c6db912b661a2339d6313813daa4eb9f7fba5660158135a", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-read-error.png": "652a024aeb9d7c8ef3613cf707355d31548e75227d4bee154ac1f62940050aff", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-recovered.png": "6400dbc0cd7ce64b365ebfddf8c1ca85240733e9e2d80220e0d590af51a14d0a", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-error.png": "a077ebd6713843758928612b26a79e2d899deedf6ea4d492a0709d333465eb38", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-pending.png": "02a9a68a5c21dd54609bdadd83487fb3c1755120a7049b5c9a2430c24cc5ab7d", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-committed-read-error.png": "caf8c77630a67197edb946c747c7495ff93949ed23d0881a7168980299bf7088", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-read-error.png": "60152bda8486dc18556dcd6c4e94134c542de53ec596e562449f4e97a641d552", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-recovered.png": "fe667869ffd2e31e10c98a256da5e55fdb173a3e62ce91a238575b3ca37bfd5e", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-error.png": "c1933a137fad4bc2242cfacb14da488fdd4b6cdbee67a514ccb73b7f7fe2fa10", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-pending.png": "f5aaeb09ce4736eaef33302c85be289e08992d67a12df719f3018bde7395cd6a", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-committed-read-error.png": "aeb1e072e26a7bb5a15fe760313f7a0b9e8c5c65e3f83695cedaf8527ffc182b", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-read-error.png": "1400fc9102c268a7727573c136e961452d68c50964ea8a11b3cc1d408f55e646", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-recovered.png": "3b5be163bbb7b32ec38f27ac0556cffa0dfa20af3dcbbe28501c066657b64039", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-error.png": "b87a9da27c0cbdb3efe68b7ad9b0f07811c95f2836af24b6087cbefb82916d2e", + "docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-pending.png": "ad753928305e7aba3fe23ef7a829e72264b247f46c271edffad9b0a040dc0b53", + "docs/ui-modernisation/evidence/pasted-email-recovery/BROWSER.json": "cf74ee59b9dda1b40111eb1325e58bda54eae279f880acea4079d06816cb6712", + "docs/ui-modernisation/evidence/pasted-email-recovery/BROWSER.txt": "17e88f360f262e0382ebb7cd8edc02a68bddb0b525b219f4dc26dacb6928244d", + "docs/ui-modernisation/evidence/pasted-email-recovery/BUILD.txt": "f0704cf713c8c9c59c1416b5a5444129c41d2d40ebc06ebfc414e974c8bddbad", + "docs/ui-modernisation/evidence/pasted-email-recovery/LINT.txt": "4fdab9a86694d3bd23b27ed16d9678ff6301455473d7f15c97c04b7d3ecece97", + "docs/ui-modernisation/evidence/pasted-email-recovery/PILOT.json": "6797d8e4ddb4dcd80fd64fffe05d3cff9e12bbc42bb12fb965b4f2cafe2e8970", + "docs/ui-modernisation/evidence/pasted-email-recovery/RED.txt": "bf2c792973e8443d15ab9bf3a446ea049a5aa4345c901aca443971f909ec9d55", + "docs/ui-modernisation/evidence/pasted-email-recovery/TESTS.txt": "51c7608139d9ab25ced7be5a21cc35c79adc1a003b4b0ee6dbc42af05f2cf8ce", + "docs/ui-modernisation/PASTED_EMAIL_RECOVERY.md": "b70a1fceb6ae18b8748d0eb8814943d1ebf132307ad3407f63a36cc81dd01e0d" + }, + "export": { + "job-tracker-ui/out/404.html": "94f33de4299ac062ccd5fec57298e7f853ba8b7543a3d7582c5c75fcb4ef6ea8", + "job-tracker-ui/out/__next.__PAGE__.txt": "30717b938705a07754ddf6280563b83d00eff60e54d63cb72c9388c2f1b38675", + "job-tracker-ui/out/__next._full.txt": "bb83f6731e87990474a6e5590385281ffefe07d8c1340fe4fd7932bac79d8151", + "job-tracker-ui/out/__next._tree.txt": "b6bc7ff5b6b41b1dd6493fab4c65f9d9288a9ea07474b81c632cef38fd2897ff", + "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/0i4xt0zewvp0d.js": "a47f4bf60fc2aaa2b0a1a7caf997a97c3bf67a88b9c3efeb88bd076b47a3d105", + "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/0vo4_3wcjs1gy.js": "5e4d305fc346f9ecf48328ab0416397d8bd7c100f0de99dea16d2a1463b386a9", + "job-tracker-ui/out/_next/static/chunks/0xkomgy5b-m5h.js": "f7c462f84c6138645b679df07e12194699db82c7665c82795235459107f448f0", + "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/1dk9-pt1on4nl.js": "4c74c89f679d333b17d56c9d329f0c1ac1073c06f726309f3f669f4f4a177f56", + "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/3_4dnl1l3809g.js": "50288c2864a9e8c7ef25c93762edb86e4e617778737b5b5a028c53c5b93d3b70", + "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/nRjVoKWpm9QtsElF-uj2M/_buildManifest.js": "9476e0afd3f9da68a64e6ec58631191fd3eaca62c9f5a377e7517fe9a89e59ea", + "job-tracker-ui/out/_next/static/nRjVoKWpm9QtsElF-uj2M/_clientMiddlewareManifest.js": "5483e3295dc35dfe29ea932efc85341c916f10ff78ff5b0e965e003710893a4a", + "job-tracker-ui/out/_next/static/nRjVoKWpm9QtsElF-uj2M/_ssgManifest.js": "678f6ce2cb80b1fe72fc67e7412be6e2ab6ada083111b64f7c40d35e3cba5e00", + "job-tracker-ui/out/_not-found/__next._full.txt": "8d374dbc03ad2d9ccd5095c2a52428ba4d4e825c9e33ddf2bf32ec980380f4af", + "job-tracker-ui/out/_not-found/__next._not-found/__PAGE__.txt": "8ecf7092fafabc053608f1eea0dd3bd88a0492cf1147f5da786ec7dca18db179", + "job-tracker-ui/out/_not-found/__next._tree.txt": "2d832dedaeed506982a7083415b70ddb5b9ea3793c7d723d13a202da3604d2a6", + "job-tracker-ui/out/_not-found.html": "94f33de4299ac062ccd5fec57298e7f853ba8b7543a3d7582c5c75fcb4ef6ea8", + "job-tracker-ui/out/_not-found.txt": "8d374dbc03ad2d9ccd5095c2a52428ba4d4e825c9e33ddf2bf32ec980380f4af", + "job-tracker-ui/out/favicon.ico": "8d4923e2c487805ea9f852a685b2cf0fb10512ded8290d2a5c37d1cc8fd0702a", + "job-tracker-ui/out/favicon.svg": "63ecf8f37f8bb146ecfae3917187c6b692d4e801641e8a314486a4007912f3a3", + "job-tracker-ui/out/index.html": "11ad153e29c1a89c7fd6629e6778c1f7693e7f09601be0efc2023ffb41aaef97", + "job-tracker-ui/out/index.txt": "bb83f6731e87990474a6e5590385281ffefe07d8c1340fe4fd7932bac79d8151", + "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/pasted-email-recovery/1440-en-dark-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-committed-read-error.png new file mode 100644 index 00000000..48d5e260 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-read-error.png new file mode 100644 index 00000000..3ee7cdfe Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-recovered.png new file mode 100644 index 00000000..a2782635 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-error.png new file mode 100644 index 00000000..e00d6a78 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-pending.png new file mode 100644 index 00000000..0ac4c29e Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-committed-read-error.png new file mode 100644 index 00000000..623a26d9 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-read-error.png new file mode 100644 index 00000000..4afce3e3 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-recovered.png new file mode 100644 index 00000000..65b75ec7 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-error.png new file mode 100644 index 00000000..39aef1da Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-pending.png new file mode 100644 index 00000000..b358bd55 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-en-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-committed-read-error.png new file mode 100644 index 00000000..f19d06b1 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-read-error.png new file mode 100644 index 00000000..3929c78b Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-recovered.png new file mode 100644 index 00000000..a2923d1b Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-error.png new file mode 100644 index 00000000..6ee59cf2 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-pending.png new file mode 100644 index 00000000..e17f5968 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-committed-read-error.png new file mode 100644 index 00000000..35fa56e9 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-read-error.png new file mode 100644 index 00000000..f3acbb31 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-recovered.png new file mode 100644 index 00000000..63742476 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-error.png new file mode 100644 index 00000000..ac29501f Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-pending.png new file mode 100644 index 00000000..e39f7788 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/1440-nb-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-committed-read-error.png new file mode 100644 index 00000000..a133aef7 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-read-error.png new file mode 100644 index 00000000..9f29d8b2 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-recovered.png new file mode 100644 index 00000000..7f52a07e Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-error.png new file mode 100644 index 00000000..bea3ffcb Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-pending.png new file mode 100644 index 00000000..d01889ec Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-committed-read-error.png new file mode 100644 index 00000000..70b8019a Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-read-error.png new file mode 100644 index 00000000..f5b04a18 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-recovered.png new file mode 100644 index 00000000..66687c09 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-error.png new file mode 100644 index 00000000..0627ea92 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-pending.png new file mode 100644 index 00000000..cf59cb01 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-en-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-committed-read-error.png new file mode 100644 index 00000000..ae1fd764 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-read-error.png new file mode 100644 index 00000000..28d841d8 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-recovered.png new file mode 100644 index 00000000..7ee6749c Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-error.png new file mode 100644 index 00000000..d2f72bfd Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-pending.png new file mode 100644 index 00000000..a6dc7346 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-dark-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-committed-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-committed-read-error.png new file mode 100644 index 00000000..2e6ba1a3 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-committed-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-read-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-read-error.png new file mode 100644 index 00000000..bbef3030 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-read-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-recovered.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-recovered.png new file mode 100644 index 00000000..b01a9b70 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-recovered.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-error.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-error.png new file mode 100644 index 00000000..53bc2fc2 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-error.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-pending.png b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-pending.png new file mode 100644 index 00000000..ec3246c2 Binary files /dev/null and b/docs/ui-modernisation/evidence/pasted-email-recovery/390-nb-light-write-pending.png differ diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/BROWSER.json b/docs/ui-modernisation/evidence/pasted-email-recovery/BROWSER.json new file mode 100644 index 00000000..9acb703d --- /dev/null +++ b/docs/ui-modernisation/evidence/pasted-email-recovery/BROWSER.json @@ -0,0 +1,532 @@ +{ + "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", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "390-en-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + }, + { + "name": "390-en-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "390-en-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + }, + { + "name": "390-nb-light", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "390-nb-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + }, + { + "name": "390-nb-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "390-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-en-light", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "1440-en-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-en-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "1440-en-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-nb-light", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "1440-nb-light", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + }, + { + "name": "1440-nb-dark", + "attempt": 1, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "1440-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "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/pasted-email-recovery/BROWSER.txt b/docs/ui-modernisation/evidence/pasted-email-recovery/BROWSER.txt new file mode 100644 index 00000000..1acc173b --- /dev/null +++ b/docs/ui-modernisation/evidence/pasted-email-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/pasted-email-recovery/BUILD.txt b/docs/ui-modernisation/evidence/pasted-email-recovery/BUILD.txt new file mode 100644 index 00000000..e2456128 --- /dev/null +++ b/docs/ui-modernisation/evidence/pasted-email-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 25ms + + Creating an optimized production build ... +✓ Compiled successfully in 508ms + Running TypeScript ... + Finished TypeScript in 5.5s ... + Collecting page data using 4 workers ... + Generating static pages using 4 workers (0/3) ... +✓ Generating static pages using 4 workers (3/3) in 801ms + Finalizing page optimization ... + +Route (app) +┌ ○ / +└ ○ /_not-found + + +○ (Static) prerendered as static content + diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/LINT.txt b/docs/ui-modernisation/evidence/pasted-email-recovery/LINT.txt new file mode 100644 index 00000000..92403dd8 --- /dev/null +++ b/docs/ui-modernisation/evidence/pasted-email-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/pasted-email-recovery/PILOT.json b/docs/ui-modernisation/evidence/pasted-email-recovery/PILOT.json new file mode 100644 index 00000000..fb4ccd33 --- /dev/null +++ b/docs/ui-modernisation/evidence/pasted-email-recovery/PILOT.json @@ -0,0 +1,77 @@ +{ + "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", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixture500" + }, + { + "name": "390-nb-dark", + "attempt": 2, + "body": { + "jobApplicationId": 42, + "from": "Me", + "channel": "Email", + "subject": "Synthetic interview", + "content": "Synthetic email body", + "date": "2026-11-11T12:00:00.000Z", + "externalFrom": "recruiter@example.test", + "externalTo": "applicant@example.test" + }, + "result": "fixtureCommitted" + } + ], + "errors": [], + "unavailableReads": [], + "blockedExternal": [ + "https://fonts.googleapis.com" + ] +} \ No newline at end of file diff --git a/docs/ui-modernisation/evidence/pasted-email-recovery/RED.txt b/docs/ui-modernisation/evidence/pasted-email-recovery/RED.txt new file mode 100644 index 00000000..addf1b35 --- /dev/null +++ b/docs/ui-modernisation/evidence/pasted-email-recovery/RED.txt @@ -0,0 +1,303 @@ + +> job-tracker-ui@0.1.0 test +> jest --runInBand correspondence-recovery.test.tsx + +FAIL src/correspondence-recovery.test.tsx (5.235 s) + ● pasted-email submission locks its draft, tabs and close actions and excludes duplicate writes + + expect(jest.fn()).toHaveBeenCalledTimes(expected) + + Expected number of calls: 1 + Received number of calls: 2 + + 207 | render(view()); const { dialog, input, submit } = await openRawEmail(); + 208 | fireEvent.click(submit); fireEvent.click(submit); + > 209 | expect(client.post).toHaveBeenCalledTimes(1); expect(input).toBeDisabled(); expect(submit).toBeDisabled(); + | ^ + 210 | expect(within(dialog).getByRole("tab", { name: translations.en.google })).toBeDisabled(); + 211 | expect(within(dialog).getByRole("button", { name: translations.en.correspondenceClose })).toBeDisabled(); + 212 | fireEvent.keyDown(dialog, { key: "Escape" }); expect(dialog).toBeVisible(); + + at Object.toHaveBeenCalledTimes (src/correspondence-recovery.test.tsx:209:23) + + ● committed pasted email with failed refresh offers read retry without a failed-import alert + + expect(element).not.toBeInTheDocument() + + expected document not to contain element, found
Import failed.
instead + + 235 | const { submit } = await openRawEmail(); fireEvent.click(submit); + 236 | const retry = await screen.findByRole("button", { name: translations.en.retry }); + > 237 | expect(screen.queryByText(translations.en.addJobModalImportFailed)).not.toBeInTheDocument(); + | ^ + 238 | fireEvent.click(retry); await screen.findByText("Recorded email"); + 239 | expect(client.post).toHaveBeenCalledTimes(1); + 240 | }); + + at Object.toBeInTheDocument (src/correspondence-recovery.test.tsx:237:75) + + ● old-job pasted-email success cannot close or clear a new draft + + expect(element).toBeVisible() + + Received element is not visible: +