audit: math-fix pass 47 re-verification (all gates fresh, OFFLAN-OK 23:53Z, deploy + 34/34 sweep, passes3 byte-identical to passes 14-46, all five row JSONs byte-identical, probe+legs logs diff-identical to pass 46, 3x MIXEDLIVE-OK, FIRE draw-at-40 live, tagged couple/fire/step-390 frames byte-identical to pass 46, band-limited y234-899 diffs only)

This commit is contained in:
krisf committed 2026-10-09 19:55:20 -04:00
1 parent 2bb98c2e92
commit 9766de7882
2 files changed
+22 -1

No files matched your search

+21
View File
@@ -1249,3 +1249,24 @@ Determinism: all five row JSONs byte-identical to pass 45 and the canonical line
**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**.
Addendum (post-push, same pass): audit commit `9a1b175e217c97b5df50fc77bae44cf97309a4e2` pushed `54b8c4b..9a1b175` → `origin/main` (report + fresh off-LAN stamp `2026-10-09T23:50:03Z`; 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 54b8c4b..9a1b175 -- 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` == `9a1b175`.
---
## Addendum — Pass 47 (re-verification of `0839826` on `8e193cf`, all gates fresh)
Start gate: `git status --porcelain` empty at HEAD `8e193cf` → 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, comment 88–91); clawback gated `oasGross > 0` + capped at OAS paid (248/260, comment 82; split-comparison same rule 366–369; row assignment 302/371); `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 810/812/818) with EN/FR `t.mixedNote` (i18n 251/512); FIRE hint EN/FR (i18n 96/357); plan tests 1–4 present (engine.test.js 143/168/198 + FIRE GIS/clawback + stale-clamp cases).
| 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-pass47.txt` md5 `01075d0e…` — **`diff`-identical to the pass-14→46 log (34 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:53:54Z` → `audit/bilingual-geo-check.json` |
| Live rows (canonical) | `rowsweep41.py` over 4 files (canonical + tagged): 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`, all three probe logs **`diff`-identical to pass 46**; engine-side `legs42.js` → `LEGS-OK`, log `diff`-identical to pass 46 (52/56 mixed row 56 grows $140,465→$269,227 with wdr $30,000 carrying `†`) |
| 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 46 and the canonical lineage — `after47-couple-rows.json` `129e2a45…` (== `after-couple-rows.json`, passes 14–46), `after47-fire-rows.json` `4af12e59…` (passes 15–46), `after47-mixed-rows.json` `96665bbf…`, `after47-mixed-reachable-rows.json` `98c29f24…`, `after47-mixed5256-rows.json` `53d0dec5…` (passes 15/26/33–46). Frames: `after47-mixed-table.png` `222c81a1…` and `after47-mixed-reachable-table.png` `87594d5a…` **byte-identical to pass 46**; `after47-fire-step-390.png` + canonical `after-fire-step-390.png` `761e8055…` **md5-identical to passes 26–46**; canonical couple redraw `eec99021…` (canonical frame, passes 15–20/24–27/35/37/41–43/45) with tagged `after47-couple-table.png` `cbac51ed…` **byte-identical to the pass-44/46 frame** (PIL bbox canonical-vs-tagged confined to **y=234–899**, the G1 animation band; row JSON byte-identical); fire pair canonical `685fd711…` (canonical) + tagged `b4ed3a16…` **byte-identical to pass 46** (band-limited y=234–899); mixed5256 `36b82193…` (lineage frame, passes 33–40/43/45; PIL bbox vs pass-46 `6d792f12…` **band-confined True**, y=234–899; DOM row JSON byte-identical). Harness: Playwright ran with `TMPDIR=.tmp/pw47` (sandbox TMPDIR read-only, as passes 39–46); probe scripts `cp`-copied byte-identically (md5-proven) into `.tmp/mathfix47/` and run with argv `after47`; `sweep47.sh` sed-derived from `sweep46.sh` (diff = header + 2 list paths only); tracked/ignored lists regenerated from `git ls-files`/`find` and **byte-identical to pass 46** (21 + 13).
**No code change required** — engine/renderer/i18n/tests byte-stable vs pass 46, deployed build verified identical 34/34. All plan acceptance criteria (1–6) re-verified against the deployed build. Final: **MATH_FIX_DONE**.