# Minimum-balance fee validation

Reviewed 25 October 2026. Full local private package; script only, no rendered video or remote publication. Root froze financial policy and exact API before implementation. The initial 80 independently authored calculation cases predate code; four additional explicit calendar-boundary expectations were authored before their first execution. No reference function generated those expected outcomes.

## Financial expectations

The primary synthetic 35-day product calendar sums to 3222400, average 644480/7, minimum 75600. Threshold 75000 / grace 0 gives zero. One 40000 date at threshold 50000 / fee 250 / grace 0 gives fee 250, while grace 1 gives zero. Two such dates exceed grace 1 and give 250. Equality is sufficient. `[100000,0]` and `[50000,50000]` both average 50000 but have different low-day decisions. Negative balances remain valid signed observations under this fee policy.

A valid applicable waiver overrides an otherwise fee-due outcome only after complete validation. Missing coverage still rejects. Policy terms cover the entire period and are known by its start; lifecycle covers the full account period. Close exactly at exclusive end is complete. All inputs are synthetic; this is not a real tariff or product-entitlement observation. [Arithmetic oracle](../examples/independent-arithmetic.json).

## Executable evidence

`python -B tests/run_parity.py` passes **84 calculation cases: 24 accepted / 60 rejected**, plus **30 complete recorder actions**. Strict TypeScript compilation and entire calculation/recorder result/state JSON equality pass. Tests independently assert expected arithmetic/codes, unchanged caller state/request/context, low/minimum dates, cumulative count, exact average identity, positive/zero proposal legs and immutable accepted prefixes.

Cases cover threshold equality, one unit below, grace exhaustion, same-average/different-minimum, signed negatives, huge exact money and maximum positive fee, full October, complete leap-year 366-day calendars with grace 365/366, year 0001 and 367-day rejection. Invalid cases include malformed money/schema/perspective, missing/duplicate/reordered/outside/invalid dates, receipt clocks, policy coverage/availability, partial lifecycle and waiver timing/shape.

Unicode tests distinguish NEL/control stripping, nonblank BOM, 240 supplementary scalars, 241-scalar rejection and lone-surrogate rejection. The TypeScript trim set explicitly matches Python str.strip; native JavaScript trim is not assumed equivalent.

Recorder actions cover original authorized retry, changed policy/calculation/evidence/waiver conflict, accepted waiver retention, failed-first identity recovery, scope authorization before disclosure, distinct account and nonoverlapping period, semantic object-key order, invalid/duplicate state, context uniqueness/extra fields, static accepted-policy/count bounds and detachment. At 1000 records, exact replay succeeds, changed payload conflicts and a new identity rejects capacity. Stored results are not recalculated using new request terms. State authenticity remains trusted host responsibility; shape/internal consistency is not cryptographic proof.

Raw receipt: [parity-results.json](../tests/parity-results.json). **Committed labels modeled accepted decisions, not durable database writes.** No actual SQL, live contention or durable duplicate-protection claim is made. The host must authorize and persist accepted decision plus actual journal atomically or use stable Stage 1 business identity.

## Browser and rendered evidence

`node tests/build_lab.cjs` bundles the actual TypeScript calculation and recorder; source SHA256 `8b0388753b00babab3b46419834d4aeff30214c45236b7e081207d4de1f5cf25`. `node tests/browser_qa.cjs` verifies that hash, exact outcomes for eight scenarios, all 35 primary cards and current-candidate/original-accepted separation.

At 390/768/1440, the test accepts original fee 250, changes grace so the candidate is zero, observes `DECISION_CONFLICT`, retries the original request and observes original 250 with one record. The current-day/threshold/running-minimum SVG then shows 100000 / 50000 / 40000, with correct marker ordering: current recovery does not erase a low minimum. Missing coverage rejects despite waiver and reserves no identity. Controls, keyboard, deterministic full reset, timer cancellation, deliberate retention on grace change and reduced-motion one-step Play pass. All targets are at least 44 px, no page overflow and no console warnings/errors or page exceptions.

Both standalone SVGs are valid XML with viewBox/title/description, opened and visually inspected. Workflow/article Mermaid parse/render. Mobile calendar/metrics, stored-versus-candidate explanation, static figures and decision tree are inspected for legibility/overlap/clipping. The acceptance table scrolls locally; essential original amount remains visible above. [Visual notes](../visuals/QA.md), [raw browser receipt](../tests/browser-results.json).

## Limits and release boundary

Official US disclosure/method context is bounded by [references](../REFERENCES.md); the [claim ledger](CLAIM-LEDGER.md) distinguishes sourced facts, synthetic policy, author arithmetic and local observations. Historical case: **not useful**. A pure proposal does not establish legal entitlement, funds sufficiency, no-overdraft, source authentication, concurrent protection or nonoverlapping approved periods. No real customer or credential data is present.

Final structural acceptance passed: package validator in full mode reports **11 Markdown files, 0 errors / 0 warnings**; playground validator reports **1 passed / 0 failed**. Public parity/browser/validation copies are byte-identical to canonical evidence. Root's independent visitor integration remains a separate gate; status remains local/private.
