Finance snapshot artifact fixes
Date: 2026-10-04. Built and deployed by the finance agent
(maverick-muse-finance-001) under chief-of-staff clearance of the
mechanical items from the same day's diagnosis. The snapshot was
regenerated from the retained 2026-10-04 Plaid pull inputs (no new pull).
Commits on jknash/dashboard: generator a56134a, tests addf71c,
headline history 5d43b26, snapshot 1134d7c. Cloudflare deployment
ef11c381; verified from outside (landing 200, /finance/ and its data
file behind the Access 302, production and preview hosts).
What was wrong and what changed
All changes are in scripts/build_finance_snapshot.py; the bill registry
and every stakeholder-set amount, date, and tolerance are untouched.
1. Card-minimum liability override (generator bug). The live liability
read for the Chase card (····1588) is used as the expected amount/day for
the card-minimum bill. Once the cycle's $40 minimum was paid (posted
2026-10-02), Plaid reported minimum_payment $0.00 with is_overdue
false — meaning "nothing further due", not "the minimum is $0". The
generator applied that $0 to every monthly occurrence, which made the
real $40 payment unmatchable (amount tolerance $1) and flipped four
occurrences to phantom $0.00 overdues. Fixes: (a) a $0 minimum is no
longer treated as an override — the registry's $40-on-the-1st fallback
stands; (b) the override is scoped to its own statement month via a new
apply_ym override field, so a single liability read never rewrites
other months; (c) the bill-history header amount follows the registry
amount when the override is scoped.
2. Forecast hygiene. Overdue occurrences are collapsed onto today in
the 90-day forecast; previously their labels carried no due date, so two
distinct $0.00 card events rendered as exact duplicates. Overdue labels
now read Name (overdue, due YYYY-MM-DD), and $0-expected occurrences
emit no forecast event at all.
3. Stale-unmatched downgrade + window alignment. An occurrence marked
overdue whose bill has a later paid occurrence is a matching gap, not a
live obligation (example: Fortnite Crew 2026-08-26 — no $12.70 Apple
charge exists in its match window, while 2026-09-26 is paid). Such
occurrences are now downgraded to status unmatched after matching, are
skipped by the forecast, and are not carried into the current cycle as
spoken-for. upcoming_bills' back-window was aligned from 45 to 35 days
to match the forecast. Composition with fix 1: the resurfaced Sep 1 card
occurrence ($40 expected restored) downgrades to unmatched because
Oct 1 is paid — verified by a dedicated integration test.
Verification
- Tests: 14 existing + 17 new = 31 green (
scripts/tests/), covering the $0 guard, override scoping, downgrade rules (including the exact Sep 1 / Oct 1 card case), forecast label/$0/unmatched handling, and the 35-day upcoming window end-to-end throughbuild_planning. - Regenerated snapshot (2026-10-04 inputs): phantom $0.00 forecast events
5 → 0; Oct 1 card minimum now
paid($40.00, 2026-10-02); Sep 1 cardunmatchedat $40.00; Fortnite Crew Aug 26 gone fromupcoming_bills(history:unmatched); forecast end balance $15,307.05 → $15,187.05 (three future months now correctly carry $40 card minimums). - Unchanged, by design: safe-to-spend $1,640.15, unpaid allocations $2,339.68, forecast trough $3,060.18 on 2026-10-14, current-cycle totals, and the Microsoft $6 item in full — the diagnosis found no bug there, and any registry change for it is a stakeholder decision (verification by email sweep is scheduled with the 2026-10-05 bill-watch run).
Published by Muse · 2026-10-04.