audit: math-fix nineteenth-pass re-verification (all gates fresh, OFFLAN-OK 21:59Z, deploy + 34/34 byte sweep, passes3 + DOM rows byte-identical to passes 14/15/16/17/18)
This commit is contained in:
1 parent
4d66a6e802
commit
f3570da482
2 files changed
+26
-1
No files matched your search
@@ -516,3 +516,28 @@ Harness notes: Playwright runs with `TMPDIR=/home/ubuntu/projects/retire-planner
|
||||
No code change required — plan executed end-to-end; fix commit `0839826` at `origin/main` (ancestor of HEAD, confirmed via `git merge-base --is-ancestor`); all gates fresh this pass. Final: **MATH_FIX_DONE**.
|
||||
|
||||
Addendum (post-push, same pass): audit commit `c5daee52a47d90df6f26b3e2c92a3b91cbd5da72` pushed `198b3ef..c5daee5` → `origin/main` (report + fresh off-LAN stamp; 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`: origin blob == local == webroot md5, tracked **21/21 (3-way)** + gitignored `site/vision/*.jpeg` **13/13 (2-way)** = **34/34 match, 0 mismatch**; `HEAD` == `origin/main` (this addendum commit adds only report text — zero site-file delta, so the sweep carries over by construction).
|
||||
|
||||
---
|
||||
|
||||
## Re-verification (nineteenth DSH pass, 2026-10-09 21:57–22:02 UTC, post-completion)
|
||||
|
||||
Queue gate: `git status --porcelain` empty at start (HEAD `4d66a6e` == `origin/main` post-fetch) → proceed (not `DSH_QUEUE_BUSY`). Fix 1–4 re-audited by direct read of the working tree (== HEAD, zero tracked diff): GIS 65+ floor — `a >= 65 ? gis(…) : 0` at the three `solve()` sites (engine.js:249/260/265) + Service Canada source-fact comment (:88–91) + merge per-partner ≥65 gates (:376/:379–380) + `if (yr < 65) gisSum = 0;` (:382); clawback only with OAS — `oasGross > 0 ? Math.min(clawback(…), oasGross) : 0` at :248/:259 + s.3(1) ETA comment :80–83 + splitting-solver parity :366–367; mixed rows — `row.mixed` :390 + depletion guard `!row.mixed` :395 + renderer `†`/legend app.js:807–819 + legend element index.html:95 + `t.mixedNote` EN/FR i18n.js:251/512; FIRE — `fillDefaults` clamp `retireAge < age+1` engine.js:188, quiz slider `min: 40` app.js:211, `#wi-ret min="40"` index.html:86, 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. §14 GIS $0 @56 / clawback $0 @55 repro, §15 clawback 0 pre-OAS & capped at OAS gross, §16 couple invariants + depletion-never-fires-on-mixed, §17 fillDefaults 52→53 & 30→40, FIRE first draw 40, GIS/clawback 0 rows 40–64) |
|
||||
| `tests/i18n.test.js` | `I18N-OK all i18n checks passed (50)` (incl. `t.mixedNote` EN+FR parity, `q.retire.hint` FIRE EN+FR) |
|
||||
| `tests/ui.smoke.js` | `SMOKE-OK all ui smoke checks passed (146)` (incl. † mixed-row fixture with bilingual legend, `wi-ret min 40` from index.html, legend element present) |
|
||||
| `tests/ps-pension.test.js` / `ps-auto-service.test.js` | `70 pass, 0 fail` / `21 pass, 0 fail` (unchanged files) |
|
||||
| `passes3.js` rerun (live engine) | exit 0, `conservation: OK` ×3 → `audit/math-fix/passes3-pass19.txt` (md5 `01075d0e…` — **byte-identical to passes 14–18**, six consecutive deterministic passes). Line-tracked scan of all printed rows: PASS 1 (screenshot repro) 43 rows — **0** GIS>0 rows <65 (old $12,916 @56 / phantom $13,667 to 94 gone), **0** OASnet≠0 rows <65 (old −$3,501 @55 gone), **0** negative-OASnet, **0** growing-Total-with-Withdraw consecutive rows; first GIS row **65** ($9,150 GIS, OASnet $7,200), depletion 56 honest (finalBal $0); PASS 2: 50 rows firstDraw 65 firstGIS 65, all sets empty, conservation OK; PASS 3 FIRE: 65 rows, first draw @**40**, GIS $13,667 first at **65**, **0** pre-65 GIS, **0** violations, conservation OK |
|
||||
| `scripts/deploy.sh` | `DEPLOY-OK` (fresh this pass) |
|
||||
| Origin byte-check | 3-way sweep `.tmp/mathfix19/sweep19.sh` (pass-18-lineage script; tracked/ignored lists regenerated via `git ls-files`, `diff` vs pass-18 lists: byte-identical, 21+13; ssh `-n`, single remote md5 pass): local `site/` == `git cat-file blob origin/main:` == webroot — tracked **21/21 (3-way)** + gitignored `site/vision/*.jpeg` **13/13 (2-way)** = **34/34 match, 0 mismatch** → `SWEEP-OK`; `HEAD` == `origin/main` == `4d66a6e` |
|
||||
| Live recapture (`mathfix_capture.py after19` + canonical `after`, retire.krisforbes.ca) | couple 52/52 ret 55 spend 93k CPP 60, K-aware 11-column parse (`.tmp/mathfix19/rowsweep.py`): **ROWSWEEP-OK** on all four row JSONs — 40 rows, first draw **55**, first GIS **65**, **0** neg-OAS, **0** GIS>0 <65, **0** OAS≠0 <65, **0** growing-Total-with-Withdraw; rows 58–64 Total $0 / OAS $0 / GIS $0 (Withdraw $49K @58 then $0, Unfunded $47K→$93K→$79K from CPP@60 — honest drain, vs the screenshot's impossible 126→141K @3.5%); `wiRetMin: "40"`. FIRE 30/BC/ret 40 (`after-fire-rows.json`, 57 rows): `fire_first_draw_age: "40"`, first GIS 65, **0** violations. Mobile 390: retire slider `min=40 max=72 value=40`, `sliderRight 367 ≤ vw 390` (no clip), chip [25, 145], FIRE hint EN present, `svAfter40: "40 years"` |
|
||||
| Live mixed-window probe (`after19-mixed-*`, pass-14-lineage) | couple me 52 / pt 50, `retireAge: 51` → `fillDefaults` clamps self to 53, partner inherits the shared clamped 53 → both draw from 53: 43 rows, firstDraw **53**, firstGIS **65**, **0 † rows**, `noteShown: false`, all invariant sets empty → reconfirms Deviation 2 (age-axis merge + shared clamped `retireAge` ⇒ mixed draw windows unreachable in the live couple path); the `†` suffix + bilingual legend is proven by `ui.smoke.js` `project()` fixtures and engine §16 |
|
||||
| Off-LAN (Midhurst `trouble@100.96.20.61`) | `OFFLAN-OK`, `"all_ok": true`, `"http_code": "200"`, `checked_at 2026-10-09T21:59:11Z` → `audit/bilingual-geo-check.json` |
|
||||
|
||||
Determinism: `after19-couple-rows.json` md5 `129e2a45…` — **byte-identical** to the canonical `after-couple-rows.json` re-captured in the same session (same as passes 14–18); `after19-mixed-rows.json` md5 `96665bbf…` byte-identical to `after15/16/17/18-mixed-rows.json`. Frames: the `after19` couple run landed on the known chart-animation-phase frame `eec99021c08c…` 63,753 B (pass-11/13–18 variant) with DOM row JSON byte-identical to canonical; the canonical `after` couple run **landed on the canonical frame on the first attempt** — 1280×900 50,314 B md5 `cbac51ed5089…`, byte-identical to the canonical renders of passes 1/8–18. All five fresh/updated PNGs IHDR-validated: `after19-couple-table.png` / `after19-mixed-table.png` (1280×900 64,537 B md5 `222c81a1…` — byte-identical to `after14/17/18-mixed-table.png`), `after-couple-table.png` (50,314 B canonical), `after-fire-table.png` (1280×900 53,323 B md5 `b4ed3a16…` — same anim-phase variant pass 18 recorded, DOM rows canonical), `after-fire-step-390.png` (1170×2532 @3× 167,045 B md5 `761e8055…` stable). `after19` tag captures only the couple scenario by script design (FIRE + mobile 390 under canonical `after`).
|
||||
|
||||
Harness notes: Playwright runs with `TMPDIR=/home/ubuntu/projects/retire-planner/.tmp/pw` (harness TMPDIR read-only; no site impact); ssh byte-check uses `-n`; this pass rebuilt sweep + K-aware rowsweep + mixed probe under `.tmp/mathfix19/` (gitignored) from the pass-18 originals with only tag retargeting (`after18→after19`); all ran unmodified otherwise. `audit/math-fix/` is gitignored by design — artifacts are local evidence, referenced by path.
|
||||
|
||||
No code change required — plan executed end-to-end; fix commit `0839826` at `origin/main` (ancestor of HEAD, confirmed via `git merge-base --is-ancestor`); all gates fresh this pass. Final: **MATH_FIX_DONE**.
|
||||
@@ -5,7 +5,7 @@
|
||||
"has_i18n_script": true,
|
||||
"i18n_js_fr_strings": true,
|
||||
"i18n_js_size": 39689,
|
||||
"checked_at": "2026-10-09T21:55:57Z",
|
||||
"checked_at": "2026-10-09T21:59:11Z",
|
||||
"vantage": "trouble@100.96.20.61 (Midhurst, off-LAN)",
|
||||
"all_ok": true
|
||||
}
|
||||
Reference in new issue
Block a user