# Sprint 3.1 – Reconciliation Semantic Hardening

**Branch:** `sprint3.1/reconciliation-semantic-hardening`

**Base:** `44038ae8b8af9a5c1b84197fde5ed0b09cd80d29`

## Delivered

- Reconciliation result and freshness are separate: stale comparable balances remain `reconciled` or `difference`; exact Decimal differences remain visible.
- The reconciliation API no longer exposes `stale` as a reconciliation result.
- Metadata returns the newest logical row only: valuation per account; FX per base/quote/provider/rate type. Output is deterministic and bounded to 200 records.
- Snapshot issue codes are translated to German UI explanations; technical codes are not rendered.
- Redaction recognizes compact/spaced IBANs, long account numbers, case-insensitive Ethereum/Bech32 addresses, Base58 Bitcoin addresses, long wallet-like tokens and paths while retaining friendly names.
- No mutation, migration, provider call, valuation or FX conversion was added. The endpoint remains GET-only/read-only.

## Verification

- Focused backend: `tests/unit/test_reconciliation_snapshot_foundation.py` — 12 passed.
- Full backend: 606 passed.
- Focused frontend Portfolio/Read-only: 6 passed; post-review Portfolio rerun: 2 passed.
- Full frontend: 40 files / 134 tests passed.
- Frontend typecheck and production build passed; known Vite >500 kB warning remains non-blocking.
- Compile, changed-file Ruff, `git diff --check`, and Git/secret/productive-data safety scan passed.
- Responsive shell UAT at desktop 1440px, iPad landscape 1024px and mobile 390px: screenshots produced; no horizontal clipping observed. The local API was intentionally offline in this isolated frontend UAT, while synthetic/unit frontend tests cover reconciliation states. Research remained disabled and Budget/Transfers navigation remained available.

## Sol review

One read-only `gpt-5.6-sol` review found two high findings, both fixed: case/spacing gaps in identifier redaction and mixed timestamp/date ordering for current FX rows. Affected backend and Portfolio tests plus typecheck were rerun after the fixes.

No Sprint 4 work is started.
