# Sprint 20C – Performance-Aktivierungs-Härtung v1

Stand: 2026-08-03
Basis: `0e2cd9f7291e941050a21e52b0c56d4f59ea6b7a`
Schema: 49 (unverändert)

## Releasegrenze

Sprint 20C härtet den bestehenden Sprint-20B-Aktivierungsablauf. Es gibt keine zweite Performanceengine, keinen neuen Provider, keinen neuen Scheduler und keine produktive Aktivierung. Preview-Pfade sind read-only. Confirm-Pfade bleiben durch den bestehenden Write-Mode geschützt und benötigen ein explizites Confirm.

## PostFinance-Komponentensemantik

- Der Performance-Scope bleibt das gemeinsame E-Trading-Portfolio.
- `postfinance_etrading_depot` enthält ausschliesslich den Wertschriftenwert.
- `postfinance_etrading_cash` enthält Settlement-Cash über alle Quellwährungen in CHF.
- Das bestätigte Quelltotal ist nur Reconciliation-Kontrolle und keine dritte additive Bewertung.
- Neue bestätigte offizielle Importe erzeugen append-only je eine kanonische Account-Bewertung für Depot und Settlement-Cash.
- Der Reader kann bestehende bestätigte PostFinance-Quellkomponenten read-only als Aktivierungsanker verwenden.
- Ein historischer kombinierter Depot-Snapshot erfüllt den Zwei-Konten-Scope nicht.
- Für denselben fachlichen Tag gilt: vollständige Account-Komponenten vor unvollständigen Quellen; danach `daily_market_fx_v4` als Tagesabschluss vor dem offiziellen Punkt-in-Zeit-Import; innerhalb einer Quelle Version, Capture-Zeit und ID deterministisch.
- Bereits bestätigte Zeilen werden nicht geändert oder gelöscht.

### Diagnose 27.07.2026

- offizieller Wertschriftenwert: CHF 293’465.16
- offizielles Settlement-Cash: CHF 27’684.07
- offizielles Quelltotal: CHF 321’149.23
- täglicher Markt-/FX-Snapshot: CHF 322’299.22
- Differenz: CHF 1’149.99

Die Differenz setzt sich zusammen aus:

- Wertschriften/Markt-/FX-Differenz: +CHF 1’980.60
- veraltete, dem Depot zugerechnete Cash-Komponente: −CHF 830.61

Damit handelt es sich nicht um eine einzelne reine Doppelzählung. Die Tagesbewertung verwendete andere Markt-/FX-Werte und altes Depot-Cash. Der offizielle Import bleibt Quell-Reconciliation und Aktivierungsanker; eine zukünftige vollständige Tagesabschlussbewertung wird erst nach korrekter Materialisierung beider Account-Komponenten zur Performance-Tagesbewertung.

## Performanceklassifikation

Die Rohklassifikation bleibt unverändert. Die bestehende Performance-Engine leitet deterministisch ab:

- externe Einzahlung / externe Auszahlung: einziger externer Performance-Cashflow;
- Transfer vollständig innerhalb des Scopes: performance-neutral;
- Transfer über die Scope-Grenze: extern, Richtung aus dem ausgewählten Scope-Leg;
- Dividende und Zins: interner Anlageertrag;
- Gebühr, Steuer und Abgabe: interner Aufwand;
- Kauf, Verkauf und FX-Trade: interne Umschichtung;
- Split, Corporate Action und Anfangsbestand: kein externer Cashflow;
- unklare Transfergrenzen oder unbekannte Klassen: nicht aktivierbar.

Der Reclassification-Preview aggregiert bisherige Art, Performanceklasse, Richtung, Betrag, Währung und Scope-Grenze. Sein Fingerprint bindet die vollständigen relevanten Inputzeilen, nicht nur Anzahl oder letzten Zeitstempel.

## True-Wealth-Cashflowpfad

`Performance einrichten → True Wealth` unterstützt:

1. mehrere manuelle externe Ein-/Auszahlungen;
2. CSV mit `date,direction,amount,currency` und optional `amount_chf,fx_source,evidence_reference`;
3. periodenbezogene Nullflussbestätigung;
4. Preview → explizites Confirm → Audit;
5. Fingerprint- und Bestätigungs-ID-gebundene Idempotenz;
6. positive Eingabebeträge, explizite Richtung und bestätigte CHF-/FX-Provenienz;
7. wirtschaftliche Deduplizierung bereits bestätigter Cashflows unabhängig von der Bestätigungs-ID;
8. Erhalt und Zusammenführung angrenzender bestehender Coverage ohne stilles Verkürzen;
9. Ablehnung nicht bestätigter Coverage-Lücken;
10. erneute Fingerprint-Prüfung innerhalb der gesperrten Confirm-Transaktion.

Cashflow- oder Nullfluss-Confirm erzeugt genau null Bewertungen. True-Wealth-Werte bleiben auf bestätigte offizielle Importe und bestätigte manuelle Gesamtwerte beschränkt. Mit den vorhandenen Werten vom 30.06. und 27.07.2026 schaltet eine bestätigte vollständige Cashflow- beziehungsweise Nullflussperiode XIRR und TTWROR für diesen Zeitraum frei.

## Einrichtungsansicht

Die Hauptansicht zeigt höchstens eine kompakte Einrichtungskarte. Quellenreihenfolge:

1. True Wealth
2. Krypto
3. PostFinance

Je Quelle sichtbar: Status, frühester möglicher Beginn, Anfangs-/Endwert, Cashflow-Coverage, genau nächste Nutzeraktion und danach verfügbare Kennzahlen. Reason-Codes, Provenienz und Fingerprints liegen eingeklappt unter `Daten & Diagnose`.

## Sicherheitsinvarianten

- Schema bleibt 49.
- Kein Dashboard-Render löst Provider- oder Marktrequests aus.
- Preview schreibt keine Finanzdaten.
- Confirm ist im API-Read-only-Modus gesperrt.
- Keine bestehende Bewertung wird geändert oder gelöscht.
- Timer und `JARVIS_FINANCE_DAILY_VALUATION_ENABLED` bleiben deaktiviert.
- Krypto nutzt bestehende Holdings-/Transaktionspfade; Wallets werden nicht automatisch zusammengeführt oder gelöscht.

## Verifikation vor Release

- Sprint-20C-Fokustests: `18 passed`.
- Backend-Gesamtsuite: `940 passed`.
- Frontend-Gesamtsuite: `52` Dateien / `227 passed`.
- Frontend-Typecheck und Produktionsbuild: bestanden.
- Repository-Gesamtgate `make verify`: bestanden.
- Ruff für sämtliche geänderten Python-Dateien: bestanden.
- `compileall`, Git-Safety und `git diff --check`: bestanden.
- Schema-/Migrations-Kontrollgate: Schema `49`, Integrity `ok`, Produktionspfad-Schutz bestanden.
- Finale Browser-UAT bei `1440`, `820` und `390` Pixeln: kein horizontaler Overflow, genau eine Einrichtungskarte, mindestens `44px` hohe sichtbare Buttons, keine Console-/JavaScript-Fehler.
- Der Browser-Render rief ausschließlich die lokalen read-only API-Pfade auf; keine Provider-, Markt- oder FX-Endpunkte.
- True-Wealth-Preview war im Read-only-Modus verfügbar; Confirm wurde mit HTTP `403 write_operations_disabled` blockiert.
- UAT-Kopie und Produktionsdatenbank blieben nach der Preview-UAT SHA-256-identisch.
- Produktiver Bewertungstimer: `disabled` / `inactive`; `JARVIS_FINANCE_DAILY_VALUATION_ENABLED=0`.
