{"id":836,"date":"2026-09-13T16:41:56","date_gmt":"2026-09-13T16:41:56","guid":{"rendered":"https:\/\/www.opey.org\/opeyit\/?page_id=836"},"modified":"2026-09-13T21:43:07","modified_gmt":"2026-09-13T21:43:07","slug":"quantum-shelf-life","status":"publish","type":"page","link":"https:\/\/www.opey.org\/opeyit\/?page_id=836","title":{"rendered":"Quantum Shelf Life"},"content":{"rendered":"\n<!--\n=====================================================\nQUANTUM SHELF LIFE CALCULATOR\nCompanion tool for WHEN AGENTS RULE by Steven Oppenheim\n=====================================================\n\nHOW TO INSTALL\n1. Create a WordPress page titled \"Quantum Shelf Life Calculator\"\n2. Add a Custom HTML block\n3. Paste this entire file into that block\n4. Preview, then Publish\n5. Replace #REPLACE_TOOL_QUANTUM on the book page (page_id 748)\n   with ?page_id=THIS_PAGE_ID\n\nSELF CONTAINED. Scoped to #war-qsl-2026 so it cannot collide with\nthe book page, the clock reader, the classifier or the CpCD page.\n\n=====================================================\nTHE TEST, AS CHAPTER 2 SETS IT OUT\n=====================================================\n  Protection margin = years until a capable quantum computer\n                      minus (years the data must stay confidential\n                      plus years the migration will take)\n\nA negative margin means the exposure already exists. Chapter 2 is\nexplicit about why that is different from an ordinary risk: \"there\nis no way to retroactively protect data that has already been\ncaptured.\" Traffic harvested today cannot be un-harvested, so a\nnegative margin cannot be closed by future effort.\n\nThis is the same arithmetic the Cryptographic Census workbook in the\ncompanion toolkit performs per asset. Thresholds and sign\nconventions are identical so the two instruments cannot disagree.\n\n=====================================================\nTHE ONE DESIGN DECISION THAT MATTERS\n=====================================================\nChapter 2 quotes the CFO objection in full: \"You want me to approve\ntwenty million dollars over five years to protect against computers\nthat don't exist yet, based on a timeline that nobody can predict,\nfor a threat that might never materialize?\"\n\nA calculator that answers by asking the user to pick a quantum date\nhas conceded the objection. So this tool does not rest on one date.\nIt computes the margin across the full plausible range, from 2030 to\n2045, and separates:\n\n  data classes exposed at EVERY date in the range, which are\n    immune to the timeline argument and should be funded now, and\n  data classes exposed only at the early dates, which are genuine\n    judgement calls about a date nobody can predict.\n\nThat distinction is the answer to the CFO, and it is arithmetic\nrather than advocacy.\n\n=====================================================\nDATA CLASS PRESETS, FROM CHAPTER 2\n=====================================================\nChapter 2 sets out a risk profile by data type. The presets follow it:\n  Session keys, single transaction     minimal risk\n  Operational telemetry               short lived\n  Payment and card data               contractual retention\n  Regulatory filings and audit evidence\n  Customer records under contract     significant risk, decades\n  Board and corporate development material\n  Contracts and legal privilege\n  Intellectual property, trade secrets EXTREME, decades\n  Healthcare records                  high, patient lifetime\n  Genetic information                 never loses sensitivity\n  Government classified               highest, lifetimes\n\nPreset years are illustrative starting points, not legal advice.\nReplace them with your own retention obligations.\n\n=====================================================\nWORDPRESS COMPATIBILITY  (do not reintroduce these)\n=====================================================\n  - NO less than sign anywhere in the script.\n  - NO ampersand in the script.\n  - NO innerHTML. Output built with createElement and textContent.\n  - No template literals, arrow functions or optional chaining.\n  - Works with JavaScript disabled: the noscript block carries the\n    test, the presets and the manual method.\n\nNO HYPHENS, EM DASHES OR EN DASHES IN VISIBLE COPY.\n-->\n\n<div id=\"war-qsl-2026\">\n\n<style>\n#war-qsl-2026 {\n    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif !important;\n    color: #333 !important; line-height: 1.6 !important; max-width: 100% !important; margin: 0 !important; padding: 0 !important;\n}\n#war-qsl-2026 * { box-sizing: border-box !important; }\n#war-qsl-2026 a { text-decoration: none !important; }\n#war-qsl-2026 .q-inner { max-width: 900px !important; margin: 0 auto !important; }\n#war-qsl-2026 .q-wide { max-width: 1120px !important; margin: 0 auto !important; }\n\n#war-qsl-2026 .q-band { background: linear-gradient(90deg, #991B1B 0%, #B91C1C 100%) !important; padding: 12px 20px !important; text-align: center !important; }\n#war-qsl-2026 .q-band p { margin: 0 !important; color: #fff !important; font-size: 13.5px !important; font-weight: 500 !important; }\n#war-qsl-2026 .q-band strong { color: #FFD7D7 !important; }\n\n#war-qsl-2026 .q-hero {\n    background: radial-gradient(circle at 80% 20%, rgba(185,28,28,0.24) 0%, transparent 55%),\n                linear-gradient(135deg, #0a1622 0%, #1a2a3a 55%, #2d4156 100%) !important;\n    padding: 52px 20px 46px 20px !important;\n}\n#war-qsl-2026 .q-eyebrow { display: inline-block !important; color: #c9a227 !important; font-size: 11px !important; font-weight: 700 !important; letter-spacing: 2px !important; text-transform: uppercase !important; margin-bottom: 12px !important; }\n#war-qsl-2026 .q-h1 { color: #fff !important; font-size: 42px !important; font-weight: 800 !important; margin: 0 0 14px 0 !important; line-height: 1.06 !important; letter-spacing: -0.5px !important; }\n#war-qsl-2026 .q-lede { color: rgba(255,255,255,0.85) !important; font-size: 17px !important; margin: 0 0 20px 0 !important; line-height: 1.5 !important; max-width: 690px !important; }\n#war-qsl-2026 .q-formula { background: rgba(0,0,0,0.30) !important; border: 1px solid rgba(201,162,39,0.42) !important; border-radius: 8px !important; padding: 16px 18px !important; max-width: 690px !important; margin-bottom: 22px !important; }\n#war-qsl-2026 .q-formula span { display: block !important; color: #c9a227 !important; font-size: 10.5px !important; font-weight: 800 !important; letter-spacing: 1.6px !important; text-transform: uppercase !important; margin-bottom: 8px !important; }\n#war-qsl-2026 .q-formula code { display: block !important; color: #fff !important; font-family: Georgia, 'Times New Roman', serif !important; font-size: 15.5px !important; line-height: 1.55 !important; background: none !important; padding: 0 !important; }\n#war-qsl-2026 .q-facts { display: flex !important; flex-wrap: wrap !important; gap: 10px !important; margin-bottom: 24px !important; }\n#war-qsl-2026 .q-fact { background: rgba(255,255,255,0.08) !important; border: 1px solid rgba(255,255,255,0.18) !important; border-radius: 6px !important; padding: 9px 14px !important; color: rgba(255,255,255,0.9) !important; font-size: 12.5px !important; font-weight: 600 !important; }\n#war-qsl-2026 .q-fact b { color: #c9a227 !important; }\n#war-qsl-2026 .q-honest { max-width: 710px !important; background: rgba(201,162,39,0.10) !important; border-left: 4px solid #c9a227 !important; border-radius: 6px !important; padding: 16px 18px !important; color: rgba(255,255,255,0.82) !important; font-size: 13.5px !important; line-height: 1.65 !important; }\n#war-qsl-2026 .q-honest b { color: #c9a227 !important; }\n\n#war-qsl-2026 .q-form { background: #f7f8fa !important; padding: 46px 20px !important; }\n#war-qsl-2026 .q-sec { background: #fff !important; border: 1px solid #e2e6ea !important; border-radius: 12px !important; margin-bottom: 22px !important; overflow: hidden !important; }\n#war-qsl-2026 .q-shead { padding: 20px 24px !important; display: flex !important; align-items: center !important; gap: 15px !important; flex-wrap: wrap !important; }\n#war-qsl-2026 .q-shead.s1 { background: linear-gradient(135deg, #B91C1C 0%, #991B1B 100%) !important; }\n#war-qsl-2026 .q-shead.s2 { background: linear-gradient(135deg, #475569 0%, #334155 100%) !important; }\n#war-qsl-2026 .q-shead.s3 { background: linear-gradient(135deg, #D97706 0%, #B45309 100%) !important; }\n#war-qsl-2026 .q-shead.s4 { background: linear-gradient(135deg, #059669 0%, #047857 100%) !important; }\n#war-qsl-2026 .q-snum { width: 46px !important; height: 46px !important; flex-shrink: 0 !important; background: rgba(255,255,255,0.16) !important; border: 2px solid rgba(255,255,255,0.35) !important; border-radius: 10px !important; display: flex !important; align-items: center !important; justify-content: center !important; color: #fff !important; font-size: 17px !important; font-weight: 800 !important; }\n#war-qsl-2026 .q-stitle { flex: 1 !important; min-width: 200px !important; }\n#war-qsl-2026 .q-stitle h2 { margin: 0 0 4px 0 !important; color: #fff !important; font-size: 20px !important; font-weight: 700 !important; line-height: 1.25 !important; }\n#war-qsl-2026 .q-stitle p { margin: 0 !important; color: rgba(255,255,255,0.88) !important; font-size: 13px !important; line-height: 1.45 !important; }\n#war-qsl-2026 .q-sbody { padding: 20px 24px !important; }\n#war-qsl-2026 .q-fields { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 14px !important; }\n#war-qsl-2026 .q-f label { display: block !important; font-size: 13px !important; font-weight: 700 !important; color: #1a2a3a !important; margin-bottom: 5px !important; line-height: 1.4 !important; }\n#war-qsl-2026 .q-f .q-hint2 { display: block !important; font-size: 11.5px !important; font-weight: 400 !important; color: #6b7785 !important; margin-top: 2px !important; line-height: 1.45 !important; }\n#war-qsl-2026 .q-wrap { display: flex !important; align-items: stretch !important; }\n#war-qsl-2026 .q-post { background: #eef1f4 !important; border: 1px solid #dde2e7 !important; border-left: none !important; border-radius: 0 7px 7px 0 !important; color: #6b7785 !important; font-size: 13.5px !important; font-weight: 700 !important; display: flex !important; align-items: center !important; padding: 0 11px !important; flex-shrink: 0 !important; }\n#war-qsl-2026 .q-pre { background: #eef1f4 !important; border: 1px solid #dde2e7 !important; border-right: none !important; border-radius: 7px 0 0 7px !important; color: #6b7785 !important; font-size: 13.5px !important; font-weight: 700 !important; display: flex !important; align-items: center !important; padding: 0 11px !important; flex-shrink: 0 !important; }\n#war-qsl-2026 .q-f input, #war-qsl-2026 .q-f select {\n    flex: 1 !important; min-width: 0 !important; width: 100% !important; padding: 12px 13px !important;\n    border: 1px solid #dde2e7 !important; border-radius: 7px !important; font-size: 14.5px !important;\n    font-family: inherit !important; color: #1a2a3a !important; min-height: 46px !important; background: #fff !important;\n}\n#war-qsl-2026 .q-wrap input { border-radius: 7px 0 0 7px !important; }\n#war-qsl-2026 .q-wrap .q-pre + input { border-radius: 0 7px 7px 0 !important; }\n#war-qsl-2026 .q-full { grid-column: span 2 !important; }\n#war-qsl-2026 .q-q { padding: 16px 0 0 0 !important; }\n#war-qsl-2026 .q-qlabel { font-size: 14.5px !important; font-weight: 700 !important; color: #1a2a3a !important; margin: 0 0 4px 0 !important; line-height: 1.45 !important; }\n#war-qsl-2026 .q-help { font-size: 12.5px !important; color: #6b7785 !important; margin: 0 0 10px 0 !important; line-height: 1.55 !important; }\n#war-qsl-2026 .q-opt { display: block !important; position: relative !important; padding: 12px 14px 12px 42px !important; border: 1px solid #dde2e7 !important; border-radius: 7px !important; margin-bottom: 8px !important; cursor: pointer !important; font-size: 14px !important; color: #444 !important; line-height: 1.5 !important; background: #fff !important; min-height: 44px !important; }\n#war-qsl-2026 .q-opt:hover { border-color: #b9c2cb !important; background: #fbfcfd !important; }\n#war-qsl-2026 .q-opt input { position: absolute !important; left: 14px !important; top: 14px !important; width: 18px !important; height: 18px !important; margin: 0 !important; min-height: 0 !important; cursor: pointer !important; }\n#war-qsl-2026 .q-locked { background: #fff9f0 !important; border: 1px solid #f0dcc0 !important; border-left: 4px solid #D97706 !important; border-radius: 7px !important; padding: 13px 15px !important; font-size: 13px !important; color: #6d4a00 !important; line-height: 1.6 !important; margin-bottom: 16px !important; }\n#war-qsl-2026 .q-locked b { color: #8a5a00 !important; }\n\n#war-qsl-2026 .q-progress { position: sticky !important; bottom: 0 !important; background: #1a2a3a !important; padding: 14px 20px !important; z-index: 20 !important; box-shadow: 0 -4px 18px rgba(0,0,0,0.22) !important; }\n#war-qsl-2026 .q-pinner { max-width: 900px !important; margin: 0 auto !important; display: flex !important; align-items: center !important; gap: 12px !important; flex-wrap: wrap !important; }\n#war-qsl-2026 .q-ptext { color: rgba(255,255,255,0.9) !important; font-size: 13px !important; font-weight: 600 !important; flex: 1 !important; min-width: 150px !important; margin: 0 !important; }\n#war-qsl-2026 .q-ptext b { color: #c9a227 !important; }\n#war-qsl-2026 .q-go { background: #c9a227 !important; color: #1a2a3a !important; border: none !important; padding: 14px 24px !important; min-height: 48px !important; border-radius: 7px !important; font-size: 14.5px !important; font-weight: 800 !important; cursor: pointer !important; font-family: inherit !important; }\n#war-qsl-2026 .q-go:hover { background: #ddb832 !important; }\n#war-qsl-2026 .q-go[disabled] { background: #6b7785 !important; color: rgba(255,255,255,0.72) !important; cursor: not-allowed !important; }\n#war-qsl-2026 .q-clear { background: transparent !important; color: rgba(255,255,255,0.85) !important; border: 2px solid rgba(255,255,255,0.3) !important; padding: 12px 18px !important; min-height: 48px !important; border-radius: 7px !important; font-size: 13px !important; font-weight: 700 !important; cursor: pointer !important; font-family: inherit !important; }\n\n#war-qsl-2026 .q-result { display: none !important; background: linear-gradient(135deg, #0a1622 0%, #1a2a3a 100%) !important; padding: 52px 20px !important; }\n#war-qsl-2026 .q-result.on { display: block !important; }\n#war-qsl-2026 .q-panel { background: #fff !important; border-radius: 12px !important; padding: 24px 22px !important; margin-bottom: 22px !important; }\n#war-qsl-2026 .q-grid2 { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 18px !important; margin-bottom: 22px !important; }\n#war-qsl-2026 .q-grid2 .q-panel { margin-bottom: 0 !important; }\n#war-qsl-2026 .q-panel h3 { margin: 0 0 6px 0 !important; font-size: 19px !important; font-weight: 800 !important; color: #1a2a3a !important; line-height: 1.3 !important; }\n#war-qsl-2026 .q-panel .q-sub { margin: 0 0 16px 0 !important; font-size: 13px !important; color: #6b7785 !important; line-height: 1.6 !important; }\n#war-qsl-2026 .q-ask { border-left: 6px solid #c9a227 !important; }\n#war-qsl-2026 .q-askrow { display: flex !important; gap: 14px !important; padding: 12px 0 !important; border-bottom: 1px solid #eef1f4 !important; flex-wrap: wrap !important; }\n#war-qsl-2026 .q-askrow:last-child { border-bottom: none !important; }\n#war-qsl-2026 .q-askrow b { flex: 0 0 176px !important; font-size: 11px !important; font-weight: 800 !important; letter-spacing: 1px !important; text-transform: uppercase !important; color: #6b7785 !important; padding-top: 2px !important; }\n#war-qsl-2026 .q-askrow span { flex: 1 1 240px !important; font-size: 15px !important; color: #1a2a3a !important; line-height: 1.55 !important; font-weight: 600 !important; }\n\n#war-qsl-2026 .q-verdict { border-radius: 14px !important; padding: 30px 28px !important; margin-bottom: 22px !important; text-align: center !important; }\n#war-qsl-2026 .q-verdict.exposed { background: #7f1d1d !important; border: 2px solid #ef4444 !important; }\n#war-qsl-2026 .q-verdict.marginal { background: #fff !important; border-left: 8px solid #D97706 !important; }\n#war-qsl-2026 .q-verdict.ok { background: #fff !important; border-left: 8px solid #059669 !important; }\n#war-qsl-2026 .q-vtop { font-size: 13px !important; font-weight: 700 !important; margin: 0 0 14px 0 !important; }\n#war-qsl-2026 .q-verdict.exposed .q-vtop { color: #fecaca !important; }\n#war-qsl-2026 .q-verdict.marginal .q-vtop, #war-qsl-2026 .q-verdict.ok .q-vtop { color: #6b7785 !important; }\n#war-qsl-2026 .q-margin { font-size: 62px !important; font-weight: 800 !important; font-family: Georgia, serif !important; line-height: 1 !important; margin: 0 0 6px 0 !important; }\n#war-qsl-2026 .q-verdict.exposed .q-margin { color: #fff !important; }\n#war-qsl-2026 .q-verdict.marginal .q-margin { color: #B45309 !important; }\n#war-qsl-2026 .q-verdict.ok .q-margin { color: #047857 !important; }\n#war-qsl-2026 .q-munit { font-size: 13px !important; font-weight: 700 !important; letter-spacing: 1px !important; text-transform: uppercase !important; margin: 0 0 16px 0 !important; }\n#war-qsl-2026 .q-verdict.exposed .q-munit { color: rgba(255,255,255,0.75) !important; }\n#war-qsl-2026 .q-verdict.marginal .q-munit, #war-qsl-2026 .q-verdict.ok .q-munit { color: #6b7785 !important; }\n#war-qsl-2026 .q-vband { font-size: 25px !important; font-weight: 800 !important; margin: 0 0 12px 0 !important; line-height: 1.2 !important; }\n#war-qsl-2026 .q-verdict.exposed .q-vband { color: #fff !important; }\n#war-qsl-2026 .q-verdict.marginal .q-vband { color: #1a2a3a !important; }\n#war-qsl-2026 .q-verdict.ok .q-vband { color: #1a2a3a !important; }\n#war-qsl-2026 .q-vread { max-width: 660px !important; margin: 0 auto !important; font-size: 14.5px !important; line-height: 1.7 !important; text-align: left !important; }\n#war-qsl-2026 .q-verdict.exposed .q-vread { color: rgba(255,255,255,0.92) !important; }\n#war-qsl-2026 .q-verdict.marginal .q-vread, #war-qsl-2026 .q-verdict.ok .q-vread { color: #444 !important; }\n#war-qsl-2026 .q-workings { max-width: 660px !important; margin: 16px auto 0 auto !important; font-size: 12.5px !important; font-family: Georgia, serif !important; text-align: left !important; padding: 12px 14px !important; border-radius: 6px !important; }\n#war-qsl-2026 .q-verdict.exposed .q-workings { background: rgba(0,0,0,0.3) !important; color: rgba(255,255,255,0.85) !important; }\n#war-qsl-2026 .q-verdict.marginal .q-workings, #war-qsl-2026 .q-verdict.ok .q-workings { background: #f6f8fa !important; color: #444 !important; }\n\n#war-qsl-2026 .q-big { font-size: 30px !important; font-weight: 800 !important; color: #1a2a3a !important; line-height: 1.1 !important; margin: 0 0 4px 0 !important; font-family: Georgia, serif !important; }\n#war-qsl-2026 .q-big.neg { color: #B91C1C !important; }\n#war-qsl-2026 .q-note { border-radius: 8px !important; padding: 15px 17px !important; font-size: 13.5px !important; line-height: 1.65 !important; margin-top: 14px !important; }\n#war-qsl-2026 .q-note.warn { background: #fadbd8 !important; border-left: 4px solid #B91C1C !important; color: #6d2019 !important; }\n#war-qsl-2026 .q-note.caution { background: #fdf2d0 !important; border-left: 4px solid #D97706 !important; color: #6d4a00 !important; }\n#war-qsl-2026 .q-note.ok { background: #dcf0e4 !important; border-left: 4px solid #059669 !important; color: #14603c !important; }\n#war-qsl-2026 .q-note.info { background: #eef2f7 !important; border-left: 4px solid #475569 !important; color: #2f3c4d !important; }\n#war-qsl-2026 .q-grade { display: inline-flex !important; align-items: center !important; justify-content: center !important; width: 62px !important; height: 62px !important; border-radius: 50% !important; font-size: 30px !important; font-weight: 800 !important; font-family: Georgia, serif !important; margin-bottom: 12px !important; }\n#war-qsl-2026 .q-grade.gA { background: #dcf0e4 !important; color: #14603c !important; }\n#war-qsl-2026 .q-grade.gB { background: #e4f0dc !important; color: #3d6014 !important; }\n#war-qsl-2026 .q-grade.gC { background: #fdf2d0 !important; color: #8a6100 !important; }\n#war-qsl-2026 .q-grade.gD { background: #fadbd8 !important; color: #922b21 !important; }\n\n#war-qsl-2026 table.q-tbl { width: 100% !important; min-width: 620px !important; border-collapse: collapse !important; font-size: 13px !important; }\n#war-qsl-2026 table.q-tbl th { background: #1a2a3a !important; color: #fff !important; text-align: left !important; padding: 10px 12px !important; font-size: 11px !important; font-weight: 800 !important; letter-spacing: 0.5px !important; text-transform: uppercase !important; }\n#war-qsl-2026 table.q-tbl td { padding: 10px 12px !important; border-bottom: 1px solid #eef1f4 !important; vertical-align: top !important; color: #444 !important; line-height: 1.5 !important; }\n#war-qsl-2026 table.q-tbl td.num { text-align: right !important; font-family: Georgia, serif !important; white-space: nowrap !important; }\n#war-qsl-2026 table.q-tbl tr.bad td { background: #fdeceb !important; color: #922b21 !important; font-weight: 600 !important; }\n#war-qsl-2026 table.q-tbl tr.mid td { background: #fffaf1 !important; color: #8a5a00 !important; }\n#war-qsl-2026 table.q-tbl tr.good td { background: #f2faf5 !important; color: #14603c !important; }\n#war-qsl-2026 .q-scroll { overflow-x: auto !important; -webkit-overflow-scrolling: touch !important; }\n#war-qsl-2026 .q-hint { display: none !important; }\n@media (max-width: 768px) { #war-qsl-2026 .q-hint { display: block !important; font-size: 11.5px !important; font-weight: 700 !important; color: #6b7785 !important; margin: 0 0 8px 0 !important; } }\n\n#war-qsl-2026 .q-cfo { display: grid !important; grid-template-columns: repeat(3, 1fr) !important; gap: 14px !important; }\n#war-qsl-2026 .q-cfobox { background: #f6f8fa !important; border-radius: 8px !important; padding: 16px 17px !important; border-top: 4px solid #475569 !important; }\n#war-qsl-2026 .q-cfobox.one { border-top-color: #B91C1C !important; }\n#war-qsl-2026 .q-cfobox.two { border-top-color: #D97706 !important; }\n#war-qsl-2026 .q-cfobox.three { border-top-color: #059669 !important; }\n#war-qsl-2026 .q-cfobox h4 { margin: 0 0 8px 0 !important; font-size: 14px !important; font-weight: 800 !important; color: #1a2a3a !important; line-height: 1.35 !important; }\n#war-qsl-2026 .q-cfobox p { margin: 0 !important; font-size: 13px !important; color: #444 !important; line-height: 1.6 !important; }\n#war-qsl-2026 .q-quote { background: #1a2a3a !important; border-radius: 10px !important; padding: 20px 22px !important; margin-bottom: 18px !important; }\n#war-qsl-2026 .q-quote p { margin: 0 !important; color: #fff !important; font-size: 15.5px !important; font-style: italic !important; line-height: 1.6 !important; font-family: Georgia, serif !important; }\n#war-qsl-2026 .q-quote cite { display: block !important; margin-top: 10px !important; color: #c9a227 !important; font-size: 11.5px !important; font-style: normal !important; font-weight: 700 !important; letter-spacing: 1px !important; text-transform: uppercase !important; }\n\n#war-qsl-2026 .q-card { background: #f6f8fa !important; border: 1px dashed #c3ccd5 !important; border-radius: 8px !important; padding: 18px 20px !important; font-size: 13px !important; color: #333 !important; line-height: 1.7 !important; white-space: pre-wrap !important; font-family: Georgia, 'Times New Roman', serif !important; }\n#war-qsl-2026 .q-btnrow { display: flex !important; gap: 10px !important; flex-wrap: wrap !important; margin-top: 16px !important; }\n#war-qsl-2026 .q-btn { background: #1a2a3a !important; color: #fff !important; border: none !important; cursor: pointer !important; padding: 13px 20px !important; min-height: 44px !important; border-radius: 6px !important; font-size: 13px !important; font-weight: 700 !important; font-family: inherit !important; display: inline-flex !important; align-items: center !important; }\n#war-qsl-2026 .q-btn:hover { background: #2d4156 !important; }\n#war-qsl-2026 .q-btn.gold { background: #c9a227 !important; color: #1a2a3a !important; }\n#war-qsl-2026 .q-btn.ghost { background: transparent !important; color: #1a2a3a !important; border: 2px solid #c3ccd5 !important; }\n\n#war-qsl-2026 .q-next { background: #fff !important; padding: 50px 20px !important; }\n#war-qsl-2026 .q-next h3 { text-align: center !important; font-size: 28px !important; font-weight: 800 !important; color: #1a2a3a !important; margin: 0 0 10px 0 !important; }\n#war-qsl-2026 .q-next .q-sub { text-align: center !important; max-width: 660px !important; margin: 0 auto 32px auto !important; color: #6b7785 !important; font-size: 15px !important; line-height: 1.6 !important; }\n#war-qsl-2026 .q-grid3 { display: grid !important; grid-template-columns: repeat(3, 1fr) !important; gap: 18px !important; }\n#war-qsl-2026 .q-tile { border: 1px solid #e2e6ea !important; border-radius: 10px !important; padding: 22px 20px !important; background: #fbfcfd !important; }\n#war-qsl-2026 .q-tile h4 { margin: 0 0 8px 0 !important; font-size: 16px !important; font-weight: 700 !important; color: #1a2a3a !important; line-height: 1.35 !important; }\n#war-qsl-2026 .q-tile p { margin: 0 0 14px 0 !important; font-size: 13.5px !important; color: #555 !important; line-height: 1.6 !important; }\n#war-qsl-2026 .q-tile a { display: inline-block !important; background: #1a2a3a !important; color: #fff !important; padding: 11px 18px !important; min-height: 44px !important; border-radius: 6px !important; font-size: 12.5px !important; font-weight: 700 !important; line-height: 22px !important; }\n#war-qsl-2026 .q-tile a:hover { background: #c9a227 !important; color: #1a2a3a !important; }\n#war-qsl-2026 .q-cta { background: linear-gradient(135deg, #c9a227 0%, #ddb832 100%) !important; padding: 46px 20px !important; text-align: center !important; }\n#war-qsl-2026 .q-cta h3 { font-size: 27px !important; font-weight: 800 !important; color: #1a2a3a !important; margin: 0 0 10px 0 !important; }\n#war-qsl-2026 .q-cta p { font-size: 15.5px !important; color: #1a2a3a !important; opacity: 0.85 !important; margin: 0 0 24px 0 !important; }\n#war-qsl-2026 .q-ctarow { display: flex !important; justify-content: center !important; gap: 11px !important; flex-wrap: wrap !important; }\n#war-qsl-2026 .q-ctarow a { background: #1a2a3a !important; color: #fff !important; padding: 13px 22px !important; min-height: 44px !important; border-radius: 6px !important; font-size: 13px !important; font-weight: 700 !important; display: inline-flex !important; align-items: center !important; }\n#war-qsl-2026 .q-fine { background: #1a2a3a !important; padding: 24px 20px !important; }\n#war-qsl-2026 .q-fine p { max-width: 900px !important; margin: 0 auto !important; color: rgba(255,255,255,0.62) !important; font-size: 11.5px !important; line-height: 1.75 !important; }\n#war-qsl-2026 .q-manual { background: #fff9f0 !important; border-top: 4px solid #D97706 !important; padding: 40px 20px !important; }\n#war-qsl-2026 .q-manual h3 { font-size: 23px !important; font-weight: 800 !important; color: #1a2a3a !important; margin: 0 0 10px 0 !important; }\n\n@media print {\n    #war-qsl-2026 .q-band, #war-qsl-2026 .q-hero, #war-qsl-2026 .q-form,\n    #war-qsl-2026 .q-progress, #war-qsl-2026 .q-next, #war-qsl-2026 .q-cta,\n    #war-qsl-2026 .q-btnrow { display: none !important; }\n    #war-qsl-2026 .q-result { background: #fff !important; padding: 0 !important; }\n    #war-qsl-2026 .q-panel, #war-qsl-2026 .q-verdict { border: 1px solid #ccc !important; page-break-inside: avoid !important; }\n    #war-qsl-2026 .q-verdict.exposed { background: #fff !important; }\n    #war-qsl-2026 .q-verdict.exposed .q-margin, #war-qsl-2026 .q-verdict.exposed .q-vband { color: #922b21 !important; }\n    #war-qsl-2026 .q-verdict.exposed .q-vread, #war-qsl-2026 .q-verdict.exposed .q-vtop { color: #444 !important; }\n    #war-qsl-2026 .q-verdict.exposed .q-workings { background: #f6f8fa !important; color: #444 !important; }\n    #war-qsl-2026 .q-fine { background: #fff !important; }\n    #war-qsl-2026 .q-fine p { color: #666 !important; }\n    #war-qsl-2026 table.q-tbl { min-width: 0 !important; }\n}\n\n@media (max-width: 900px) {\n    #war-qsl-2026 .q-grid2 { grid-template-columns: 1fr !important; }\n    #war-qsl-2026 .q-grid3 { grid-template-columns: 1fr !important; max-width: 480px !important; margin: 0 auto !important; }\n    #war-qsl-2026 .q-cfo { grid-template-columns: 1fr !important; }\n}\n@media (max-width: 768px) {\n    #war-qsl-2026 .q-h1 { font-size: 31px !important; }\n    #war-qsl-2026 .q-hero { padding: 38px 18px 34px 18px !important; }\n    #war-qsl-2026 .q-form, #war-qsl-2026 .q-result, #war-qsl-2026 .q-next { padding: 34px 16px !important; }\n    #war-qsl-2026 .q-shead, #war-qsl-2026 .q-sbody { padding-left: 16px !important; padding-right: 16px !important; }\n    #war-qsl-2026 .q-fields { grid-template-columns: 1fr !important; }\n    #war-qsl-2026 .q-full { grid-column: span 1 !important; }\n    #war-qsl-2026 .q-panel { padding: 20px 17px !important; }\n    #war-qsl-2026 .q-verdict { padding: 22px 18px !important; }\n    #war-qsl-2026 .q-margin { font-size: 48px !important; }\n    #war-qsl-2026 .q-vband { font-size: 20px !important; }\n    #war-qsl-2026 .q-formula code { font-size: 14px !important; }\n}\n@media (max-width: 420px) {\n    #war-qsl-2026 .q-h1 { font-size: 27px !important; }\n    #war-qsl-2026 .q-margin { font-size: 40px !important; }\n    #war-qsl-2026 .q-big { font-size: 25px !important; }\n    #war-qsl-2026 .q-formula code { font-size: 12.5px !important; }\n}\n<\/style>\n\n<div class=\"q-band\">\n    <p>THE TEST THAT DOES NOT DEPEND ON PREDICTING THE FUTURE: <strong>if your data must stay secret for longer than it will take you to protect it, the exposure already exists.<\/strong><\/p>\n<\/div>\n\n<div class=\"q-hero\">\n    <div class=\"q-inner\">\n        <span class=\"q-eyebrow\">Quadrant Two \/\/ When Agents Rule<\/span>\n        <h1 class=\"q-h1\">Quantum Shelf Life<\/h1>\n        <p class=\"q-lede\">Enter how long one class of data must stay confidential and how long your migration will take. Get your protection margin in years, the latest year you can still start, and whether the exposure already exists.<\/p>\n        <div class=\"q-formula\">\n            <span>The test, Chapter 2<\/span>\n            <code>Protection margin = years until a capable quantum computer, minus the years your data must stay confidential, minus the years your migration will take<\/code>\n        <\/div>\n        <div class=\"q-facts\">\n            <span class=\"q-fact\"><b>1<\/b> data class per run<\/span>\n            <span class=\"q-fact\"><b>3<\/b> minutes<\/span>\n            <span class=\"q-fact\"><b>5<\/b> quantum dates tested<\/span>\n            <span class=\"q-fact\"><b>0<\/b> fields sent anywhere<\/span>\n        <\/div>\n        <div class=\"q-honest\">\n            <b>It does not ask you to predict when quantum computers arrive.<\/b> Chapter 2 records the CFO objection in full: a timeline nobody can predict, for a threat that might never materialise. A calculator that answers by making you pick a date has conceded that objection. So this one tests the margin across the whole plausible range, from 2030 to 2045, and separates the data that is exposed at every single date from the data whose answer genuinely depends on the date. The first group is immune to the timeline argument. That is the group to fund.<br><br>\n            <b>A negative margin is different from an ordinary risk.<\/b> Traffic harvested today cannot be recalled. Chapter 2 puts it plainly: there is no way to retroactively protect data that has already been captured. A negative margin cannot be closed by future effort, only limited.<br><br>\n            Nothing you enter is transmitted or stored. Everything is computed in your browser.\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"q-form\">\n<div class=\"q-inner\">\n\n    <!-- SECTION 1 -->\n    <div class=\"q-sec\">\n        <div class=\"q-shead s1\">\n            <div class=\"q-snum\">1<\/div>\n            <div class=\"q-stitle\">\n                <h2>The data<\/h2>\n                <p>One class at a time. Chapter 2 is explicit that different data types carry completely different quantum risk.<\/p>\n            <\/div>\n        <\/div>\n        <div class=\"q-sbody\">\n            <div class=\"q-locked\">\n                <b>Loaded with customer identity records as a starting point.<\/b> Pick a data class below and the confidentiality requirement fills in with an illustrative figure from Chapter 2&#8217;s risk profile. Replace it with your own retention obligation, which is the only figure that will survive legal review.\n            <\/div>\n            <div class=\"q-fields\">\n                <div class=\"q-f q-full\">\n                    <label for=\"q-class\">Data class\n                        <span class=\"q-hint2\">Selecting a class fills in an illustrative confidentiality period. Chapter 2&#8217;s risk profile runs from session keys, which carry minimal quantum risk, to classified information, which carries the highest.<\/span>\n                    <\/label>\n                    <select id=\"q-class\">\n                        <option value=\"0\">Choose to autofill, or enter your own below<\/option>\n                        <option value=\"1\">Session keys, a single transaction<\/option>\n                        <option value=\"3\">Operational telemetry<\/option>\n                        <option value=\"10\">Payment and card data<\/option>\n                        <option value=\"15\">Regulatory filings and audit evidence<\/option>\n                        <option value=\"20\">Board and corporate development material<\/option>\n                        <option value=\"25\">Intellectual property and trade secrets<\/option>\n                        <option value=\"30\">Contracts and legal privilege<\/option>\n                        <option value=\"40\" selected>Customer identity and know your customer records<\/option>\n                        <option value=\"45\">Employee and healthcare records<\/option>\n                        <option value=\"75\">Genetic information<\/option>\n                        <option value=\"50\">Government classified information<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-shelf\">Confidentiality requirement\n                        <span class=\"q-hint2\">The longest of: the regulatory retention period, the contractual obligation, or the lifetime of the person the data describes.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><input type=\"number\" id=\"q-shelf\" min=\"0\" max=\"150\" step=\"1\" value=\"40\" inputmode=\"numeric\"><span class=\"q-post\">years<\/span><\/div>\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-name\">Label for the output\n                        <span class=\"q-hint2\">Optional. Used only to name the result and the board paper.<\/span>\n                    <\/label>\n                    <input type=\"text\" id=\"q-name\" value=\"Customer identity records\">\n                <\/div>\n            <\/div>\n            <div class=\"q-q\">\n                <p class=\"q-qlabel\">Where does that confidentiality period come from?<\/p>\n                <p class=\"q-help\">The single most challenged number in this calculation. A figure taken from an actual obligation survives review. An estimate does not.<\/p>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-src\" value=\"oblig\"><span>A documented retention obligation, contract or statute we can cite.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-src\" value=\"est\"><span>An informed estimate by the data owner.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-src\" value=\"guess\"><span>A working assumption. Nobody has checked it against an obligation.<\/span><\/label>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- SECTION 2 -->\n    <div class=\"q-sec\">\n        <div class=\"q-shead s2\">\n            <div class=\"q-snum\">2<\/div>\n            <div class=\"q-stitle\">\n                <h2>Your migration<\/h2>\n                <p>How long it will take, and when you will actually begin. Both matter, and the second one more than people expect.<\/p>\n            <\/div>\n        <\/div>\n        <div class=\"q-sbody\">\n            <div class=\"q-fields\">\n                <div class=\"q-f\">\n                    <label for=\"q-mig\">Migration duration for this data class\n                        <span class=\"q-hint2\">End to end, including vendor dependencies and encrypting data at rest again. Chapter 13 works a five year programme.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><input type=\"number\" id=\"q-mig\" min=\"0\" max=\"40\" step=\"1\" value=\"6\" inputmode=\"numeric\"><span class=\"q-post\">years<\/span><\/div>\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-start\">Year the migration actually starts\n                        <span class=\"q-hint2\">Not the year the strategy was approved. The year funded work begins on this data class.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><input type=\"number\" id=\"q-start\" min=\"2020\" max=\"2060\" step=\"1\" value=\"2027\" inputmode=\"numeric\"><span class=\"q-post\">year<\/span><\/div>\n                <\/div>\n            <\/div>\n            <div class=\"q-q\">\n                <p class=\"q-qlabel\">Where does the migration duration come from?<\/p>\n                <p class=\"q-help\">A duration nobody has tested is the assumption that most often turns out optimistic, because it usually excludes the vendor who has not committed to a date.<\/p>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-migsrc\" value=\"done\"><span>We have completed a comparable cryptographic migration and this is based on it.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-migsrc\" value=\"plan\"><span>A costed plan exists with named owners and vendor dependencies identified.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-migsrc\" value=\"est\"><span>An estimate. No detailed plan yet.<\/span><\/label>\n            <\/div>\n            <div class=\"q-q\">\n                <p class=\"q-qlabel\">How complete is your cryptographic inventory for this data class?<\/p>\n                <p class=\"q-help\">You cannot migrate cryptography you have not found, and anything undiscovered extends the duration above.<\/p>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-inv\" value=\"full\"><span>Complete, including embedded systems, operational technology and third party dependencies.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-inv\" value=\"part\"><span>Covers most systems, with gaps we can name.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-inv\" value=\"none\"><span>Partial or not started. We do not know what protects this data everywhere.<\/span><\/label>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- SECTION 3 -->\n    <div class=\"q-sec\">\n        <div class=\"q-shead s3\">\n            <div class=\"q-snum\">3<\/div>\n            <div class=\"q-stitle\">\n                <h2>What may already be gone<\/h2>\n                <p>The part of this that cannot be fixed by any future migration.<\/p>\n            <\/div>\n        <\/div>\n        <div class=\"q-sbody\">\n            <div class=\"q-fields\">\n                <div class=\"q-f\">\n                    <label for=\"q-harvest\">Assume traffic may have been captured since\n                        <span class=\"q-hint2\">The year from which you assume an adversary could have been collecting. Storage is cheap and patience is free.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><input type=\"number\" id=\"q-harvest\" min=\"1990\" max=\"2060\" step=\"1\" value=\"2020\" inputmode=\"numeric\"><span class=\"q-post\">year<\/span><\/div>\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-exposure\">Estimated cost if this class becomes readable\n                        <span class=\"q-hint2\">Optional. Liability, remediation, notification, competitive loss. Used to frame materiality, not to predict.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><span class=\"q-pre\">USD<\/span><input type=\"number\" id=\"q-exposure\" min=\"0\" step=\"1000000\" value=\"0\" inputmode=\"numeric\"><\/div>\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-cost\">Estimated migration cost for this class\n                        <span class=\"q-hint2\">Optional. Used only to express the exposure against the cost of avoiding it.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><span class=\"q-pre\">USD<\/span><input type=\"number\" id=\"q-cost\" min=\"0\" step=\"100000\" value=\"0\" inputmode=\"numeric\"><\/div>\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-ccy\">Currency\n                        <span class=\"q-hint2\">Three letter code. Labels the amounts so a board paper cannot be read in the wrong currency.<\/span>\n                    <\/label>\n                    <input type=\"text\" id=\"q-ccy\" value=\"USD\" maxlength=\"4\">\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-owner\">Named owner accountable for this migration\n                        <span class=\"q-hint2\">A person, not a function. Chapter 2 is blunt that without sustained executive sponsorship these programmes fail.<\/span>\n                    <\/label>\n                    <input type=\"text\" id=\"q-owner\" placeholder=\"For example, M. Webb, CISO\">\n                <\/div>\n            <\/div>\n            <div class=\"q-q\">\n                <p class=\"q-qlabel\">Has this data class been in a known exfiltration or breach?<\/p>\n                <p class=\"q-help\">Chapter 2: data taken before migration cannot be encrypted again. If it is already gone, the damage is done and the investment is to prevent further damage.<\/p>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-breach\" value=\"no\"><span>No indication of exfiltration.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-breach\" value=\"susp\"><span>Suspected, or we could not rule it out.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-breach\" value=\"conf\"><span>Confirmed. Encrypted data of this class has left our control.<\/span><\/label>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- SECTION 4 -->\n    <div class=\"q-sec\">\n        <div class=\"q-shead s4\">\n            <div class=\"q-snum\">4<\/div>\n            <div class=\"q-stitle\">\n                <h2>The planning date<\/h2>\n                <p>Used for the headline only. The result is tested across the whole plausible range regardless of what you choose.<\/p>\n            <\/div>\n        <\/div>\n        <div class=\"q-sbody\">\n            <div class=\"q-fields\">\n                <div class=\"q-f\">\n                    <label for=\"q-crqc\">Your quantum planning date\n                        <span class=\"q-hint2\">A governance decision, not a physics prediction. Published assessments cluster between 2030 and the mid 2040s with wide uncertainty, and federal guidance sets 2035 for migrating federal systems.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><input type=\"number\" id=\"q-crqc\" min=\"2026\" max=\"2070\" step=\"1\" value=\"2032\" inputmode=\"numeric\"><span class=\"q-post\">year<\/span><\/div>\n                <\/div>\n                <div class=\"q-f\">\n                    <label for=\"q-now\">Current year\n                        <span class=\"q-hint2\">Everything is measured from here.<\/span>\n                    <\/label>\n                    <div class=\"q-wrap\"><input type=\"number\" id=\"q-now\" min=\"2024\" max=\"2060\" step=\"1\" value=\"2026\" inputmode=\"numeric\"><span class=\"q-post\">year<\/span><\/div>\n                <\/div>\n            <\/div>\n            <div class=\"q-q\">\n                <p class=\"q-qlabel\">Who approved the planning date?<\/p>\n                <p class=\"q-help\">Choosing a quantum date is a governance decision. A date nobody has approved is a date nobody will defend when it is challenged.<\/p>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-approve\" value=\"body\"><span>Approved by a named committee or executive and recorded.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-approve\" value=\"team\"><span>Chosen by the security or architecture team, not formally approved.<\/span><\/label>\n                <label class=\"q-opt\"><input type=\"radio\" name=\"q-approve\" value=\"none\"><span>Nobody has approved it. It is the figure we happen to use.<\/span><\/label>\n            <\/div>\n        <\/div>\n    <\/div>\n\n<\/div>\n<\/div>\n\n<div class=\"q-progress\">\n    <div class=\"q-pinner\">\n        <p class=\"q-ptext\" id=\"q-prog\"><b>Ready.<\/b><\/p>\n        <button type=\"button\" class=\"q-clear\" id=\"q-clearbtn\">Clear the form<\/button>\n        <button type=\"button\" class=\"q-go\" id=\"q-go\" disabled>Calculate Exposure<\/button>\n    <\/div>\n<\/div>\n\n<div class=\"q-result\" id=\"q-result\">\n<div class=\"q-wide\">\n\n    <div class=\"q-panel q-ask\">\n        <h3 id=\"q-askh\">The ask<\/h3>\n        <p class=\"q-sub\">The decision, the amount, the owner and what cannot be recovered, in the order a board wants them. Everything below is the evidence.<\/p>\n        <div id=\"q-asklist\"><\/div>\n    <\/div>\n\n    <div class=\"q-verdict ok\" id=\"q-verdict\">\n        <p class=\"q-vtop\" id=\"q-vtop\">Protection margin<\/p>\n        <p class=\"q-margin\" id=\"q-marginval\">0<\/p>\n        <p class=\"q-munit\" id=\"q-munit\">years<\/p>\n        <p class=\"q-vband\" id=\"q-vband\">Within tolerance<\/p>\n        <p class=\"q-vread\" id=\"q-vread\"><\/p>\n        <div class=\"q-workings\" id=\"q-workings\"><\/div>\n    <\/div>\n\n    <div class=\"q-panel\">\n        <h3>The answer that does not depend on the date<\/h3>\n        <p class=\"q-sub\">The same test run across every plausible quantum date. This is the panel that answers the objection that nobody can predict the timeline.<\/p>\n        <p class=\"q-hint\">Swipe the table sideways to see every column.<\/p>\n        <div class=\"q-scroll\">\n        <table class=\"q-tbl\">\n            <thead><tr><th>Quantum date<\/th><th>Years available<\/th><th>Years needed<\/th><th>Margin<\/th><th>Latest start<\/th><th>Position<\/th><\/tr><\/thead>\n            <tbody id=\"q-matrix\"><\/tbody>\n        <\/table>\n        <\/div>\n        <div class=\"q-note info\" id=\"q-matrixnote\"><\/div>\n    <\/div>\n\n    <div class=\"q-grid2\">\n        <div class=\"q-panel\">\n            <h3>The latest year you can still start<\/h3>\n            <p class=\"q-sub\">Exact, not estimated. Work back from the planning date through the migration and the confidentiality period.<\/p>\n            <p class=\"q-big\" id=\"q-latest\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:14px !important;\">latest defensible start year at your planning date<\/p>\n            <p class=\"q-big\" id=\"q-slip\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:0 !important;\">years of slack, or years already late<\/p>\n            <div class=\"q-note info\" id=\"q-latestnote\"><\/div>\n        <\/div>\n        <div class=\"q-panel\">\n            <h3>What cannot be recovered<\/h3>\n            <p class=\"q-sub\">The part of the exposure that no future migration closes.<\/p>\n            <p class=\"q-big neg\" id=\"q-captured\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:14px !important;\">years of traffic that may already be held<\/p>\n            <p class=\"q-big\" id=\"q-untilsafe\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:0 !important;\">year this class stops being sensitive<\/p>\n            <div class=\"q-note warn\" id=\"q-capturednote\"><\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"q-grid2\">\n        <div class=\"q-panel\">\n            <h3>What a CFO will attack, and by how much<\/h3>\n            <p class=\"q-sub\">The two inputs this tool already flags as most challenged, each solved exactly for the point at which the position clears.<\/p>\n            <p class=\"q-big\" id=\"q-maxshelf\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:14px !important;\">longest confidentiality period that still clears, against the figure you entered<\/p>\n            <p class=\"q-big\" id=\"q-maxmig\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:0 !important;\">longest migration that still clears, against the figure you entered<\/p>\n            <div class=\"q-note info\" id=\"q-bevnote\"><\/div>\n        <\/div>\n        <div class=\"q-panel\">\n            <h3>The price of another year<\/h3>\n            <p class=\"q-sub\">Chapter 2&#8217;s timeline paradox: a fixed deadline forces action, an uncertain one permits delay. This is what each further year of delay costs.<\/p>\n            <p class=\"q-hint\">Swipe the table sideways to see every column.<\/p>\n            <div class=\"q-scroll\">\n            <table class=\"q-tbl\" style=\"min-width:0 !important;\">\n                <thead><tr><th>Delay<\/th><th>Start<\/th><th>Margin<\/th><th>Position<\/th><\/tr><\/thead>\n                <tbody id=\"q-delay\"><\/tbody>\n            <\/table>\n            <\/div>\n            <div class=\"q-note caution\" id=\"q-delaynote\"><\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"q-panel\" id=\"q-cohpanel\">\n        <h3>Do your own answers agree with each other?<\/h3>\n        <p class=\"q-sub\">Individually plausible inputs can still contradict one another. These are the contradictions a reviewer finds first, and they are checked across fields rather than one at a time.<\/p>\n        <div id=\"q-coherence\"><\/div>\n    <\/div>\n\n    <div class=\"q-grid2\">\n        <div class=\"q-panel\">\n            <h3>Confidence in this reading<\/h3>\n            <p class=\"q-sub\">Graded on the four inputs that decide whether the number survives challenge, not on how comfortable the answer is.<\/p>\n            <div class=\"q-grade gA\" id=\"q-grade\">A<\/div>\n            <p class=\"q-big\" style=\"font-size:20px !important;\" id=\"q-gradelabel\">Evidenced<\/p>\n            <ul id=\"q-conflist\" style=\"margin:12px 0 0 0 !important;padding-left:20px !important;\"><\/ul>\n            <div class=\"q-note info\" id=\"q-confnote\"><\/div>\n        <\/div>\n        <div class=\"q-panel\">\n            <h3>The reading a sceptic would take<\/h3>\n            <p class=\"q-sub\">Earliest plausible quantum date, and every unproven duration extended. This is the number to present.<\/p>\n            <p class=\"q-big neg\" id=\"q-chal\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:14px !important;\">challenged protection margin, in years<\/p>\n            <p class=\"q-big\" id=\"q-chalstart\">0<\/p>\n            <p class=\"q-sub\" style=\"margin-bottom:0 !important;\">challenged latest start year<\/p>\n            <div class=\"q-note ok\" id=\"q-chalnote\"><\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"q-panel\">\n        <h3>The conversation Chapter 2 records<\/h3>\n        <p class=\"q-sub\">Marcus Webb had this exchange with his CFO and it went badly. These are the three reframes the chapter gives, populated with your own figures.<\/p>\n        <div class=\"q-quote\">\n            <p>You want me to approve twenty million dollars over five years to protect against computers that don&#8217;t exist yet, based on a timeline that nobody can predict, for a threat that might never materialize?<\/p>\n            <cite>When Agents Rule, Chapter 2<\/cite>\n        <\/div>\n        <div class=\"q-cfo\">\n            <div class=\"q-cfobox one\"><h4>The threat has already materialised<\/h4><p id=\"q-cfo1\"><\/p><\/div>\n            <div class=\"q-cfobox two\"><h4>The investment is not wasted in the best case<\/h4><p id=\"q-cfo2\"><\/p><\/div>\n            <div class=\"q-cfobox three\"><h4>The requirement is arriving anyway<\/h4><p id=\"q-cfo3\"><\/p><\/div>\n        <\/div>\n        <div class=\"q-note info\" id=\"q-material\"><\/div>\n    <\/div>\n\n    <div class=\"q-panel\">\n        <h3>Board paper<\/h3>\n        <p class=\"q-sub\">Written to be pasted into a board or risk committee paper without editing. Replace the bracketed fields before circulating.<\/p>\n        <div class=\"q-card\" id=\"q-cardtext\"><\/div>\n        <div class=\"q-btnrow\">\n            <button type=\"button\" class=\"q-btn gold\" id=\"q-copy\">Copy the paper<\/button>\n            <button type=\"button\" class=\"q-btn\" id=\"q-print\">Print or save as PDF<\/button>\n            <button type=\"button\" class=\"q-btn ghost\" id=\"q-again\">Back to the inputs<\/button>\n        <\/div>\n    <\/div>\n\n<\/div>\n<\/div>\n\n<div class=\"q-next\">\n<div class=\"q-wide\">\n    <h3>Turn the margin into a programme<\/h3>\n    <p class=\"q-sub\">One data class is a finding. These instruments take it across the estate.<\/p>\n    <div class=\"q-grid3\">\n        <div class=\"q-tile\">\n            <h4>Find what protects it<\/h4>\n            <p>The Cryptographic Census workbook inventories every cryptographic dependency, scores quantum exposure using this same margin arithmetic, and assigns each asset to a migration wave you can defend. It carries the shelf life test for every major data class in one sheet.<\/p>\n            <a href=\"https:\/\/www.opey.org\/opeyit\/?page_id=748#war-downloads-section\">Get the workbook<\/a>\n        <\/div>\n        <div class=\"q-tile\">\n            <h4>Fix the vendor constraint<\/h4>\n            <p>Your migration duration is capped by your slowest critical vendor. The Vendor Post Quantum Readiness Questionnaire extracts dated commitments rather than roadmaps, with a weighted scoring rubric and the red flags that override the score.<\/p>\n            <a href=\"https:\/\/www.opey.org\/opeyit\/?page_id=748#war-downloads-section\">Get the questionnaire<\/a>\n        <\/div>\n        <div class=\"q-tile\">\n            <h4>Understand the countdown<\/h4>\n            <p>Chapter 2 sets out the harvest now, decrypt later threat and the timeline paradox. Chapter 6 covers the architecture. Chapter 11 builds the quantum economics a CFO will fund, and Chapter 13 works the five year migration programme.<\/p>\n            <a href=\"https:\/\/www.amazon.com\/dp\/B0H85XZT25\">Get the book<\/a>\n        <\/div>\n    <\/div>\n<\/div>\n<\/div>\n\n<noscript>\n<div class=\"q-manual\">\n<div class=\"q-inner\">\n    <h3>Working this out by hand<\/h3>\n    <p style=\"font-size:14.5px !important;color:#444 !important;line-height:1.7 !important;\">Interactive calculation is unavailable in your browser. The test takes three subtractions.<\/p>\n    <ol style=\"font-size:14.5px !important;color:#444 !important;line-height:1.85 !important;\">\n        <li>Take the year you will use as your quantum planning date and subtract the current year. That is the years available.<\/li>\n        <li>Add the years this data must stay confidential to the years your migration will take, plus any years before the migration actually starts. That is the years needed.<\/li>\n        <li>Years available minus years needed is your protection margin. Negative means the exposure already exists.<\/li>\n        <li>Then do the part that matters most. Repeat step three for a quantum date of 2030, 2035, 2040 and 2045. If the margin is negative at every one of them, the exposure does not depend on predicting the timeline and the class should be funded now.<\/li>\n        <li>For the latest year you can still start: take the quantum planning date, subtract the migration duration, then subtract the confidentiality period. If that year is in the past, you are already late by that many years.<\/li>\n        <li>Finally, subtract the year from which you assume traffic may have been captured from the current year. That is the volume of traffic already held, and no future migration recovers it.<\/li>\n    <\/ol>\n    <p style=\"font-size:14.5px !important;color:#444 !important;line-height:1.7 !important;\"><b>Illustrative confidentiality periods from Chapter 2&#8217;s risk profile.<\/b> Session keys for a single transaction carry minimal quantum risk. Operational telemetry, around three years. Payment and card data, around ten. Regulatory filings, fifteen. Board material, twenty. Intellectual property and trade secrets, twenty five or more and Chapter 2 rates the risk extreme. Contracts and legal privilege, thirty. Customer identity records, forty. Employee and healthcare records, forty five, because medical information stays sensitive for a patient&#8217;s lifetime. Genetic information never loses sensitivity at all. Government classified, highest of all. Replace every one of these with your own obligation.<\/p>\n    <p style=\"font-size:14.5px !important;color:#444 !important;line-height:1.7 !important;\"><b>Why a negative margin is different.<\/b> Chapter 2 states that there is no way to retroactively protect data that has already been captured. A negative margin is not a risk to be managed down later. It is an exposure that is already fixed for the traffic already taken, and can only be limited for the traffic still to come.<\/p>\n<\/div>\n<\/div>\n<\/noscript>\n\n<div class=\"q-cta\">\n    <h3>The deadline was yesterday<\/h3>\n    <p>Every day of delay accumulates debt that compounds faster than you can repay it.<\/p>\n    <div class=\"q-ctarow\">\n        <a href=\"https:\/\/www.opey.org\/opeyit\/?page_id=748\">The book page<\/a>\n        <a href=\"https:\/\/www.opey.org\/opeyit\/?page_id=748#war-downloads-section\">Free toolkit<\/a>\n        <a href=\"https:\/\/www.amazon.com\/dp\/B0H85XZT25\">Get the book<\/a>\n        <a href=\"https:\/\/www.opey.org\/opeyit\/?page_id=14\">Advisory services<\/a>\n        <a href=\"https:\/\/www.opey.org\/opeyit\/?page_id=327\">When Clouds Fail<\/a>\n    <\/div>\n<\/div>\n\n<div class=\"q-fine\">\n    <p><b>About this calculator.<\/b> The shelf life test is set out in When Agents Rule by Steven Oppenheim, Chapter 2, and applied across the estate in the Cryptographic Census workbook in the companion toolkit. This tool is a modelling instrument, not an audit, a prediction or a benchmark, and it reflects the figures you enter. The confidentiality periods offered as presets are illustrative starting points drawn from the risk profile in Chapter 2 and are not legal advice on retention. Quantum planning dates are a governance judgement, not a forecast: published assessments vary widely and the tool deliberately reports across a range rather than asserting one date. Nothing you enter leaves your browser: there is no account, no transmission and no storage. This is not legal, technical, cryptographic or financial advice, and it is not a substitute for qualified counsel or your own cryptographic assessment.<\/p>\n<\/div>\n\n<\/div>\n<!-- End of #war-qsl-2026 -->\n\n<script>\n\/* =========================================================\n   QUANTUM SHELF LIFE CALCULATOR\n   No less than sign, no ampersand, no innerHTML, no template\n   literals, no arrow functions. See the notes at the top of\n   this file before editing.\n   ========================================================= *\/\n(function () {\n    var root = document.getElementById('war-qsl-2026');\n    if (!root) { return; }\n\n    var DATES = [2030, 2032, 2035, 2040, 2045];\n    var RADIOS = ['q-src', 'q-migsrc', 'q-inv', 'q-breach', 'q-approve'];\n\n    function el(id) { return document.getElementById(id); }\n    function mk(tag, cls, txt) {\n        var n = document.createElement(tag);\n        if (cls) { n.className = cls; }\n        if (txt !== undefined) { if (txt !== null) { n.textContent = txt; } }\n        return n;\n    }\n    function clear(node) { while (node.firstChild) { node.removeChild(node.firstChild); } }\n    function val(id) { var v = parseFloat(el(id).value); if (isNaN(v)) { return 0; } return v; }\n    function pick(name) {\n        var hit = root.querySelector('input[name=\"' + name + '\"]:checked');\n        if (!hit) { return null; }\n        return hit.value;\n    }\n    function group(s) {\n        var out = ''; var n = s.length; var i = 0;\n        for (i = 0; i !== n; i++) {\n            if (i > 0) { if ((n - i) % 3 === 0) { out = out + ','; } }\n            out = out + s.charAt(i);\n        }\n        return out;\n    }\n    function money(x) {\n        var neg = false;\n        if (x > -0.5) { neg = false; } else { neg = true; }\n        var s = Math.abs(x).toFixed(0);\n        var body = group(s);\n        if (neg) { return '(' + body + ')'; }\n        return body;\n    }\n    function signed(x) { if (x > 0) { return '+' + x; } return '' + x; }\n    \/* years or year. A board paper that reads \"1 years\" undermines everything above it. *\/\n    function yrs(n) { if (Math.abs(n) === 1) { return n + ' year'; } return n + ' years'; }\n\n    function ready() {\n        var i = 0;\n        for (i = 0; i !== RADIOS.length; i++) { if (pick(RADIOS[i]) === null) { return false; } }\n        if (val('q-shelf') >= 0) { return true; }\n        return false;\n    }\n\n    function refresh() {\n        var p = el('q-prog'); clear(p);\n        var missing = [];\n        var i = 0;\n        var labels = ['the source of the confidentiality period', 'the source of the migration duration',\n                      'the inventory question', 'the breach question', 'who approved the planning date'];\n        for (i = 0; i !== RADIOS.length; i++) { if (pick(RADIOS[i]) === null) { missing.push(labels[i]); } }\n        if (missing.length === 0) {\n            p.appendChild(mk('b', null, 'Ready.'));\n            p.appendChild(document.createTextNode(' Nothing is sent anywhere.'));\n            el('q-go').removeAttribute('disabled');\n        } else {\n            p.appendChild(mk('b', null, 'Still needed: '));\n            p.appendChild(document.createTextNode(missing.join(', ') + '.'));\n            el('q-go').setAttribute('disabled', 'disabled');\n        }\n    }\n\n    \/* the test, exactly as Chapter 2 sets it out *\/\n    function marginFor(crqc, now, shelf, mig, startYear) {\n        var delay = startYear - now;\n        if (delay > 0) { delay = delay; } else { delay = 0; }\n        var available = crqc - now;\n        var needed = shelf + mig + delay;\n        return { available: available, needed: needed, margin: available - needed, delay: delay };\n    }\n    function latestStart(crqc, shelf, mig) { return crqc - mig - shelf; }\n\n    function bandOf(m) {\n        if (m > 5) { return { cls: 'ok', label: 'Within tolerance', key: 'ok' }; }\n        if (m >= 0) { return { cls: 'marginal', label: 'Marginal', key: 'marginal' }; }\n        return { cls: 'exposed', label: 'Exposed today', key: 'exposed' };\n    }\n\n    function compute() {\n        var now = val('q-now');\n        var crqc = val('q-crqc');\n        var shelf = val('q-shelf');\n        var mig = val('q-mig');\n        var startYear = val('q-start');\n        var harvest = val('q-harvest');\n        var exposure = val('q-exposure');\n        var cost = val('q-cost');\n        var name = el('q-name').value;\n        if (name) { name = name.replace(\/\\s+\/g, ' '); }\n        if (!name) { name = 'This data class'; }\n        var ccy = el('q-ccy').value;\n        if (ccy) { ccy = ccy.replace(\/\\s+\/g, '').toUpperCase(); }\n        if (!ccy) { ccy = 'USD'; }\n        var owner = el('q-owner').value;\n        if (owner) { owner = owner.replace(\/\\s+\/g, ' '); }\n\n        var src = pick('q-src');\n        var migsrc = pick('q-migsrc');\n        var inv = pick('q-inv');\n        var breach = pick('q-breach');\n        var approve = pick('q-approve');\n\n        var r = marginFor(crqc, now, shelf, mig, startYear);\n        var band = bandOf(r.margin);\n        var ls = latestStart(crqc, shelf, mig);\n        var slack = ls - now;\n\n        \/* ---------- headline verdict ---------- *\/\n        el('q-verdict').className = 'q-verdict ' + band.cls;\n        el('q-vtop').textContent = 'Protection margin for ' + name + ', at a ' + crqc + ' planning date';\n        el('q-marginval').textContent = signed(r.margin);\n        el('q-munit').textContent = (Math.abs(r.margin) === 1) ? 'year' : 'years';\n        el('q-vband').textContent = band.label;\n        var vr = '';\n        if (band.key === 'exposed') {\n            vr = name + ' must stay confidential for ' + shelf + ' years and the migration will take ' + mig +\n                 ' years' + (r.delay > 0 ? ', starting ' + r.delay + ' years from now' : '') +\n                 '. That is ' + r.needed + ' years of protection needed against ' + r.available +\n                 ' available. The exposure is not a future risk to be managed down. For traffic already captured it is fixed, because there is no way to retroactively protect data that has already been taken. What remains open is the traffic still to come, and that is what a migration protects.';\n        } else {\n            if (band.key === 'marginal') {\n                vr = name + ' clears by ' + yrs(r.margin) +\n                     '. That is not comfort. A single slipped programme year, one undiscovered system, or one vendor who misses a date moves this class into exposure, and it cannot be moved back out. Treat a margin this thin as an exposure with a short reprieve.';\n            } else {\n                vr = name + ' clears by ' + r.margin + ' years on these assumptions, which is a defensible position. Protect it: the margin erodes every year you do not start, and it erodes faster if the inventory turns out to be incomplete. Run this again when the planning date or the retention obligation changes.';\n            }\n        }\n        el('q-vread').textContent = vr;\n        el('q-workings').textContent = 'Workings: ' + crqc + ' minus ' + now + ' gives ' +\n            yrs(r.available) + ' available. ' + yrs(shelf) + ' confidentiality plus ' + yrs(mig) +\n            ' migration' + (r.delay > 0 ? ' plus ' + yrs(r.delay) + ' before starting' : '') +\n            ' gives ' + yrs(r.needed) + ' needed. Margin ' + signed(r.margin) + '.';\n\n        \/* ---------- the date range matrix ---------- *\/\n        var tb = el('q-matrix'); clear(tb);\n        var negCount = 0;\n        var i = 0;\n        for (i = 0; i !== DATES.length; i++) {\n            var dr = marginFor(DATES[i], now, shelf, mig, startYear);\n            var db = bandOf(dr.margin);\n            if (dr.margin >= 0) { db = db; } else { negCount = negCount + 1; }\n            var tr = document.createElement('tr');\n            tr.className = (db.key === 'exposed') ? 'bad' : ((db.key === 'marginal') ? 'mid' : 'good');\n            tr.appendChild(mk('td', null, '' + DATES[i]));\n            tr.appendChild(mk('td', 'num', '' + dr.available));\n            tr.appendChild(mk('td', 'num', '' + dr.needed));\n            tr.appendChild(mk('td', 'num', signed(dr.margin)));\n            var dViable = (dr.available - shelf - mig) >= 0;\n            tr.appendChild(mk('td', 'num', dViable ? ('' + latestStart(DATES[i], shelf, mig)) : 'none'));\n            tr.appendChild(mk('td', null, db.label));\n            tb.appendChild(tr);\n        }\n        var mn = el('q-matrixnote');\n        if (negCount === DATES.length) {\n            mn.className = 'q-note warn';\n            mn.textContent = name + ' is exposed at every plausible quantum date, from 2030 through 2045. That removes the timeline argument entirely: this result does not depend on predicting when quantum computers arrive, because it is negative whichever date you choose. This is the class to fund now, and this is the single sentence to put in front of a CFO who says nobody can predict the timeline.';\n        } else {\n            if (negCount === 0) {\n                mn.className = 'q-note ok';\n                mn.textContent = name + ' clears at every date in the range. The timeline argument works in your favour here, so say so plainly rather than overstating the case. Spend the credibility you save on the classes that do not clear.';\n            } else {\n                mn.className = 'q-note caution';\n                mn.textContent = name + ' is exposed at ' + negCount + ' of the ' + DATES.length +\n                    ' dates tested and clears at the rest. This is a genuine judgement call about a date nobody can predict, and it should be presented as one. State which date your organisation has adopted, who approved it, and what happens to this class if that date proves optimistic.';\n            }\n        }\n\n        \/* ---------- latest start ----------\n           A start date is only meaningful if one exists. Where the confidentiality\n           period plus the migration already exceed the whole window, no start date\n           protects the class, and printing a year from decades ago is arithmetically\n           correct and rhetorically fatal in front of a board. *\/\n        var viable = (r.available - shelf - mig) >= 0;\n        var deficit = shelf + mig - r.available;\n        var lnote = el('q-latestnote');\n        if (!viable) {\n            el('q-latest').textContent = 'None';\n            el('q-latest').className = 'q-big neg';\n            el('q-slip').textContent = '-' + deficit;\n            el('q-slip').className = 'q-big neg';\n            lnote.className = 'q-note warn';\n            lnote.textContent = 'There is no start date that protects this class at a ' + crqc +\n                ' planning date. Even beginning today with no delay, the ' + yrs(shelf) +\n                ' of confidentiality plus ' + yrs(mig) + ' of migration exceed the ' +\n                yrs(r.available) + ' available by ' + yrs(deficit) +\n                '. Equivalently, the point at which a viable start existed passed ' + yrs(deficit) +\n                ' ago. Do not put that year in a board paper: on these inputs the arithmetic lands decades in the past and the argument is lost to the absurdity of the date. Present the deficit instead. The decision is about limiting future exposure, and about whether the retention obligation itself can be shortened.';\n        } else {\n        el('q-latest').textContent = '' + ls;\n        el('q-slip').textContent = signed(slack);\n        if (slack > 0) {\n            el('q-slip').className = 'q-big';\n            lnote.className = 'q-note ok';\n            lnote.textContent = 'You have ' + yrs(slack) +\n                ' before the latest defensible start. That is the number to put in a plan, because it converts an argument about quantum computing into a date on a roadmap. Note that it assumes the migration duration holds.';\n        } else {\n            if (slack === 0) {\n                el('q-slip').className = 'q-big neg';\n                lnote.className = 'q-note caution';\n                lnote.textContent = 'The latest defensible start is this year. There is no slack left at all. Any deferral past this budget cycle moves this class into exposure.';\n            }\n        }\n        }\n\n        \/* ---------- what cannot be recovered ---------- *\/\n        var captured = now - harvest;\n        if (captured > 0) { captured = captured; } else { captured = 0; }\n        el('q-captured').textContent = '' + captured;\n        el('q-untilsafe').textContent = '' + (now + shelf);\n        var cn = el('q-capturednote');\n        var breachText = '';\n        if (breach === 'conf') {\n            cn.className = 'q-note warn';\n            breachText = 'Exfiltration of this class is confirmed. Chapter 2 is unambiguous: data taken before migration cannot be encrypted again, so that damage is done and the investment is to prevent further damage. Say it in those words. A business case that admits what is already lost is believed on what it claims can still be saved.';\n        } else {\n            if (breach === 'susp') {\n                cn.className = 'q-note warn';\n                breachText = 'Exfiltration is suspected and cannot be ruled out. Treat the ' + captured +\n                    ' years of traffic as potentially held. The prudent position is to assume capture and plan accordingly, because the alternative is discovering it later and having no answer to why you assumed otherwise.';\n            } else {\n                cn.className = 'q-note caution';\n                breachText = 'No exfiltration is indicated, which is not the same as none having occurred. Harvesting leaves no trace at the victim: storage is cheap and the adversary simply waits. The ' + captured +\n                    ' years of traffic since ' + harvest + ' should be treated as potentially held regardless.';\n            }\n        }\n        cn.textContent = breachText + ' This class remains sensitive until ' + (now + shelf) +\n            ', so any of it read before that year still carries consequence.';\n\n        \/* ================= BREAKEVEN ON THE TWO MOST CHALLENGED INPUTS =================\n           Margin is available minus (shelf plus migration plus delay), so each\n           breakeven solves exactly. No estimation involved. *\/\n        var maxShelf = r.available - mig - r.delay;\n        var maxMig = r.available - shelf - r.delay;\n        el('q-maxshelf').textContent = (maxShelf > 0 ? maxShelf : 0) + ' yr';\n        el('q-maxmig').textContent = (maxMig > 0 ? maxMig : 0) + ' yr';\n        if (maxShelf >= shelf) { el('q-maxshelf').className = 'q-big'; } else { el('q-maxshelf').className = 'q-big neg'; }\n        if (maxMig >= mig) { el('q-maxmig').className = 'q-big'; } else { el('q-maxmig').className = 'q-big neg'; }\n        var bn = el('q-bevnote');\n        if (r.margin >= 0) {\n            bn.className = 'q-note ok';\n            bn.textContent = 'This position holds while the confidentiality period stays at or below ' +\n                (maxShelf > 0 ? maxShelf : 0) + ' years, against the ' + shelf +\n                ' you entered, and while the migration stays at or below ' + (maxMig > 0 ? maxMig : 0) +\n                ' years, against the ' + mig +\n                '. Quote both unprompted. A paper that states the point at which its own conclusion reverses is treated very differently from one that has to be asked.';\n        } else {\n            bn.className = 'q-note warn';\n            bn.textContent = 'The position cannot be rescued by tightening either input within a credible range. It would need the confidentiality period cut to ' +\n                (maxShelf > 0 ? maxShelf : 0) + ' years from ' + shelf + ', or the migration cut to ' +\n                (maxMig > 0 ? maxMig : 0) + ' years from ' + mig +\n                '. Neither is a number you can negotiate: the first is set by obligation and the second by the size of the estate. That is what makes this an exposure rather than a planning problem.';\n        }\n\n        \/* ================= THE PRICE OF DELAY ================= *\/\n        var DELAYS = [0, 1, 2, 3, 5];\n        var dtb = el('q-delay'); clear(dtb);\n        var tipYear = 0;\n        var tipFound = false;\n        for (i = 0; i !== DELAYS.length; i++) {\n            var ds = startYear + DELAYS[i];\n            var dres = marginFor(crqc, now, shelf, mig, ds);\n            var dband = bandOf(dres.margin);\n            if (dres.margin >= 0) { dband = dband; }\n            else { if (!tipFound) { tipFound = true; tipYear = ds; } }\n            var dtr = document.createElement('tr');\n            dtr.className = (dband.key === 'exposed') ? 'bad' : ((dband.key === 'marginal') ? 'mid' : 'good');\n            dtr.appendChild(mk('td', null, DELAYS[i] === 0 ? 'as planned' : ('plus ' + DELAYS[i] + ' yr')));\n            dtr.appendChild(mk('td', 'num', '' + ds));\n            dtr.appendChild(mk('td', 'num', signed(dres.margin)));\n            dtr.appendChild(mk('td', null, dband.label));\n            dtb.appendChild(dtr);\n        }\n        var dn2 = el('q-delaynote');\n        if (r.margin >= 0) {\n            if (tipFound) {\n                dn2.className = 'q-note warn';\n                dn2.textContent = 'A start in ' + tipYear +\n                    ' moves this class into exposure, and it cannot be moved back out. Every year of delay costs exactly one year of margin, and adds one more year of traffic that is permanently readable once a capable machine exists. That is the whole of the timeline paradox in one line: the absence of a fixed deadline is what makes the delay feel affordable.';\n            } else {\n                dn2.className = 'q-note ok';\n                dn2.textContent = 'This class still clears even with five years of further delay, which is a genuinely comfortable position and worth stating as such. Do not spend credibility arguing urgency here; spend it on the classes that tip.';\n            }\n        } else {\n            dn2.className = 'q-note warn';\n            dn2.textContent = 'The position is already negative, so delay does not change the decision, only the size of it. Each further year adds another year of traffic that no migration will ever recover. There is no version of this where waiting improves the outcome.';\n        }\n\n        \/* ---------- confidence grade ---------- *\/\n        var pass = []; var fail = [];\n        if (src === 'oblig') { pass.push('The confidentiality period comes from a documented obligation that can be cited.'); }\n        else {\n            if (src === 'est') { fail.push('The confidentiality period is an informed estimate rather than a cited obligation.'); }\n            else { fail.push('The confidentiality period is a working assumption nobody has checked against an obligation.'); }\n        }\n        if (migsrc === 'done') { pass.push('The migration duration is based on a comparable migration you have completed.'); }\n        else {\n            if (migsrc === 'plan') { pass.push('The migration duration comes from a costed plan with named owners and vendor dependencies identified.'); }\n            else { fail.push('The migration duration is an estimate with no detailed plan behind it.'); }\n        }\n        if (inv === 'full') { pass.push('The cryptographic inventory is complete, including embedded and third party dependencies.'); }\n        else {\n            if (inv === 'part') { fail.push('The cryptographic inventory has named gaps, so the migration duration is probably understated.'); }\n            else { fail.push('The cryptographic inventory is partial or not started, so the migration duration is unsupported.'); }\n        }\n        if (approve === 'body') { pass.push('The quantum planning date is approved by a named body and recorded.'); }\n        else {\n            if (approve === 'team') { fail.push('The planning date was chosen by a team rather than formally approved.'); }\n            else { fail.push('Nobody has approved the planning date, so nobody will defend it when it is challenged.'); }\n        }\n        var score = pass.length;\n        var grade = 'D'; var glabel = 'Not yet presentable';\n        if (score === 4) { grade = 'A'; glabel = 'Evidenced'; }\n        if (score === 3) { grade = 'B'; glabel = 'Defensible'; }\n        if (score === 2) { grade = 'C'; glabel = 'Challengeable'; }\n        el('q-grade').className = 'q-grade g' + grade;\n        el('q-grade').textContent = grade;\n        el('q-gradelabel').textContent = glabel;\n        var cl = el('q-conflist'); clear(cl);\n        for (i = 0; i !== pass.length; i++) {\n            var lp = mk('li', null, pass[i]);\n            lp.style.color = '#14603c'; lp.style.fontSize = '13px';\n            lp.style.lineHeight = '1.55'; lp.style.marginBottom = '6px';\n            cl.appendChild(lp);\n        }\n        for (i = 0; i !== fail.length; i++) {\n            var lf = mk('li', null, fail[i]);\n            lf.style.color = '#922b21'; lf.style.fontSize = '13px';\n            lf.style.lineHeight = '1.55'; lf.style.marginBottom = '6px';\n            cl.appendChild(lf);\n        }\n        var cfn = el('q-confnote');\n        if (grade === 'A') {\n            cfn.className = 'q-note ok';\n            cfn.textContent = 'All four tests pass. This reading can go to a risk committee as it stands.';\n        } else {\n            if (grade === 'B') {\n                cfn.className = 'q-note caution';\n                cfn.textContent = 'Three of four tests pass. Close the remaining one first; it is the line a reviewer will find.';\n            } else {\n                if (grade === 'C') {\n                    cfn.className = 'q-note caution';\n                    cfn.textContent = 'Two of four tests pass. Present the challenged reading rather than the headline, and name the assumptions you are still evidencing.';\n                } else {\n                    cfn.className = 'q-note warn';\n                    cfn.textContent = 'Fewer than two tests pass. This is an internal working figure and not a board paper. The cheapest next step is a cryptographic inventory, because it is the input that three of these four tests depend on.';\n                }\n            }\n        }\n\n        \/* ---------- the sceptic's reading ---------- *\/\n        var chalCrqc = DATES[0];\n        if (crqc > chalCrqc) { chalCrqc = chalCrqc; } else { chalCrqc = crqc; }\n        var migMult = 1;\n        if (inv === 'part') { migMult = 1.3; }\n        if (inv === 'none') { migMult = 1.6; }\n        if (migsrc === 'est') { if (migMult > 1.2) { migMult = migMult * 1.2; } else { migMult = 1.2; } }\n        var chalMig = Math.ceil(mig * migMult);\n        var chalR = marginFor(chalCrqc, now, shelf, chalMig, startYear);\n        var chalLs = latestStart(chalCrqc, shelf, chalMig);\n        el('q-chal').textContent = signed(chalR.margin);\n        var chalViableP = (chalR.available - shelf - chalMig) >= 0;\n        el('q-chalstart').textContent = chalViableP ? ('' + chalLs) : 'None';\n        if (chalR.margin >= 0) { el('q-chal').className = 'q-big'; } else { el('q-chal').className = 'q-big neg'; }\n        var chn = el('q-chalnote');\n        var adj = [];\n        if (chalCrqc !== crqc) { adj.push('planning date brought forward to ' + chalCrqc + ', the earliest in the published range'); }\n        if (chalMig !== mig) { adj.push('migration extended from ' + mig + ' to ' + chalMig + ' years, because the inventory or the plan does not yet support the figure'); }\n        if (adj.length === 0) {\n            chn.className = 'q-note ok';\n            chn.textContent = 'No adjustment was applied. Your planning date is already at the conservative end of the range and the migration duration is evidenced. The headline and the challenged reading are the same, which is the strongest position this tool can report.';\n        } else {\n            if (chalR.margin >= 0) {\n                chn.className = 'q-note ok';\n                chn.textContent = 'The position survives a sceptical reading, at ' + signed(chalR.margin) +\n                    ' years against the headline ' + signed(r.margin) + '. Adjustments: ' + adj.join('; ') + '.';\n            } else {\n                chn.className = 'q-note warn';\n                chn.textContent = 'The position does not survive a sceptical reading. It moves from ' + signed(r.margin) +\n                    ' to ' + signed(chalR.margin) + ' years. Present the challenged figure, not the headline. Adjustments: ' + adj.join('; ') + '.';\n            }\n        }\n\n        \/* ---------- the three reframes from Chapter 2 ---------- *\/\n        el('q-cfo1').textContent = 'We are not asking for money against a hypothetical. ' + captured +\n            ' years of traffic since ' + harvest + ' may already be held, and ' + name +\n            ' stays sensitive until ' + (now + shelf) +\n            '. Whatever has been taken cannot be encrypted again, so that damage is already done. The investment is to stop it growing.';\n        el('q-cfo2').textContent = 'If a capable quantum computer never arrives, or arrives in 2050, we will have upgraded cryptographic infrastructure that was going to need upgrading anyway: better performance, improved compliance evidence, and cryptographic agility so the next algorithm change is a configuration task rather than a programme. The spend is not wasted in the best case.';\n        var reg = 'Federal guidance sets 2035 for migrating federal systems, which flows into anyone in that supply chain through contract. Financial regulators already expect institutions to address quantum risk, insurers are beginning to ask, and other sectors follow.';\n        if (ls > now) { reg = reg + ' Our own latest defensible start is ' + ls + ', which is earlier than any of those deadlines.'; }\n        else { reg = reg + ' Our own latest defensible start has already passed, which means the regulatory date is no longer the binding constraint. Our data is.'; }\n        el('q-cfo3').textContent = reg;\n\n        \/* ---------- materiality ---------- *\/\n        var matn = el('q-material');\n        if (exposure > 0) {\n            if (cost > 0) {\n                var ratio = exposure \/ cost;\n                matn.className = 'q-note info';\n                matn.textContent = 'Materiality: an estimated ' + ccy + ' ' + money(exposure) + ' of exposure against ' +\n                    ccy + ' ' + money(cost) + ' to migrate this class, a ratio of ' + ratio.toFixed(1) +\n                    ' to one. Present it as a ratio rather than as two absolute numbers, because a ratio survives a challenge to either figure. Note that the exposure is a contingent loss and the migration cost is committed spend, so expect the committee to weight them differently, and say so before they do.';\n            } else {\n                matn.className = 'q-note info';\n                matn.textContent = 'Materiality: an estimated ' + ccy + ' ' + money(exposure) +\n                    ' of exposure, with no migration cost entered. Enter the cost and the tool expresses the exposure as a ratio, which is more durable in a committee than either figure alone.';\n            }\n        } else {\n            matn.className = 'q-note info';\n            matn.textContent = 'Materiality: no exposure figure was entered, so the case rests on the margin alone. That is a legitimate position for a risk paper, but an investment committee will ask what the exposure is worth. A defensible range beats a refusal to estimate.';\n        }\n\n        \/* ================= CROSS FIELD COHERENCE =================\n           Every input can be individually plausible and the set still\n           incoherent. These checks look across fields, which the four\n           confidence tests deliberately do not. *\/\n        var coh = [];\n\n        \/* 1. exposure against migration cost *\/\n        if (exposure > 0) {\n            if (cost > 0) {\n                var rat = exposure \/ cost;\n                if (rat > 100) {\n                    coh.push(['warn', 'The exposure is ' + rat.toFixed(0) +\n                        ' times the migration cost. A ratio that extreme is read by a reviewer as evidence that the cost is understated, not that the return is exceptional. Check whether the cost figure covers the whole estate for this class: identity data usually spans an identity provider, a public key infrastructure, hardware security modules, tokenisation, backups and at least one third party. If the cost really is that small, the decision does not need a board.']);\n                } else {\n                    if (rat > 0) {\n                        if (rat >= 1) {\n                            coh.push(['ok', 'Exposure of ' + ccy + ' ' + money(exposure) + ' against ' + ccy + ' ' +\n                                money(cost) + ' to migrate gives a ratio of ' + rat.toFixed(1) +\n                                ' to one, which is in the range a committee will engage with rather than dismiss.']);\n                        } else {\n                            coh.push(['warn', 'The migration costs more than the exposure it removes. On these figures the class fails an economic test, so the argument has to be obligation or duty of care rather than value at risk. Say which, explicitly.']);\n                        }\n                    }\n                }\n            } else {\n                coh.push(['caution', 'An exposure figure is entered with no migration cost. A committee cannot weigh one without the other, and the missing number is the one being asked for.']);\n            }\n        } else {\n            coh.push(['caution', 'No exposure figure is entered, so the paper asks for money without stating what the money avoids. A defensible range beats declining to estimate.']);\n        }\n\n        \/* 2. does the claimed duration survive the inventory answer *\/\n        if (inv === 'none') {\n            coh.push(['warn', 'Two of your answers contradict each other. You have said the cryptographic inventory is partial or not started, and also that the migration takes ' + yrs(mig) +\n                '. If you do not yet know everywhere this data is protected, the duration is an assertion rather than an estimate, and it is the kind that only ever moves one way. The cheapest next step is the inventory, because the duration, the latest start and the challenged reading all depend on it.']);\n        } else {\n            if (inv === 'part') {\n                coh.push(['caution', 'The inventory has named gaps, so the ' + yrs(mig) +\n                    ' duration covers only what you have found. Expect it to extend as the gaps close, and say so before a reviewer asks.']);\n            } else {\n                if (migsrc === 'est') {\n                    coh.push(['caution', 'The inventory is complete but the duration is still an estimate. That is a good position to improve cheaply: a costed plan against a complete inventory would move this to the strongest grade.']);\n                } else {\n                    coh.push(['ok', 'The duration rests on a complete inventory and either a costed plan or a comparable migration you have completed. That is the combination a reviewer cannot easily attack.']);\n                }\n            }\n        }\n\n        \/* 3. is the named owner board grade *\/\n        var ownerOK = false;\n        if (owner) { if (owner.length > 7) { if (owner.indexOf(' ') !== -1) { ownerOK = true; } } }\n        if (!owner) {\n            coh.push(['warn', 'No owner is named, so the paper commits nobody.']);\n        } else {\n            if (!ownerOK) {\n                coh.push(['warn', 'The owner is recorded as \"' + owner +\n                    '\", which will not survive a board pack. A governance record needs a full name and a role, because the point of naming an owner is that the name means something to a director reading it in six months.']);\n            } else {\n                coh.push(['ok', 'The owner is recorded as a full name and role, which is what a governance record requires.']);\n            }\n        }\n\n        \/* 4. does the size of the ask match the forum *\/\n        if (cost > 0) {\n            if (cost > 250000) {\n                coh.push(['ok', 'The amount is large enough to warrant the forum the paper is written for.']);\n            } else {\n                coh.push(['caution', 'The amount requested is ' + ccy + ' ' + money(cost) +\n                    '. A board does not convene for a figure that size. Either the cost is understated, or this is a delegated decision that needs a manager rather than a committee.']);\n            }\n        }\n\n        \/* 5. starting later than today, while already exposed *\/\n        if (r.delay > 0) {\n            if (0 > r.margin) {\n                coh.push(['caution', 'The class is already exposed and the start is still ' + yrs(r.delay) +\n                    ' away. Each of those years is irrecoverable traffic. If the delay is a funding cycle, say so; if it is sequencing behind another programme, name that programme, because a reviewer will ask what outranks this.']);\n            }\n        }\n\n        var cohHost = el('q-coherence'); clear(cohHost);\n        for (i = 0; i !== coh.length; i++) {\n            cohHost.appendChild(mk('div', 'q-note ' + coh[i][0], coh[i][1]));\n        }\n\n        \/* ---------- the ask ---------- *\/\n        var askList = el('q-asklist'); clear(askList);\n        var decision = '';\n        if (band.key === 'exposed') {\n            if (negCount === DATES.length) {\n                decision = 'Fund the migration of ' + name + ' in this budget cycle. It is exposed at every plausible quantum date, so the decision does not turn on the timeline.';\n            } else {\n                decision = 'Fund the migration of ' + name + ' in this budget cycle. It is exposed at the planning date this organisation has adopted.';\n            }\n        } else {\n            if (band.key === 'marginal') {\n                decision = 'Schedule the migration of ' + name + ' with a funded start no later than ' + ls +\n                           '. The margin is ' + yrs(r.margin) + ' and will not survive a slip.';\n            } else {\n                decision = 'Note ' + name + ' as clearing on current assumptions, and test it again when the retention obligation or the planning date changes. No funding requested for this class.';\n            }\n        }\n        var amount = (cost > 0) ? (ccy + ' ' + money(cost) + ' for this data class.') : 'No cost entered for this class, which an investment committee will ask for.';\n        var ownerLine = owner ? (owner + ', accountable for this migration and for reporting the margin each quarter.')\n                              : 'NOT NAMED. Chapter 2 is blunt that without sustained executive sponsorship these programmes lose funding and fail. Until this is a person, it is an analysis and not a commitment.';\n        var irrecoverable = yrs(captured) + ' of traffic since ' + harvest +\n            ' may already be held and cannot be recovered by any migration.';\n        if (breach === 'conf') { irrecoverable = 'Confirmed exfiltration. ' + irrecoverable; }\n        var askRows = [\n            ['Decision requested', decision],\n            ['Amount requested', amount],\n            ['Margin', signed(r.margin) + ' years at a ' + crqc + ' planning date, ' + signed(chalR.margin) +\n                       ' years on the challenged reading. Exposed at ' + negCount + ' of ' + DATES.length + ' plausible dates.'],\n            ['Latest defensible start', (!viable)\n                ? ('None exists at a ' + crqc + ' planning date. The confidentiality requirement plus the migration exceed the available window by ' + yrs(deficit) + '.')\n                : ((slack > 0) ? (ls + ', which is ' + yrs(slack) + ' away.')\n                               : (ls + ', which has already passed.'))],\n            ['Confidence', grade + ', ' + glabel.toLowerCase() + '. ' + score + ' of 4 evidence tests pass.'],\n            ['Accountable owner', ownerLine],\n            ['Cannot be recovered', irrecoverable]\n        ];\n        for (i = 0; i !== askRows.length; i++) {\n            var arow = mk('div', 'q-askrow');\n            arow.appendChild(mk('b', null, askRows[i][0]));\n            arow.appendChild(mk('span', null, askRows[i][1]));\n            askList.appendChild(arow);\n        }\n        el('q-askh').textContent = 'The ask, for ' + name;\n\n        \/* ---------- board paper ---------- *\/\n        var lines = [];\n        lines.push('QUANTUM SHELF LIFE ASSESSMENT');\n        lines.push('Data class: ' + name);\n        lines.push('Prepared [DATE] by [NAME, ROLE]. Method: the shelf life test from When Agents Rule, Chapter 2.');\n        lines.push('All amounts in ' + ccy + '. All periods in years.');\n        lines.push('');\n        lines.push('THE ASK.');\n        for (i = 0; i !== askRows.length; i++) { lines.push('  ' + askRows[i][0] + ': ' + askRows[i][1]); }\n        lines.push('');\n        lines.push('THE TEST. ' + crqc + ' planning date minus ' + now + ' gives ' + yrs(r.available) +\n                   ' available. ' + yrs(shelf) + ' confidentiality plus ' + yrs(mig) + ' migration' +\n                   (r.delay > 0 ? ' plus ' + yrs(r.delay) + ' before starting' : '') + ' gives ' +\n                   yrs(r.needed) + ' needed. Protection margin ' + signed(r.margin) +\n                   '. Position: ' + band.label + '.');\n        lines.push('');\n        lines.push('ACROSS THE PLAUSIBLE RANGE. The test does not rest on one date.');\n        for (i = 0; i !== DATES.length; i++) {\n            var dd = marginFor(DATES[i], now, shelf, mig, startYear);\n            var dv = (dd.available - shelf - mig) >= 0;\n            lines.push('  ' + DATES[i] + ': margin ' + signed(dd.margin) + ', latest start ' +\n                       (dv ? ('' + latestStart(DATES[i], shelf, mig)) : 'none exists') +\n                       ', ' + bandOf(dd.margin).label + '.');\n        }\n        if (negCount === DATES.length) {\n            lines.push('  Exposed at every date tested. The result does not depend on predicting the timeline.');\n        }\n        lines.push('');\n        if (r.margin >= 0) {\n            lines.push('BREAKEVEN ON THE CHALLENGED INPUTS. This position holds while the confidentiality period stays at or below ' +\n                       yrs(maxShelf > 0 ? maxShelf : 0) + ' (entered: ' + shelf +\n                       ') and the migration stays at or below ' + yrs(maxMig > 0 ? maxMig : 0) +\n                       ' (entered: ' + mig + ').');\n        } else {\n            lines.push('BREAKEVEN ON THE CHALLENGED INPUTS. None available. The position cannot be rescued by tightening either input: the confidentiality period would have to fall below ' +\n                       yrs(maxShelf > 0 ? maxShelf : 0) + ' against ' + yrs(shelf) +\n                       ' entered, and the migration below ' + yrs(maxMig > 0 ? maxMig : 0) + ' against ' + yrs(mig) +\n                       '. The first is set by obligation and the second by the size of the estate, which is what makes this an exposure rather than a planning problem.');\n        }\n        lines.push('');\n        lines.push('THE PRICE OF DELAY.');\n        for (i = 0; i !== DELAYS.length; i++) {\n            var pd = marginFor(crqc, now, shelf, mig, startYear + DELAYS[i]);\n            lines.push('  Start ' + (startYear + DELAYS[i]) + ': margin ' + signed(pd.margin) +\n                       ', ' + bandOf(pd.margin).label + '.');\n        }\n        if (r.margin >= 0) {\n            if (tipFound) { lines.push('  A start in ' + tipYear + ' moves this class into exposure and it cannot be moved back out.'); }\n        } else {\n            lines.push('  Already exposed at the planned start, so delay changes the size of the exposure rather than the decision. Each further year adds another year of traffic no migration recovers.');\n        }\n        lines.push('');\n        var chalViable = (chalR.available - shelf - chalMig) >= 0;\n        lines.push('CHALLENGED READING. ' + signed(chalR.margin) + ' years, latest start ' +\n                   (chalViable ? ('' + chalLs) : 'none exists') + '.');\n        if (adj.length > 0) { lines.push('  Adjustments: ' + adj.join('; ') + '.'); }\n        else { lines.push('  No adjustment applied; headline and challenged readings are identical.'); }\n        lines.push('');\n        lines.push('COHERENCE CHECKS. Whether the inputs agree with one another.');\n        for (i = 0; i !== coh.length; i++) {\n            var tag = 'NOTE';\n            if (coh[i][0] === 'warn') { tag = 'CONTRADICTION'; }\n            if (coh[i][0] === 'caution') { tag = 'WATCH'; }\n            if (coh[i][0] === 'ok') { tag = 'SOUND'; }\n            lines.push('  ' + tag + ': ' + coh[i][1]);\n        }\n        lines.push('');\n        lines.push('CONFIDENCE. Grade ' + grade + ', ' + glabel + '. ' + score + ' of 4 evidence tests pass.');\n        for (i = 0; i !== fail.length; i++) { lines.push('  Outstanding: ' + fail[i]); }\n        lines.push('');\n        lines.push('WHAT CANNOT BE RECOVERED. ' + irrecoverable + ' This class remains sensitive until ' +\n                   (now + shelf) + '.');\n        lines.push('');\n        lines.push('BASIS AND LIMITS. A modelling instrument applying the Chapter 2 shelf life test to figures supplied by the preparer. Not an audit, a prediction or a benchmark. Quantum planning dates are a governance judgement and published assessments vary widely, which is why the assessment is reported across a range rather than at a single date. Preset confidentiality periods are illustrative and are not legal advice on retention. Not cryptographic, legal or financial advice.');\n        el('q-cardtext').textContent = lines.join('\\n');\n\n        var res = el('q-result');\n        res.className = 'q-result on';\n        res.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n\n    \/* selecting a data class autofills an illustrative confidentiality period *\/\n    el('q-class').addEventListener('change', function () {\n        var v = parseFloat(el('q-class').value);\n        if (isNaN(v)) { return; }\n        if (v > 0) {\n            el('q-shelf').value = '' + v;\n            var opt = el('q-class').options[el('q-class').selectedIndex];\n            if (opt) { el('q-name').value = opt.textContent; }\n        }\n        refresh();\n    });\n\n    var inputs = root.querySelectorAll('input, select');\n    var k = 0;\n    for (k = 0; k !== inputs.length; k++) {\n        inputs[k].addEventListener('change', refresh);\n        inputs[k].addEventListener('input', refresh);\n    }\n    el('q-go').addEventListener('click', compute);\n    el('q-print').addEventListener('click', function () { window.print(); });\n    el('q-again').addEventListener('click', function () {\n        el('q-result').className = 'q-result';\n        root.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n    el('q-clearbtn').addEventListener('click', function () {\n        var j = 0;\n        var rs = root.querySelectorAll('input[type=\"radio\"]');\n        for (j = 0; j !== rs.length; j++) { rs[j].checked = false; }\n        el('q-shelf').value = '0'; el('q-mig').value = '0';\n        el('q-name').value = ''; el('q-owner').value = '';\n        el('q-exposure').value = '0'; el('q-cost').value = '0'; el('q-ccy').value = 'USD';\n        el('q-class').selectedIndex = 0;\n        el('q-result').className = 'q-result';\n        refresh();\n        root.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n    el('q-copy').addEventListener('click', function () {\n        var txt = el('q-cardtext').innerText;\n        var btn = el('q-copy');\n        function done(ok) {\n            btn.textContent = ok ? 'Copied' : 'Select the text above to copy';\n            window.setTimeout(function () { btn.textContent = 'Copy the paper'; }, 2600);\n        }\n        if (navigator.clipboard) {\n            navigator.clipboard.writeText(txt).then(function () { done(true); }, function () { done(false); });\n        } else {\n            var ta = document.createElement('textarea');\n            ta.value = txt;\n            document.body.appendChild(ta);\n            ta.select();\n            var ok = false;\n            try { ok = document.execCommand('copy'); } catch (e) { ok = false; }\n            document.body.removeChild(ta);\n            done(ok);\n        }\n    });\n\n    refresh();\n}());\n<\/script>\n\n\n\n<div id=\"elemID031021\" style=\"line-height:16px;text-align:center;z-index:100000;\"><a title=\"wix guests ip\" href=\"https:\/\/www.tracemyip.org\/pv1-3-36447-2\"><img decoding=\"async\" src=\"\/\/s3.tracemyip.org\/vLg\/1217\/4684NR-IPIB\/57003\/9\/njsUrl\/\" alt=\"Wix guests ip\" referrerpolicy=\"no-referrer-when-downgrade\" style=\"border:0px;\"><\/a><div><a href=\"https:\/\/www.tracemyip.org\/pv1-3-36447-2\">ip traffic<\/a><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>THE TEST THAT DOES NOT DEPEND ON PREDICTING THE FUTURE: if your data must stay secret for longer than it will take you to protect it, the exposure already exists. Quadrant Two \/\/ When Agents Rule Quantum Shelf Life Enter how long one class of data must stay confidential and how long your migration will [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-836","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=\/wp\/v2\/pages\/836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=836"}],"version-history":[{"count":4,"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=\/wp\/v2\/pages\/836\/revisions"}],"predecessor-version":[{"id":856,"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=\/wp\/v2\/pages\/836\/revisions\/856"}],"wp:attachment":[{"href":"https:\/\/www.opey.org\/opeyit\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}