# Sprint 0 – P0 PR Handoff

## Ziel

FinanceManager 2.0 startet mit einer reproduzierbaren Security-/Arbeitsbaseline, fail-closed HTTP-Writes und klarer Beta-Kennzeichnung der bisherigen Advisor-Ausgabe.

## Scope

- sichtbare Umbenennung in **Allokations- und Datenchecks (Beta)**;
- verifizierte `execution_allowed=false`-Contracts;
- standardmäßig deaktivierte HTTP-Writes;
- optionaler `local_only`-Modus ausschließlich für Loopback-Quelladressen;
- redigierte Runtime-/Restart-Diagnosen;
- Git-aware Klartext-Secret-/Repository-Safety-Scan;
- reproduzierbare Backend-/Frontend-Gates;
- Sprint-0-Entscheidungsbaseline, Agentenregeln und PR-Vorlage.

## Nicht-Scope

- Portfolio-Performance;
- neue Portfolio-, Budget-, Import- oder Research-Funktionalität;
- Tailscale-Browser-Authentifizierung;
- Rollen-/Mehrbenutzersystem;
- Provider- oder Secret-Rotation;
- Deployment, Merge oder Remote-Push;
- automatische Orderausführung.

## Ausgangsrisiko

Der OpenAPI-Preflight identifizierte 148 schreibfähige Route-Operationen ohne Security-Scheme. Preview-Endpunkte und echte Mutationen waren HTTP-seitig gleich behandelt. CORS ist keine Authentifizierung und verhindert direkte API-Aufrufe nicht.

## Migration

Keine Schema- oder Runtime-Datenmigration. Der operative Startparameter ändert die Write-Posture:

- ohne Konfiguration: `disabled`;
- `local_only`: Writes nur von Loopback;
- `test`: ausschließlich für den TestClient-Quellhost.

Unbekannte Werte fallen auf `disabled` zurück.

## API-Contract

- `POST`, `PUT`, `PATCH` und `DELETE` liefern im Standardmodus `403` mit einem generischen Fehlercode.
- Tailscale-Quelladressen bleiben auch in `local_only` gesperrt.
- `GET /api/runtime/status` behält das Feld `db_path`, liefert dort aber nur noch ein nicht-pfadförmiges Statuslabel; `write_mode` zeigt die aktive Sperre.
- Restart-Antworten und Restart-Status enthalten keine lokalen Script-/Logpfade und keine Prozess-ID mehr; stattdessen nur Komponente und boolesche Start-/Logverfügbarkeit.
- Der Portfolio-Snapshot trägt den Titel `Allokations- und Datenchecks (Beta)`.
- Advisor-/Trader-Execution bleibt `false`.

## Tests

### Testbaseline-Audit

Auf dem unveränderten Basis-SHA waren zehn Altfehler reproduzierbar: fünf datumsabhängige Budgettests, ein Crypto-Trader-Routentest, zwei Overview-Tests sowie zwei Portfolio-Advisor-Tests. Die frühere Angabe von acht Fehlern stammte aus einem vollständigen Testlauf im bereits veränderten Sprint-0-Arbeitsstand. Dort waren der frische synthetische Preiszeitpunkt und der öffentliche Portfolio-Routentest bereits korrigiert, sodass nur acht Fehler sichtbar blieben. Ein späterer vollständiger Lauf im separaten, direkt vom Basis-SHA erstellten Worktree reproduzierte alle zehn Fehler.

Alle zehn Testkorrekturen liegen nun ausschließlich im vorgelagerten Baseline-Commit. Sprint 0 baut auf dieser grünen Baseline auf; sein Diff enthält weder die Preiszeitpunkt- noch die Routentest-Reparatur erneut.

Verbindlich vor Übergabe:

```bash
make PYTHON=.venv/bin/python verify
git diff --check
```

Zusätzlich fokussiert: Write-Gate, Runtime-Redaktion, Restart-Redaktion, Advisor-Contract und Secret-Pattern-Regressions.

Der bestehende Whole-Repo-Ruff-Check ist wegen historischer Schulden nicht grün und wird nicht als bestanden ausgewiesen. Neue/geänderte Python-Dateien werden separat geprüft.

## UAT

Mit synthetischen TestClients:

1. GET-Health bleibt erreichbar.
2. Remote-/Tailnet-POST wird ohne Serviceaufruf mit `403` blockiert.
3. Loopback-POST funktioniert nur bei explizitem `local_only`.
4. Runtime-Status enthält keinen lokalen Pfad.
5. Portfolio-Seite zeigt die neue Beta-Bezeichnung und weiterhin „keine Order-Ausführung“.

## Rollback

Branch/PR vollständig revertieren. Keine Runtime-Daten wurden migriert. Ein Rollback darf die API nur nach bewusster Security-Entscheidung wieder schreibend exponieren.

## Entscheidungserklärung

Tailscale ist Transport-/Netzgrenze, nicht Benutzer-Authentifizierung. Bis zur separaten Session-/CSRF-/Audit-Entscheidung ist FinanceManager remote read-only. Diese Entscheidung ersetzt keine spätere Authentifizierung, verhindert aber anonyme Mutationen als sichere Minimalbaseline.
