# Sprint 23 – Ist-Analyse und API-Verträge

## Verbindliche Basis

- Ausgangs-SHA: `546a6a26d7835cecb36dd85f745cfb3669b39aa5`
- Ausgangsschema: 51
- Zielschema: 52
- Kanonische Services bleiben führend: Ledger, Cash, Portfolio-Analytics, Policy, FX, Daily Valuation und `modelled_wealth`.
- Keine Handelsaktion und keine zweite Performance-/Rendite-Engine.

## Tatsächlich betroffene Hauptflächen

### Backend

- `services/modelled_wealth.py`: bestehende modellierte Wealth-Reihe, Anker-/Projektionsgrenze, weitere Anlagen und Korrekturmarker.
- `services/wealth_cockpit.py`: read-only Komposition von Wealth-Reihe und Portfolioanalyse v1.
- `services/portfolio_analysis_v1.py`: read-only Analyse über gespeicherte kanonische Bewertungen und aktive versionierte Policy.
- `services/raiffeisen_manual_snapshot.py`: append-only Preview→Confirm für einen datierten manuellen Quellensnapshot.
- `services/market_service.py`: bestehendes Aktien-/ETF-Batching mit Cache und begrenzter Parallelität.
- `services/asset_price_refresh.py`: kontrollierter Hintergrundjob mit isolierten Quellen, Fortschritt, Audit und genau einem Job-Wealth-Snapshot.
- `services/system_ops.py`: Runtime-Status ohne historisch fest codierte Ports.
- `storage/migrations.py`: Schema 52 für Bestätigungs-, Job-, Quellenfortschritts- und Job-Wealth-Snapshot-Lineage.

### Frontend

- `components/wealth/WealthCockpitPanel.vue`: Einbindung der gemeinsamen Chart-, Analyse- und Refresh-Komponenten.
- `components/wealth/WealthDevelopmentChart.vue`: gemeinsame PrimeVue/Chart.js-Liniengrafik mit Tabellen- und Tastaturalternative.
- `components/wealth/PortfolioAnalysisPanel.vue`: Policy-Abweichungen, Konzentration, Metadimensionen, Beiträge und maximal fünf Hinweise.
- `components/wealth/AssetRefreshControl.vue`: explizite Startaktion und gespeicherter Fortschritt pro Quelle.
- `api/portfolio.ts` und `api/marketRefresh.ts`: typisierte Verträge.

## Chart-Iststand

Die Sprint-22-Wealth-Grafik war eine lokal handgeschriebene SVG-/CSS-Darstellung. Das Repository enthielt Chart.js bereits als gesperrte Abhängigkeit; Sprint 23 führt daher keine zusätzliche Chartbibliothek ein, sondern migriert die Wealth-Reihe auf eine gemeinsame PrimeVue/Chart.js-Komponente.

## API-Verträge

### Manueller Raiffeisen-Quellensnapshot

- `POST /api/portfolio/manual-snapshot/raiffeisen/preview`
  - Request: Stichtag und drei exakte CHF-Quellwerte; keine vollständigen Identifikatoren.
  - Read-only: betroffene maskierte Konten, bisheriger/neuer Wert, Quelle, Stichtag, erwartete Gesamtänderung und getrennte Mitgliedschaft.
- `POST /api/portfolio/manual-snapshot/raiffeisen/confirm`
  - Request: identische Quellwerte plus Preview-, Confirmation- und Fingerprint-Bindung.
  - Append-only: zwei getrennte Cash-Snapshots und genau ein separater Mitgliedschafts-Snapshot; null Transaktionen; Audit und Idempotenz.

### Wealth-Cockpit

- `GET /api/portfolio/wealth-cockpit?period=1m|3m|ytd|1y|all`
  - Ausschliesslich gespeicherte kanonische Daten; keine Provideraufrufe und keine Writes.
  - Liefert modellierte Gesamt-/Komponentenreihe, letzten bestätigten Anker, Korrekturmarker, Qualitätsangaben, Portfolioanalyse v1 und separat gegatete TTWROR/XIRR.

### Assetpreis-Hintergrundjob

- `POST /api/market/asset-price-refresh`
  - Erzeugt nur einen gespeicherten `queued` Job und plant den Worker nach der HTTP-Antwort.
- `GET /api/market/asset-price-refresh/{job_id}`
  - Gespeicherter Status; keine Provideraufrufe und keine Writes.
  - Fortschritt und Fehler getrennt für Aktien/ETF, Krypto und FX.

### Runtime-Status

- `GET /api/system/status`
  - Der aufrufende Backend-Endpunkt belegt die Backend-Erreichbarkeit selbst.
  - API-/Frontend-Adresse wird aus Request bzw. Runtime-Konfiguration abgeleitet; keine historischen Portkonstanten.

## Bewusste Grenzen

- Keine Analystenratings, News, Kurszielkonsense oder Kalender in Sprint 23.
- Keine unternehmensbezogene Buy-/Sell-Empfehlung.
- Keine Handels- oder Bestandsmutation.
- Sprint 24 und 25 sind konkret in `docs/status/jarvis-finance-status-roadmap-v0.3.md` geplant.
