Files
Maxim addbe2888d test(reskinnable-demo): lock in the single-ledger invariants
Two new suites, each written so it would have failed against the previous code
rather than merely describing the new behaviour:

- derived-spend: policies[].spent equals the sum of approved charges, excludes
  pending/flagged (so the over-limit check cannot double-count the charge it is
  gating), and agrees between policies() and findPolicy(). Plus the properties
  the demo depends on — at least three distinct months (the condition whose
  absence made the trend chart fabricate), AWS $15,000 still deriving
  over-limit for the teach-mode pill, exactly one Delta charge, and a team and
  category on every ledger row.
- charges-data: parseSort and parseTop reject the values that previously slipped
  through as valid, and toChargeRow's over-limit projection only applies to
  pending charges.

Confirmed red against the old code: parseSort("banana") returned "banana",
parseTop("-5") returned -5, the seed spanned two months, no row carried a team,
and spent was a stored field.

The four existing fixtures move from ExpenseRole to PolicyType for policy
`type`, following the team/policy split.
2026-08-05 00:40:55 +02:00
..