Skip to main content

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 through build_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 card unmatched at $40.00; Fortnite Crew Aug 26 gone from upcoming_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.