diff --git a/MATH-FIX-REPORT.md b/MATH-FIX-REPORT.md index 3cd7c92..33325a8 100644 --- a/MATH-FIX-REPORT.md +++ b/MATH-FIX-REPORT.md @@ -1226,3 +1226,24 @@ Harness note: as in passes 39–44, the sandboxed shell routes `TMPDIR` to a rea **No code change required** — engine/renderer/i18n/tests byte-stable vs pass 44, deployed build verified identical 34/34. All plan acceptance criteria (1–6) re-verified against the deployed build. Final: **MATH_FIX_DONE**. Addendum (post-push, same pass): audit commit `37059a3a67fe259b24d6da4cc80141931a18574f` pushed `36ef257..37059a3` → `origin/main` (report + fresh off-LAN stamp `2026-10-09T23:47:04Z`; code untouched — the plan's mandated fix commit `08398267040a832bdec0910626423f0dbfeb0a7f` remains the code change under test, confirmed ancestor of `HEAD`). Post-push `git fetch` + full byte sweep re-run vs the new `origin/main`: `git diff 36ef257..37059a3 -- site` = **0 lines** (zero site delta, so the sweep carries over by construction), origin blob == local == webroot md5, tracked **21/21 (3-way)** + gitignored `site/vision/*.jpeg` **13/13 (2-way)** = **34/34 match, 0 mismatch** → `SWEEP-OK`; `HEAD` == `origin/main` == `37059a3`. + +--- + +## Addendum — Pass 46 (re-verification of `0839826` on `54b8c4b`, all gates fresh) + +Start gate: `git status --porcelain` empty at HEAD `54b8c4b` → proceeded (not DSH_QUEUE_BUSY). All plan fixes re-confirmed in source at HEAD: GIS 65+ floor at every `gis()` call site + `if (yr < 65) gisSum = 0` in the couple merge, Service Canada comment present (engine.js 249/260/265/382); clawback gated `oasGross > 0` + capped at OAS paid (248/259, comment 82); `row.mixed` (390) + depletion guard excludes mixed windows (395); `fillDefaults` clamp `retireAge >= age+1` (188); quiz slider `min: 40` (app.js 211) + `#wi-ret min="40"` (index.html 86); renderer `†` suffix + `#yr-mixed-note` legend (app.js 812/818) with EN/FR `t.mixedNote` (i18n 251/512); plan tests 1–4 present (engine.test.js 125/126/137/193/203). + +| Gate | Result (this pass) | +|---|---| +| Unit suites | engine **61/61**, i18n **50/50** (`I18N-OK`), ps-pension **70/70**, ps-auto-service **21/21**, UI smoke **146/146** (`SMOKE-OK`) — all fresh, 0 fail | +| Hermes 3 passes (`passes3.js`, live engine) | `audit/math-fix/passes3-pass46.txt` md5 `01075d0e…` — **`diff`-identical to the pass-14→45 log (33 consecutive)**; PASS 1 (screenshot repro): age 55 OASnet **$0** (was −$3,501), GIS **$0 at 56** (was $12,916), first GIS 65, **conservation OK** on all 3 passes | +| Deploy | `scripts/deploy.sh` → **DEPLOY-OK** (retireapp live) | +| Byte sweep (post-deploy) | tracked 3-way **21/21** + vision 2-way **13/13** = **34/34 match, 0 mismatch** → `SWEEP-OK` | +| Off-LAN (Midhurst `trouble@100.96.20.61`) | `OFFLAN-OK`, `"all_ok": true`, `"http_code": "200"`, `checked_at 2026-10-09T23:50:03Z` → `audit/bilingual-geo-check.json` | +| Live rows (canonical) | `rowsweep41.py`: couple rows=40 firstDraw=55 firstGIS=65 negOAS=[] GIS<65=[] OAS<65=[] growWW=[]; FIRE rows=57 firstDraw=**40** firstGIS=65 all invariant arrays empty → `ROWSWEEP-OK`. Screenshot-scenario rows 58–64: OASnet **$0** every row (no negatives), GIS **$0** (<65), **no growing-Total-with-Withdraw rows**; depletion 56 + unfunded 58+ (93k spend > capacity — conservation-verified), matching passes3 | +| MIXEDLIVE probes (live site) | 52/50 → dagger rows `[]`, legend hidden, firstDraw 53 (clamp); 50/54 → dagger `[54]`, EN legend shown verbatim; 52/56 (clamp-driven) → dagger `[56]`, legend shown; `gisRowsUnder65`/`negOASrows`/`growRowsMissingDagger` **[] everywhere** → 3× `MIXEDLIVE-OK`; engine-side `legs42.js` → `LEGS-OK`, log `diff`-identical to pass 45 | +| FIRE acceptance | live table first draw **age 40**; `#wi-ret` min **40** max 72; 390px: slider value “40 years”, slider right edge 367 < vw 390 (**no clip**), FIRE hint EN present (“Early retirement (FIRE) supported — plan must self-fund the CPP/OAS gap years.”) | + +Determinism: all five row JSONs byte-identical to pass 45 and the canonical lineage — `after46-couple-rows.json` `129e2a45…` (== `after-couple-rows.json`, passes 14–45), `after46-fire-rows.json` `4af12e59…` (passes 15–45), `after46-mixed-rows.json` `96665bbf…`, `after46-mixed-reachable-rows.json` `98c29f24…`, `after46-mixed5256-rows.json` `53d0dec5…` (passes 15/26/33–45). Frames: `after46-mixed-table.png` `222c81a1…` and `after46-mixed-reachable-table.png` `87594d5a…` **byte-identical to pass 45**; `after46-fire-step-390.png` `761e8055…` **byte-identical to pass 45** (== passes 26–44 canonical pair); canonical couple `cbac51ed…` = documented pass-44 frame (PIL bbox vs pass-45 `eec99021…` confined to **y=234–899**, the G1 animation band; row JSON byte-identical); fire `b4ed3a16…` = documented historical frame (16 prior occurrences; PIL bbox vs pass-45 `685fd711…` band-limited y=234–899); mixed5256 `6d792f12…` = documented pass-44 frame (PIL bbox vs pass-45 `36b82193…` confined to y=234–899, DOM row JSON byte-identical). Harness: Playwright ran with `TMPDIR=.tmp/pw46` (sandbox TMPDIR read-only, as passes 39–45); probe scripts `cp`-copied byte-identically (md5-proven) into `.tmp/mathfix46/` and run with argv `after46`. + +**No code change required** — engine/renderer/i18n/tests byte-stable vs pass 45, deployed build verified identical 34/34. All plan acceptance criteria (1–6) re-verified against the deployed build. Final: **MATH_FIX_DONE**. diff --git a/audit/bilingual-geo-check.json b/audit/bilingual-geo-check.json index 370636e..45be20c 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-09T23:47:04Z", + "checked_at": "2026-10-09T23:50:03Z", "vantage": "trouble@100.96.20.61 (Midhurst, off-LAN)", "all_ok": true } \ No newline at end of file