audit: math-fix eighth-pass re-verification (all gates fresh, OFFLAN-OK 21:17Z, live mixed-window probe)
This commit is contained in:
1 parent
dec4798cd9
commit
2e4e0963a4
2 files changed
+24
-1
No files matched your search
@@ -242,3 +242,26 @@ Queue gate: `git status --porcelain` empty at start, HEAD `920abe7` == `origin/m
|
||||
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**.
|
||||
|
||||
---
|
||||
|
||||
## Re-verification (eighth DSH pass, 2026-10-09 21:17 UTC, post-completion)
|
||||
|
||||
Queue gate: `git status --porcelain` empty at start (no untracked, no tracked diff), HEAD `57b05d9` == `origin/main`, no job in flight → proceed (not `DSH_QUEUE_BUSY`). Fix 1–4 re-audited in HEAD by direct file read: GIS `a >= 65 ? gis(…) : 0` at the three `solve()` sites (engine.js:249/259/265, Service Canada comment :88–91) + merge per-partner ≥65 gates (:376–380) + `if (yr < 65) gisSum = 0;` (:382); 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. T1 clawback $0 @55 / GIS $0 @56, capped cw @67, couple GIS/claw zero <65 + net OAS ≥ 0 everywhere, depletion guard, fillDefaults 52→53 & 30→40, FIRE first draw 40 + rows 40–64 GIS/clawback 0) |
|
||||
| `tests/i18n.test.js` | `I18N-OK all i18n checks passed (50)` (incl. `t.mixedNote` EN+FR, `q.retire.hint` FIRE EN+FR) |
|
||||
| `tests/ui.smoke.js` | `SMOKE-OK all ui smoke checks passed (146)` (incl. † mixed-row fixture ×3 EN+FR + legend shown, control-single clean, `wi-ret min 40`, legend element present) |
|
||||
| `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-pass8.log`. PASS 1 (screenshot repro): rows 55–64 **OASnet $0 / GIS $0** (plan evidence: −$3,501 @55, $12,916 @56 + phantom $13,667/yr to 94), first GIS row 65 ($12,567, OASnet $9,150), depletion 56 honest ($170,465 nest egg vs $93k spend); PASS 2 depletion 82, GIS phase-outs 65+ only; 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 | sha256 (cache-free curl, live vs repo) **6/6 BYTE-OK**: engine/engine.js `2101f46b…`, engine/canada.js `dbd30a0e…`, app.js `092a35d7…`, i18n.js `cfc5ab0b…`, index.html `28ab4f62…`, style.css `2e9ba90a…`; full sweep local == `git cat-file origin/main:` == webroot: **21/21 MD5 match** (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, rows 52–66 scraped from DOM: **0** negative-OAS cells (all ages), **0** GIS>0 rows <65, **0** OAS≠0 rows <65, first GIS row 65 (OAS $18K, GIS $12K); rows 58–64: Total $0 / OAS $0 / GIS $0, Withdraw $49K @58 then $0, Unfunded $47K–$93K — **no growing-Total-with-Withdraw rows** (post-fix Total drains honestly 248K→152K→48K→0, vs the screenshot's impossible 126→141K at 3.5%); `wiRetMin: "40"`; `noteShown: false` — correct (symmetric couple has no mixed rows, Deviation 2). FIRE 30/BC/ret 40: `fire_first_draw_age: "40"`, 0 pre-65 GIS/OAS rows. Mobile 390: quiz retire slider `min=40 value=40`, `sliderRight 367 ≤ vw 390` (no clip), value chip [25, 145], FIRE hint present EN, `svAfter40: "40 years"`. Fresh PNGs 21:1xZ (validated 1280×900 tables, 1170×2532 mobile @3×) |
|
||||
| Live mixed-window probe (new this pass) | Attempted the only remaining live mixed path: couple me 52 / pt 50, `retireAge: 51` (below my age → `fillDefaults` clamps **self to 53**; partner inherits the clamped 53). Engine + live DOM agree: rows 50–52 accum, both partners draw from 53, **0 mixed rows**, `noteShown: false` (correct). **Structurally confirms Deviation 2 via the last open path** — the age-axis merge + shared (clamped) `retireAge` makes mixed *draw* windows unreachable in the live couple path; renderer † + bilingual legend therefore proven by the `ui.smoke.js` `project()` fixture (3 flagged rows EN+FR) and engine §16 |
|
||||
| Off-LAN (Midhurst `trouble@100.96.20.61`) | `OFFLAN-OK`, `"all_ok": true`, `"http_code": "200"`, `checked_at 2026-10-09T21:17:23Z` → `audit/bilingual-geo-check.json` |
|
||||
|
||||
Harness notes: Playwright run with `TMPDIR=/home/ubuntu/projects/retire-planner/.pwtmp` (harness TMPDIR read-only; no site impact); this model has no image input, so PNGs validated by IHDR dimensions + file size + the DOM row scrapes (content evidence) rather than visual inspection; ssh byte-check uses `-n` (plain ssh eats loop stdin).
|
||||
|
||||
No code change required — plan executed end-to-end; commit `0839826` at `origin/main`. Final: **MATH_FIX_DONE**.
|
||||
Reference in new issue
Block a user