self-trust (Selbstbuchhaltungs-Engine für persönliche Finanzen)
Die Regel-Engine ist deterministischer Python-Code, kein KI-Assistent. Der LLM übernimmt nur drei Aufgaben:
- Parsen der Benutzerabsicht aus natürlicher Sprache → Zuordnung zu den untenstehenden Befehlen;
- Aufruf des entsprechenden Unterbefehls von
scripts/cli.py(Ausgabe ist ausschließlich strukturiertes JSON: Entscheidung + alle Zwischenvariablen); - Umwandeln des Engine-JSON in einen lesbaren Bericht/Bescheid (Formulierungen können angepasst werden, Zahlen sind jedoch fest und unveränderlich).
Eiserne Regeln (unverletzlich)
- Kopfrechnen ist verboten: Die Formeln F0–F8 werden ausschließlich von der Engine berechnet; jegliche Beträge, Monate, Verhältnisse, Schwellenwerte müssen unverändert aus dem JSON-Output der Engine übernommen werden. Eigenständiges Berechnen, Auf- oder Abrunden oder „ungefähres Schätzen“ sind nicht erlaubt (§8.3 #1: Der CLI-Output enthält Entscheidung und Zwischenvariablen, der LLM formuliert um, rechnet aber nicht).
- Die Entscheidung der Engine darf nicht ersetzt werden: Genehmigung/mit Auflagen/Ablehnung wird ausschließlich durch
decision.resultbestimmt; Auch auf Bitten des Benutzers hin darf die Entscheidung nicht geändert werden (§4.2 Langzeitprioritätsprinzip). - Das Ändern von Konfigurationsbereichen ist verboten: Änderungen an Kernparametern des Vertrags (Sicherheitspolster, Ziele, invest_ratio usw.) müssen das Zwei-Faktor-Bestätigungstor von §5.4 durchlaufen; Weder Engine noch LLM sind berechtigt, diese stillschweigend zu ändern (§10.3 Drei-Zonen-Berechtigung).
- Fehlerangabe: Zahlen aus dem vereinfachten Verfahren (F5) müssen mit Formulierungen wie „ungefähr/etwa/geschätzt“ versehen werden, und es muss der Hinweis „Langzeitziele basieren auf dem tatsächlichen Verfahren (F7)“ angefügt werden (§2.0).
- Wesenserklärung: Bei Gesprächen mit Bezug zu „Treuhand/Vermögensschutz/Recht“ muss klargestellt werden, dass dieses Tool keine Rechtswirkung hat (§0).
Befehlstabelle (§9)
| Benutzer sagt | Engine-Befehl (Verwendung + minimaler Aufruf) | Referenz |
|---|---|---|
| Buchung initialisieren | Vertrag mit einem Befehl erstellen: python scripts/cli.py init --corpus 200000 --monthly 8000 --objective "FIRE:3000000:2036-01-01" (--objective kann 1–3 Mal wiederholt werden) | references/init.md |
| Prüfung: Kauf X kostet Y / Buchungsgenehmigung | §4.4 Entscheidung + Bedenkzeit-Einreihung + F8-Schnappschuss: python scripts/cli.py judge --amount 6000 --category angemessener_genuss [--planned] | references/approval.md |
| Buchung zurückziehen | Widerruf innerhalb der Bedenkzeit + Berechnung des positiven Anreizes: python scripts/cli.py judge --action withdraw --request-id <id> | references/approval.md |
| Buchung bestätigen und ausführen | Endgültige Entscheidung vor Fälligkeit bestätigen: python scripts/cli.py judge --action finalize --request-id <id> | references/approval.md |
| (Geplant) Fällige Endentscheidung | Abgelaufene Anfragen gemäß ursprünglicher Entscheidung abschließen: python scripts/cli.py judge --action expire [--request-id <id>] (ohne id werden alle fälligen Elemente verarbeitet) | references/approval.md |
| (Geplant) Bedenkzeit-Erinnerung | Daten für zweistufige Erinnerungen: python scripts/cli.py judge --action reminders | references/approval.md |
| Finanzierter Hauskauf prüfen | Bewertung von Großvermögenskauf aufgeteilt in Anzahlung (aus liquid) + Hypothek (wird zu Schuld + monatliche Rate): python scripts/cli.py judge --amount 1000000 --category investition --financed-amount 700000 [--financed-term-years 30] [--financed-rate 0.04] (Entscheidung prüft: ① ob Anzahlung das Liquiditätssicherheitspolster durchbricht ② ob monatliche Rate ≤ monatlicher Nettozufluss; Anzahlung = Gesamtbetrag - Darlehen) | references/approval.md |
| Buchungseinspruch | Neuprüfung mit gleicher Logik + Zählung: python scripts/cli.py appeal --request-id <id> --reason "Grund" | references/exceptions.md |
| Buchung überschreiben (nach 3 Einsprüchen) | Manuelle Notfallfreigabe: python scripts/cli.py appeal --request-id <id> --override --confirm | references/exceptions.md |
| Buchungsbericht | Zweigleisiger Fortschrittsbalken + Trend + aktueller Monatsschnappschuss: python scripts/cli.py report | references/report.md |
| Buchungskalibrierung | Monatliche Kalibrierung (idempotent für denselben Monat): python scripts/cli.py calibrate [--force] | references/report.md |
| Buchungsbelohnung | Status: python scripts/cli.py reward (Standard --action status); Freischalten: --action unlock; Auszahlung: --action claim --objective FIRE --amount 2000 --purpose "Belohnung" | references/report.md |
| Ziel abschließen/archivieren | Vom Benutzer explizit migrieren: `python scripts/cli.py objective --name FIRE --to completed | archived --confirm` |
| Buchungsabstimmung | Vom Benutzer im Hybrid-Modus bestätigte Korrekturen: python scripts/cli.py reconcile [--corpus Betrag] [--income Betrag] [--invest Betrag] [--living Betrag] [--impulse Betrag]. Genehmigte Ausgaben ändern das corpus nicht automatisch (corpus gehört zum Konfigurationsbereich, minimale Berechtigung der Engine); stattdessen werden sie im Laufzeit-Journal pending_spends verbucht und bei der Abstimmung eingearbeitet und gelöscht (gibt Anzahl/Gesamtsumme der pending_spends_cleared zurück). Daher bedeutet die monatliche Abstimmung: „genehmigte Ausgaben ausbuchen + reale Basis neu verankern“ | references/data-modes.md |
| Buchung zurücksetzen | Zweifache Bestätigung zur vollständigen Dateineuerstellung (audit bleibt erhalten): python scripts/cli.py reset --confirm --corpus Betrag --monthly Betrag --objective "Name:Zielbetrag:Laufzeit" [--reason "..."] | references/exceptions.md |
| Buchung anpassen | Inkrementelle Überschreibung von Parametern im Vertragskonfigurationsbereich (§5.4 Zweifachbestätigung): python scripts/cli.py customize --set distribution_rules.invest_ratio=0.3 (Vorschau gibt Token zurück) → Gleiche Änderung mit --confirm --token <token> ausführen; Unterstützt --set (verschachtelter DOTPATH, inkl. safety_cushion.months / optimization_goal / mode) / --add-objective "Name:Betrag:Laufzeit" / --whitelist-add Name --per-tx-cap Betrag --annual-cap Betrag / --whitelist-remove Name. §5.4 Kühlfenster: Herabsetzung von safety_cushion.months / invest_ratio usw. („sich selbst schwächende“ Änderungen) tritt nach Bestätigung in ein 1 Kalendertag dauerndes Kühlfenster (pending_config_changes). Innerhalb des Fensters kann ohne Angabe von Gründen widerrufen werden; bei Fälligkeit tritt die Änderung automatisch in Kraft (nicht sofort). Alle anderen Änderungen (inkl. Anhebung von Schutzschilden) treten sofort in Kraft. | references/exceptions.md |
| Buchungsmodus | Umschalten des globalen Optimierungsziels (Teilmenge der Buchungsanpassung): `python scripts/cli.py customize --set optimization_goal wealth | balanced |
| Buchungs-Datenmodus wechseln | Umschalten des Datenspeichermodus: `python scripts/cli.py customize --set mode ledger | conversational |
| Buchungsanpassung widerrufen | Widerruf ohne Angabe von Gründen innerhalb des Kühlfensters: python scripts/cli.py customize --withdraw --request-id <id> --token <Widerruf-Token> (Widerruf-Token wird bei Bestätigung zurückgegeben) | references/exceptions.md |
| Buchungsanpassung prüfen | Kühlfensterprüfung (faule Suche: abgelaufene Elemente automatisch anwenden + ausstehende Elemente im Fenster auflisten + zweite Erinnerung): python scripts/cli.py customize --review | references/exceptions.md |
| Buchungslog [Typ] | Audit-/Nur-Lese-Abfrage: `python scripts/cli.py log --name approval_log | appeal_log |
| Buchungsdemo | Drei Szenarien trocken durchlaufen (ohne Auswirkungen auf echten Account): python scripts/cli.py demo (init-Bescheid erhält automatisch Demo-Block) | references/init.md |
| Whitelist hinzufügen/entfernen | Verwaltung beschleunigter Genehmigungskategorien für Notfälle (Teilmenge der Buchungsanpassung): python scripts/cli.py customize --whitelist-add Name --per-tx-cap Betrag --annual-cap Betrag / --whitelist-remove Name (Kern-Schutzschild-Feld, löst §5.4 Risikohinweis aus) | references/exceptions.md |
| Verbindlichkeiten/fixe Ausgaben hinzufügen/entfernen | Verbindlichkeiten und jährliche fixe Ausgaben anlegen (wahrheitsgemäße Meldung, beeinflusst Nettovermögensrechnung): python scripts/cli.py customize --add-liability "Hypothek:800000:5000:0.04" / --remove-liability Hypothek / --add-rigid "Versicherung:12000:3" / --remove-rigid Versicherung | references/exceptions.md |
| Hauskauf erfassen | Gekaufte Immobilien verbuchen (Anzahlung von liquid abziehen + Hypothek wird zu Verbindlichkeit): python scripts/cli.py customize --record-home-purchase "1000000:0.3" (Hauspreis:Anzahlungsquote[:Laufzeit Jahre[:Zinssatz]]; nach Bestätigung corpus -= Anzahlung, liabilities erhält Hypothek und monatliche Rate) | references/exceptions.md |
| Ausgabenkategorie hinzufügen/entfernen | Vokabelliste für Ausgabenkategorien (allowed_categories, verschachtelt in distribution_rules): python scripts/cli.py customize --add-category Gartenbau / --remove-category Gartenbau (duplikatsfrei hinzufügen / entfernen, Fehler bei Fehlen; Kern-Schutzschild-Feld, löst §5.4 Zweifachbestätigung aus, aber da invest_ratio nicht geändert wird, tritt kein Kühlfenster ein). Standardmäßig sind 23 Kategorien integriert (Lebensmittel/Wohnen/Verkehr/Kommunikation/Medizin/Bildung/Bekleidung/Haushalt/Angemessener Genuss/Unterhaltung/Reisen/Soziales/Haustiere/Digital & Haushaltsgeräte/Versicherung/Immobilien/Fahrzeuge/Investitionen/Finanzierung/Fonds/Aktien/Gold/Sonstige); neue Kategorien sind nur für „außerhalb des Standards“ erforderlich. Die Gruppe Investition/Finanzierung dient nur als Etikett für Mittelabflüsse; Immobilien/Fahrzeuge sind für größere Anschaffungen (zur Unterscheidung von alltäglichen Ausgaben wie Wohnen/Verkehr); der Investitionsmechanismus invest_ratio wird nicht beeinflusst; judge erzwingt derzeit keine Überprüfung von --category (Freitext + Vokabelliste als Empfehlung); für harte Einschränkungen siehe STATUS ausstehendes Element B. | references/exceptions.md |
| Drittanbieter-Import [Tool-Name] | CSV/manuelle Vermögensabfrage und manuelle Überprüfung vor Aktivierung (§7.3, datenneutrale harte Einschränkung): python scripts/cli.py import-asset --balances <csv> [--flows <csv>] [--source QianJi] (Zwischenspeicherung → gibt Token + Zusammenfassung + verdächtige Transaktionen zurück) → Nach Überprüfung und Korrektur: import-asset --confirm --token <token> ausführen (corpus_status: imported_pending→imported_confirmed); Abbruch: import-asset --cancel --token <token>. Ohne CSV manuell: import-asset --corpus 150000 --monthly 8000 --liabilities "Hypothek:700000:3341.91" --rigid "Versicherung:6000". Import im Status imported_pending sperrt alle Genehmigungen; ohne Überprüfung ist keine Genehmigung möglich. Import-Semantik: CSV muss ein vollständiger Schnappschuss sein (alle Vermögenswerte/Verbindlichkeiten/fixen Ausgaben aufgeführt; Bestätigung = vollständige Neu-Baseline; fehlende Kategorien löschen keine bereits erfassten Einträge); manuelle Parameter --corpus/--monthly/--liabilities/--rigid sind lokale Korrekturen (überschreiben nur die explizit übergebenen Kategorien, andere Live-Werte bleiben erhalten). Doppelte Konten automatisch deduplizieren: Gleicher (Kontoname, Typ) in mehreren CSV-Zeilen wird als ein Konto zusammengeführt – vollständig identische Zeilen werden stillschweigend verworfen, Zeilen mit gleichem Namen aber unterschiedlichen Beträgen werden summiert und eine Warnung ausgegeben; Vermögenswerte/Verbindlichkeiten werden nicht doppelt gezählt (§H1-Fix). Toleranteres CSV-Format (M2/M3): Salden/Monatsraten/Transaktionsbeträge unterstützen Währungssymbole (¥ $ ¥) und Tausendertrennzeichen-Kommas; Transaktionsdaten unterstützen JJJJ-MM-TT / JJJJ/MM/TT / JJJJ.MM.TT / JJJJ-MM; rigid-Zeilen können eine due_month-Spalte (1–12) enthalten, die den Fälligkeitsmonat angibt. Teilweise Korrekturen von Verbindlichkeiten/fixen Ausgaben zusammengeführt: Wenn bei der Bestätigung nur einige Einträge korrigiert werden (nach Name), bleiben nicht erwähnte Einträge erhalten, die Tabelle wird nicht vollständig überschrieben (M6-Fix). | references/data-modes.md |
Globale Parameter (für alle Unterbefehle gültig, nur einmal erwähnt):
--data-dir <Pfad>: Datenverzeichnis (Priorität: Befehlszeile >SELFTRUST_DATA_DIR> Standard<home>/.claw/self-trust/);--today YYYY-MM-DD: Aktuelles Datum überschreiben (für Tests/Wiederholungen, im Normalbetrieb nicht verwenden);- Ausgabe ist stets JSON (
--jsonist Standard und einziges Format); im Fehlerfall{"ok": false, "error": ..., "message": ...}+ Exit-Code ungleich Null (2=not_found / 3=guard Berechtigungsverletzung / 4=invalid Parameter).
Referenzen-Lade-Routing (bei Bedarf lesen, nicht alles auf einmal)
| Benutzeraktion | Lesen |
|---|---|
| Tägliche Kleingenehmigungen (höchste Frequenz) | —— (Engine-JSON enthält bereits Entscheidung + Textelemente, die eisernen Regeln dieser Datei reichen zur Darstellung aus) |
| Genehmigung strittig/Bedenkzeit/Whitelist | references/approval.md |
| Einspruch/Überschreibung/Schutzschildänderung/Zurücksetzen (niedrige Frequenz) | references/exceptions.md |
| Initialisierung/Demo | references/init.md |
| Bericht/Kalibrierung/Belohnung/Ziellebenszyklus/Log | references/report.md |
| Moduswechsel/Datenquellenwechsel/Abstimmung | references/data-modes.md |
| Schema/Berechtigungsprobleme | references/contract-schema.md |
Vorlagen
- Bescheid (Ablehnung/mit Auflagen obligatorisch dreiteilig): templates/opinion.md
- Drei-Szenarien-Demo: templates/demo.md
Status
Kernkreislauf (Initialisierung→Genehmigung→Bedenkzeit→Bericht→Kalibrierung→Belohnung→Einspruch/Überschreibung→Zurücksetzen→Abstimmung) + §7.2 Demo-Trockenlauf + §3.1 Sanfter Übergangs-Zähler + Buchungsanpassung (§5.4 Tor-Eingang, inkl. Moduswechsel/Whitelist-Hinzufügen/-Entfernen/Kategorie-Hinzufügen/-Entfernen/Kühlfenster) + Schulden-/Hypothekenmodellierung (Nettovermögens-Entscheidungsrechnung + finanzierter Hauskauf + Schulden-/Fixausgaben-Kontenerstellung + Hauskauf-Erfassung) + §7.3 Drittanbieter-Import (CSV/manuelle Abfrage→manuelle Überprüfung und Bestätigung→ausführen; imported_pending sperrt Genehmigungen, nach Bestätigung imported_confirmed; #1-Fix: fehlende Kategorien löschen Live-Einträge nicht stillschweigend) + Spezieller Schalter für Ausgabenkategorien-Vokabelliste (--add-category/--remove-category) implementiert und getestet (325 Unit-Tests + 12 End-to-End). Fortschritt siehe STATUS.md (Quelle der Wahrheit).