From 57b05d9f2be0cf4661642345094c6f07e91796bd Mon Sep 17 00:00:00 2001 From: krisf Date: Fri, 9 Oct 2026 17:15:09 -0400 Subject: [PATCH] audit: math-fix seventh-pass re-verification (all gates fresh, OFFLAN-OK 21:14Z) --- MATH-FIX-REPORT.md | 22 ++++++++++++++++++++++ audit/bilingual-geo-check.json | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/MATH-FIX-REPORT.md b/MATH-FIX-REPORT.md index 4928fea..63c4922 100644 --- a/MATH-FIX-REPORT.md +++ b/MATH-FIX-REPORT.md @@ -220,3 +220,25 @@ Queue gate: `git status --porcelain` empty at start, HEAD `d6a7cb6` == `origin/m Harness note: Playwright TMPDIR under `.hermes/cache/scratch` was read-only this session; capture ran with `TMPDIR=/home/ubuntu/projects/retire-planner/.pwtmp` (no site impact). No code change required — plan executed end-to-end; commit `0839826` at `origin/main`. Final: **MATH_FIX_DONE**. + +--- + +## Re-verification (seventh DSH pass, 2026-10-09 21:14 UTC, post-completion) + +Queue gate: `git status --porcelain` empty at start, HEAD `920abe7` == `origin/main` (post-fetch), no `.git/index.lock`, no job in flight → proceed (not `DSH_QUEUE_BUSY`). Fix 1–4 re-audited in HEAD by grep: GIS `a >= 65 ? gis(…) : 0` at the three `solve()` sites (engine.js:249/260/265) + merge per-partner ≥65 gates (:376–380) + `if (yr < 65) gisSum = 0;` (:382, Service Canada source comment :88–91); clawback `oasGross > 0 ? Math.min(clawback(…), oasGross) : 0` at :248/:259 + split-solver parity :366–367; `row.mixed` :390 + depletion guard `!row.mixed` :395; `fillDefaults` clamp `retireAge < age+1` :188; quiz slider `min: 40` app.js:211 + `#wi-ret min="40"` index.html:86; `t.mixedNote` EN/FR i18n.js:251/512 + `#yr-mixed-note` index.html:95; FIRE hint EN/FR i18n.js:96/357. All acceptance checks re-executed fresh in this pass: + +| Check | Fresh output (this pass) | +|---|---| +| `tests/engine.test.js` | `RESULT: 61 pass, 0 fail` (incl. stale 52y/retire-40 clamp → first draw 53) | +| `tests/i18n.test.js` | `I18N-OK all i18n checks passed (50)` (incl. `q.retire.hint` FIRE EN+FR) | +| `tests/ui.smoke.js` | `SMOKE-OK all ui smoke checks passed (146)` (incl. † mixed-row fixture, `wi-ret min 40`) | +| `tests/ps-pension.test.js` / `ps-auto-service.test.js` | `70 pass, 0 fail` / `21 pass, 0 fail` | +| `passes3.js` rerun (live engine) | exit 0, `conservation: OK` ×3 → `audit/math-fix/passes3-pass7.log`. PASS 1: rows 55–64 OASnet $0 / GIS $0 (plan evidence: −$3,501 @55, $12,916 @56), first GIS row 65 ($12,567, OASnet $9,150), depletion 56 (honest); PASS 2 depletion 82, GIS only 65+; PASS 3 FIRE: first draw 40 (Withdraw $62,837, CPP/OAS/GIS $0), max total $493,710 @39 = hand-math 350000×1.035¹⁰ ✓ | +| `scripts/deploy.sh` | `DEPLOY-OK` | +| Origin byte-check (full, all tracked files) | `FILELIST-MATCH` + **21/21 MD5 match** (local `site/` == `git cat-file origin/main:` blob == deployed webroot `/mnt/better/appdata/retireapp`); the 13 `site/vision/*.jpeg` are intentionally gitignored generated assets (deployed, not in origin) | +| Live recapture (`mathfix_capture.py after`, retire.krisforbes.ca) | couple 52/52 ret 55 spend 93k CPP 60 (40 draw rows 55–94): **0** negative-OAS rows, **0** GIS>0 rows <65, **0** OAS≠0 rows <65, first GIS row 65; rows 58–64: Total $0 / OAS $0 / GIS $0, Withdraw $49K@$58 then $0, Unfunded $47K–$93K — **0 growing-Total-with-Withdraw rows** (post-depletion honest $0); `wiRetMin: "40"`; `noteShown: false` — correct, symmetric couple has no mixed rows (Deviation 2; † + legend proven by smoke fixture + engine §16). FIRE 30/BC/ret 40: `fire_first_draw_age: "40"`, row 40 Withdraw $63K / OAS $0 / GIS $0, **0** pre-65 GIS/OAS violations. Mobile 390: slider `min=40 value=40`, `sliderRight 367 < vw 390` (no clip), value chip [25, 145], FIRE hint present, `svAfter40: "40 years"`. Fresh PNGs 21:14Z: `after-couple-table.png` 1280×900, `after-fire-table.png` 1280×900, `after-fire-step-390.png` 1170×2532 | +| Off-LAN (Midhurst `trouble@100.96.20.61`) | `OFFLAN-OK`, `"all_ok": true`, `checked_at 2026-10-09T21:14:30Z` → `audit/bilingual-geo-check.json` | + +Harness notes: Playwright run with `TMPDIR=/home/ubuntu/projects/retire-planner/.pwtmp` (harness TMPDIR read-only; no site impact); ssh byte-check loop needs `-n` (plain ssh eats the loop's stdin — first run under-counted, re-run 21/21). + +No code change required — plan executed end-to-end; commit `0839826` at `origin/main`. Final: **MATH_FIX_DONE**. diff --git a/audit/bilingual-geo-check.json b/audit/bilingual-geo-check.json index 4b5b719..bb72d04 100644 --- a/audit/bilingual-geo-check.json +++ b/audit/bilingual-geo-check.json @@ -5,7 +5,7 @@ "has_i18n_script": true, "i18n_js_fr_strings": true, "i18n_js_size": 39689, - "checked_at": "2026-10-09T21:11:15Z", + "checked_at": "2026-10-09T21:14:30Z", "vantage": "trouble@100.96.20.61 (Midhurst, off-LAN)", "all_ok": true } \ No newline at end of file