trading-system-docs/tolaria/C5_SYNC_ARCHITECTURE_DESIGN.md

21 KiB
Raw Permalink Blame History

C5 — FORGEJO → TOLARIA SYNC ARCHITECTURE DESIGN

Datum: 2026-08-26 · Autor: Red Queen · Status: DESIGN — REVIEW / HUMAN_GATE (nicht implementiert) Mission: C5 DESIGN RECONCILIATION + FORGEJO DOCUMENTATION · Modus: STRICT READ-ONLY (Design-Doku, kein Code)

Verbindliches Architektur-Design für die automatische Synchronisation: FORGEJO (MASTER) → TOLARIA (DERIVED KNOWLEDGE) → SEARCH (DERIVED RETRIEVAL INDEX) Dieses Dokument ist die Source-of-Truth-Dokumentation des C5-Designs. Noch nichts gebaut.


0. Ausgangslage (verbindlich)

  • C3 KNOWLEDGE MODEL & MIGRATION = DONE (84 Objekte, object/<FULL_UUID>, role/representation-Split).
  • C4 SEARCH v1 = DONE — produktiver Search-Service: exact / keyword / metadata. Bewusst NICHT Bestandteil: semantic/vector/hybrid embeddings, pgvector, Qwen.
  • Grundarchitektur (darf C5 NICHT umkehren):
    • Forgejo = MASTER / SOURCE OF TRUTH
    • Tolaria = DERIVED KNOWLEDGE LAYER
    • Tolaria Search = DERIVED RETRIEVAL INDEX
  • Primäre Richtung: FORGEJO → TOLARIA → SEARCH. Tolaria/Search dürfen nie konkurrierender Source of Truth werden.

1. Current Baseline (reconciled 2026-08-26)

Komponente Live-Befund (EVIDENCE)
Forgejo (Master/SoT) nexo312/trading-system-docs, HEAD 4122bdd (Rain: fix(tolaria-search): repair admin rebuild source path), v8.0.3+gitea-1.22.0
Tolaria (Derived) /app/vault, 84 Objekte, HTTP-API :5173/api/vault/*
Search (Derived Retrieval) C4B, Port 8325, 84 Objekte, exact/keyword/metadata, Health: index_built=true, object_count=84, integrity_ok=true, secret_blocked=0, source_head=35446c03…
Vorhandener Sync-Code im Repo KEINER — nur tolaria/FORGEJO_TOLARIA_SYNC_PRINCIPLE.md (Doku, „NICHT IMPLEMENTIERT")
Webhooks KEINE eingerichtet
Automation a2a5 = Red-Queen-Orchestrierung (Mission/Heartbeat), kein Knowledge-Sync

Wiederverwendbare manuelle Basis (C3-Code, NICHT im Repo committet):

  • Forgejo-Write → Verify → Tolaria-Propagation → Read-Back → DRIFT=0 (C3D/C3I-Workflow)
  • Lokale Evidence-Skripte: /opt/data/c3d_evidence/propagate.py, drift_check.py, build_drafts.py
  • Tolaria-Write-Pfad: POST /api/vault/save {"path","content"} (mit /api/vault-Basis, 400 ohne path)
  • Search-Rebuild: POST /api/search/rebuild (Bearer TOLARIA_SEARCH_REBUILD_TOKEN) bzw. CLI rebuild.py

2. C4 REBUILD STATUS (korrigiert — Reconciliation)

STALE FINDING KORRIGIERT: Der frühere C5-Entwurf nannte den HTTP-Rebuild als defekt (server.py:25../c4a_evidence/…). Dieser Punkt wurde inzwischen durch Rain repariert und produktiv verifiziert.

  • HTTP_SEARCH_REBUILD_FIX = DONE — Commit 4122bdd (fix(tolaria-search): repair admin rebuild source path), server.py:25 jetzt os.path.join(os.path.dirname(__file__), "index_source.json").
  • C5D_DEPENDENCY_ON_C4_FIX = RESOLVED — kein zukünftiger C4-Fix mehr als offene Voraussetzung.
  • Live-Verifikation (Red Queen):
    • HTTP-Rebuild ohne Token → 403 (live gemessen)
    • HTTP-Rebuild mit autorisiertem Token → 200 SUCCESS, indexed=84, blocked=0, integrity_ok=trueRain-Claim, von Red Queen NICHT selbst live getestet (Token nicht in Env/Config verfügbar). Code-Fix committet + Pfad korrigiert = stützt den Claim, aber die 200-mit-Token-Antwort ist UNVERIFIZIERT durch Red Queen (Verifikationsgrenze).

3. Architektur-Entscheidungen (APPROVED DESIGN DIRECTION)

Entscheidung Wert
EVENT SOURCE Forgejo API/Git Polling — kein Webhook in v1
DEFAULT POLLING 60 Sekunden als Startwert. Konfigurierbar, nicht hart architektonisch festschreiben.
CONSISTENCY UNIT ein Forgejo Commit (atomar)
ORDER Forgejo Commit → Tolaria Propagation → Tolaria Read-Back → DRIFT=0 → Search Full Rebuild → Search Health → last_applied_commit
SEARCH UPDATE Full Rebuild nach relevantem Commit. Kein Incremental Search Update in v1.
DEPLOYMENT eigener C5 Sync Service / Container. NICHT: Search-Container, Tolaria-Container, Agent, Trading-System-Modul.

4. Agent Boundary (verbindlich)

AGENT → schreibt autorisiert AUSSCHLIESSLICH nach FORGEJO
C5    → propagiert deterministisch nach TOLARIA
C5    → aktualisiert danach SEARCH

NICHT: Agent → Forgejo, Agent → Tolaria, Agent → Search (einzeln). Dadurch bleibt Forgejo einziger Master und Split-Brain wird vermieden.


5. TOLARIA WRITE SECURITY — OPEN SECURITY GATE

SECURITY DEBT (real, im Design festzuhalten): POST /api/vault/save ist unauthentifiziert.

  • Drift Detection ist KEIN Ersatz für Zugriffskontrolle.
  • Vor späterer Hermes-Autonomie muss entschieden werden:
    • A) Tolaria Write API authentifizieren
    • B) Write API netzseitig so isolieren, dass nur der C5-Service schreiben kann
    • C) andere nachweislich gleichwertige Zugriffskontrolle
  • Noch NICHT härten. Aber als PRE_HERMES_SECURITY_GATE kennzeichnen.

6. C5 Human Gates

AUTO zulässig:

  • normale Content Changes
  • Metadata Changes
  • Tags
  • current/historical State Change
  • Rename/Move bei stabiler ID
  • eindeutig valide Source/Canonical-Paare
  • Search Full Rebuild

HUMAN GATE / FAIL CLOSED:

  • ID Collision
  • unexpected Tolaria Drift
  • Schema Violation
  • unknown object_id
  • dangling derived_from
  • ambiguous Delete
  • unbekannte Legacy Objects
  • unklare Source/Canonical-Beziehung
  • Security/Auth-Anomalie

7. Delete Policy

  • Keine automatischen Hard Deletes in C5 v1.
  • Delete/Supersede bleibt besonders kontrolliert.
  • Bevorzugt: state / tombstone / superseded gemäß Governance.
  • Ambiguität → HUMAN GATE.

8. Change Model

Änderung Tolaria-Aktion Search-Aktion Validierung Idempotenz Failure
NEW OBJECT save anlegen Full Rebuild Schema-valid, ID einmalig save→read-back FAIL_CLOSED
CONTENT CHANGE save überschreiben (Master-Kopie) Full Rebuild body-integrity vs Master Re-Write FAIL_CLOSED
METADATA CHANGE save (FM-Felder) Full Rebuild Enum (type/role/rep/state) Re-Write FAIL_CLOSED
STATE CHANGE FM state aktualisieren Full Rebuild current/historical Re-Write FAIL_CLOSED
RENAME path+aliases aktualisieren Full Rebuild ID stabil save neu + alt FAIL_CLOSED
MOVE path ändern, aliases erhalten Full Rebuild ID stabil save neu FAIL_CLOSED
DELETE state=archived/Tombstone (kein Hard Delete ohne Gate) Full Rebuild Governance-Nachweis Tombstone idempotent Human-Gate
SUPERSEDE state=superseded, supersedes-Relation Full Rebuild Nachfolger existiert idempotent FAIL_CLOSED
SOURCE/CANONICAL REL CHANGE derived_from aktualisieren Full Rebuild keine Dangles geordnet (Source zuerst) FAIL_CLOSED
TAGS CHANGE FM tags Full Rebuild Re-Write FAIL_CLOSED

9. Identity Model

  • C3-Regel verbindlich: object/<FULL_UUID>, ID immutable. Rename/Move/Content-Change ändern NIE die ID.
  • C5 erkennt Objekte primär über object_id, nicht über path. Frontmatter id: extrahieren, bei jedem Event mit dem Forgejo-Index abgleichen.
  • Path ist ein Alias/Lookup-Sekundärschlüssel, nie Primärschlüssel. Rename/Move pflegen aliases/Alt-Pfad-Lookups.
  • Legacy-Ausnahmen (README ×2, vps.md deferred): separat behandeln, KEEP_DISTINCT/DEFERRED — C5 darf diese nicht zusammenführen oder neu-vergeben.
  • Keine ID-Neuvergabe bei Collision → Human-Gate.

10. Source/Canonical Policy

  • representation = source / canonical / standalone (C3-Split, verbindlich).
  • Keine dangling derived_from: nur setzen, wenn die referenzierte object_id bereits produktiv existiert (Policy B).
  • Atomare/geordnete Regel bei Paar-Änderung (Root+Canonical): in einer Commit-Einheit synchronisieren — zuerst Source (Root, derived_from leer), dann Canonical (derived_from=Root-ID), nach Source-Existenz-Nachweis. C3B-PAIRED-Muster wiederverwenden.
  • Read-Back + DRIFT=0 pro Paar.

11. Polling & Commit Processing

  • Polling: Forgejo-API/Git-Polling, Default 60s, konfigurierbar. Pollt HEAD/git log seit last_applied_commit.
  • Verarbeitung pro Forgejo-Commit (atomare Einheit), nicht pro Datei. Ein Commit mit mehreren Dateien (Root+Canonical, Migration) = eine Transaktion.
  • Alle Änderungen eines Commits gegen Tolaria propagieren, bevor Search aktualisiert wird.
  • Commit wird erst als applied markiert, wenn Tolaria-Read-Back für alle betroffenen Objekte + DRIFT=0.

12. Idempotency Model

  • Sync-Identity: (commit_sha, object_id, operation) — stabil und deterministisch.
  • ALREADY_APPLIED: wenn commit_sha <= last_applied_commit oder die Ziel-object_id bereits die identische content_hash/metadata_hash trägt → skip (kein Doppel-Write, kein Fehler).
  • Tolaria-save + Read-Back ist naturgemäß idempotent (gleicher Inhalt → gleicher Hash).

13. Ordering Policy

Szenario Verhalten
B vor A verarbeitet Commit-Reihenfolge erzwungen; C5 verarbeitet nur last_applied..HEAD in git-log-Ordnung; out-of-order → zurückstellen
Webhook doppelt Idempotenz via commit-SHA: ALREADY_APPLIED → skip
Webhook verloren Unkritisch bei Polling — HEAD-Scan holt alles nach
Service offline Beim Wiederstart: Replay ab last_applied_commit
Search vor Tolaria Verboten — Reihenfolge erzwungen; Search-Update erst nach Tolaria-DRIFT=0

Replay/Ordering-Policy: Nur vorwärts, monotone last_applied_commit. Out-of-order Events werden nicht erzwungen, sondern wartend zurückgestellt bis die Vorgänger-Commits angewendet sind.


14. Drift & Conflict Policy

  • Vergleichsbasis: (object_id, content_hash, metadata_hash, source_commit) je Objekt.
  • DRIFT DETECTED (Tolaria ≠ Forgejo bei einem Feld) → keine blinde Überschreibung. Reconciliation / Alert / kontrollierter Repair.
  • EXPECTED DERIVED CHANGE (C5 selbst hat geschrieben, Read-Back = Master) → kein Konflikt.
  • UNEXPECTED TOLARIA MUTATION (Tolaria ≠ Master, ohne dass C5 schrieb, z. B. über unauthentifizierten save oder UI) → FAIL CLOSED: Evidence erfassen, kein automatisches Überschreiben, Human Review (C3-CONFLICT-Prinzip).

15. Tolaria Propagation Model

  • Wiederverwenden: propagate.py-Muster (C3D) — POST /api/vault/save mit /api/vault-Basis, per Datei Write → Read-Back → Hash-Match, dann DRIFT=0.
  • Kein Blind-Batch; pro Objekt verifizieren. Frontmatter erhalten (_organized, knowledge_schema, id, derived_from).

16. Search Rebuild Model

  • Full Rebuild nach relevantem Commit (v1). ~84 Objekte, stdlib-only, <1s — Einfachheit schlägt Incremental.
  • Kein Incremental Search Update in v1.
  • HTTP-Rebuild-Pfad funktioniert (C4-Fix 4122bdd committet; ohne Token 403, mit Token 200 laut Rain — Red-Queen-Verifikationsgrenze siehe §2).

17. Search Ordering (verbindlich)

Forgejo-Commit bestätigt
→ Tolaria aktualisieren (per Objekt)
→ Tolaria Read-Back → DRIFT=0
→ Search Full Rebuild
→ Search Health (object_count=84, supported_modes, integrity_ok)
→ Sync Event DONE (last_applied_commit fortschreiben)

Prinzip: Search zeigt nie einen Stand, den Tolaria nicht erreicht hat.


18. Failure Matrix

Fehler Verhalten Retry Rollback Queue Human Gate
Forgejo unavailable FAIL CLOSED, keine Propagation Backoff-Retry pending (HEAD unbekannt) nach Max-Retry
Tolaria unavailable FAIL CLOSED, Search nicht updaten Backoff-Retry Commit pending nach Max-Retry
Search unavailable Tolaria evtl. schon propagiert; Search-EVENT pending Backoff-Retry Search-Step pending nach Max-Retry
Auth failure FAIL CLOSED wenige Alert
Network timeout FAIL CLOSED Backoff nach Max
Malformed Frontmatter FAIL CLOSED pro Objekt nein Objekt nicht anwenden Rest des Commits? → commit-atomic Alert
Invalid knowledge_schema FAIL CLOSED nein skip Objekt Alert
Unknown object_id FAIL CLOSED nein skip Alert
ID collision FAIL CLOSED nein skip Human Gate
dangling derived_from FAIL CLOSED nein skip bis Source existiert geordnet Alert
partial commit processing FAIL CLOSED — Commit nicht als applied markieren Replay ab unvollständigem
Tolaria drift (unexpected) FAIL CLOSED nein kein Überschreiben Human Review
Search rebuild failure FAIL CLOSED — Event nicht DONE Backoff Tolaria bleibt korrekt Alert
duplicate event Idempotent (ALREADY_APPLIED)
out-of-order event zurückstellen bis Vorgänger wartend
delete ambiguity FAIL CLOSED nein kein Delete Human Gate

19. Retry Policy

  • Begrenzte Retries (z. B. 35) mit exponentiellem Backoff (1s→2s→4s…). Kein Endlos-Loop.
  • Nach Max-Retry → DEAD/FAILED STATE für das Event: Evidence (Log-Eintrag, Payload, commit_sha), Alert an Operator, last_error setzen. Keine stille Aufgabe.
  • Ein DEAD-Event blockiert nicht die Queue, wird aber bis Human-Review nicht übersprungen (oder explizit FAILED markiert mit Human-Review-Pflicht).

20. Recovery / Replay Model

  • Persistenter last_applied_commit (Single Source of Truth für Fortschritt).
  • Replay ab Commit: Beim Start/Recovery alle Commits last_applied_commit..HEAD erneut verarbeiten (idempotent).
  • Full reconciliation: auf Anforderung/Drift — alle 84 Objekte Master↔Tolaria↔Search vergleichen, Drift melden, nicht blind neu schreiben.
  • Search rebuild: Full Rebuild ist Teil des Normalwegs (§16).

21. Bootstrap Model

Beim ersten Start: Reconciliation zuerst, kein „alles neu schreiben".

  1. Forgejo-HEAD lesen.
  2. Tolaria-IST-Stand lesen (84 Objekte).
  3. Search-IST-Stand lesen.
  4. Reconciliation Master↔Tolaria: nur identifizierte Abweichungen, mit Drift-Policy (§14), nicht blind propagieren.
  5. Danach last_applied_commit = aktueller Forgejo-HEAD als Baseline setzen (nur wenn Reconciliation sauber / Abweichungen dokumentiert + behandelt).
  6. Erst dann Normalbetrieb.

22. Security Model

  • Minimal-Prinzip: C5 bekommt nur, was nötig ist.
    • Forgejo: READ-Token/Polling (Sync-Reader) — kein WRITE (C5 schreibt nie nach Forgejo).
    • Tolaria: nur erforderlicher Derived-Write (save) — unvermeidbar, aber isoliert + Drift-watch.
    • Search: nur TOLARIA_SEARCH_REBUILD_TOKEN (Bearer).
  • Keine Tokens im Repo, in Logs, in Reports, im Image. Secrets via Env/Secret-Manager, ephemer.
  • FINDING (bestehend): Tolaria-save ist unauthentifiziert → PRE_HERMES_SECURITY_GATE (§5); bis dahin Drift-Watch als Kompensation.

23. Observability & Health

Observability (minimal, keine Content-/Secret-Logs): last_seen_commit · last_applied_commit · sync_status · objects_changed · tolaria_drift · search_status · retry_count · last_error · last_success_at

Health Contract: status · forgejo_reachable · tolaria_reachable · search_reachable · last_seen_commit · last_applied_commit · pending_commits · failed_commits · drift_count


24. Resource Budget

  • VPS-Bewertung: sehr klein. CPU/RAM: <0.5 CPU, <128MiB (Python + Polling + 84-Obj-Diff). Disk: minimal (kein Vault-Kopie-Volume nötig — nur derived Index + State). Netzwerk: nur Polling-Intervall + Propagate-Requests (niedrig).
  • Kein LLM, keine Embeddings, keine Vector-DB (C5 ist reiner Sync, kein Retrieval).

25. Deployment Model

RECOMMENDED_ARCHITECTURE: eigener C5-Sync-Container — isolierte Failure Domain (Ausfall von C5 beeinträchtigt weder Search noch Tolaria), isolierte Secrets, eigener Recovery/Replay, agentenunabhängig, konsistent mit dem C4-Architekturprinzip (eigene Domain je Service).

NICHT: Search-Container, Tolaria-Container, Agent, Trading-System-Modul.


26. Test Plan (C5-Testkorpus)

new object · content edit · metadata edit · rename · move · state change · paired source/canonical · delete · supersede · duplicate event (idempotenz) · lost event/replay · out-of-order · Tolaria down · Search down · drift (unexpected mutation) · invalid schema · secret safety · ID collision · dangling derived_from.


27. Canary Plan

Sicherer C5-Canary: eigens erzeugtes Test-Knowledge-Object (Governance-erlaubt), keine kritischen Trading-Dokumente. Rollbackbar (Forgejo-Revert + Tombstone). Ablauf: Test-Object in Forgejo → C5 propagiert → Tolaria-Read-Back → Search → Health → Rollback → Drift=0. In dieser Mission NICHT ausgeführt (STRICT READ-ONLY).


28. Implementation Phases

Phase Inhalt
C5A Contract & State-Machine (Events, Zustände, last_applied_commit, FAIL/DEAD)
C5B Sync-Engine (Polling, Diff, Change-Detection, Idempotenz, Ordering)
C5C Tolaria-Propagation (Wiederverwendung C3-propagate.py-Muster, Drift, Read-Back)
C5D Search-Integration (Full-Rebuild nach Commit, Health) — C4-Fix bereits RESOLVED
C5E Failure/Replay/Recovery + Observability + Health-Contract
C5F Canary (§27)
C5G Acceptance (Exit-Criteria + Fresh Checker + CC-Close)

29. C5 Exit Criteria

  • Forgejo bleibt Master (kein Rückschreib) ✓
  • Deterministische Propagation (Forgejo→Tolaria→Search) ✓
  • Idempotent (doppelte Events = ALREADY_APPLIED) ✓
  • Ordering-safe (Commit-Reihenfolge, out-of-order zurückgestellt) ✓
  • Replaybar (last_applied_commit, Replay nach Ausfall) ✓
  • Drift-aware (Erkennung, kein blindes Überschreiben) ✓
  • Fail-closed bei Konflikten/unexpected drift ✓
  • Search erst nach Tolaria (kein vorzeitiger Search-Stand) ✓
  • Keine dangling relations (derived_from-Policy) ✓
  • Keine ID-Neuvergabe ✓
  • Keine Secrets in Logs/Reports/Image ✓
  • Recovery getestet (Replay + Full-Reconciliation) ✓
  • Canary PASS ✓

30. Hermes Handoff

Was kann Hermes NACH C5 sicher tun, was er VOR C5 nicht sicher tun sollte? Nach C5 kann Hermes autorisiert nach Forgejo schreiben und sich darauf verlassen, dass die Propagation nach Tolaria + Search deterministisch, idempotent und in richtiger Reihenfolge erfolgt — ohne dass Hermes selbst die Vault-API oder Search-Rebuild improvisieren muss. Das beseitigt das heutige Risiko von (a) vergessener/inkonsistenter Propagation, (b) unkoordinierten Direkt-Schreiben nach Tolaria (Split-Brain), (c) manueller Fehleranfälligkeit.

Was fehlt danach noch für echte Hermes-Autonomie?

  1. Autorisierter Write-Zugang von Hermes nach Forgejo (Gate/Token) — noch nicht eingerichtet.
  2. Human-Gate-Freigabe für autonome Wissens-Mutationen (C5-Deployment + Hermes-Schreibberechtigung).
  3. Ein Agent-Write-Policy/Approval-Gate, das festlegt, was Hermes autonom schreiben darf vs. Human-Review.
  4. Produktives Deployment von C5 (nicht nur Design) + Canary-PASS.
  5. PRE_HERMES_SECURITY_GATE (§5): Tolaria-Write-Zugriffskontrolle entscheiden, bevor Hermes autonom schreibt.

Hermes-Autonomie NICHT implementiert — nur Handoff analysiert.


31. PRE_HERMES_SECURITY_GATE

Verbindlich vor jeder Hermes-Autonomie: Der unauthentifizierte POST /api/vault/save ist reale Security Debt. Drift Detection ist KEIN Ersatz für Zugriffskontrolle. Entscheidung nötig: A) Tolaria Write API authentifizieren · B) Write API netzseitig isolieren (nur C5-Service) · C) andere nachweislich gleichwertige Zugriffskontrolle. Noch NICHT härten. Gate bleibt offen bis Christian entscheidet.


32. Open Questions

  1. C5-Deployment-Container: welcher Executor/Host-Zugang (wie C4)?
  2. Tolaria-save-Härtung (Auth/Whitelist) vor oder mit C5? (PRE_HERMES_SECURITY_GATE)
  3. Polling-Intervall (Default 60s) — akzeptabel? (konfigurierbar)
  4. Soll Hermes einen Write-Zugang nach Forgejo erhalten (Phase 2)?
  5. HTTP-Rebuild-200-mit-Token: von Red Queen nicht selbst live getestet (Token nicht verfügbar) — Verifikation durch autorisierten Executor empfohlen.

33. Command Center Recommendation (nicht gesetzt)

  • C4 = DONE
  • C5 DESIGN = REVIEW / HUMAN_GATE
  • C5 IMPLEMENTATION = PENDING
  • NEXT: C5 Human Gate / C5A Contract & State Machine
  • C5 NICHT DONE. Keine Implementierung starten.

Ende des C5 Sync Architecture Design. Status: DESIGN — REVIEW / HUMAN_GATE. Kein Code, kein Container, kein Poller, kein Webhook, kein Tolaria-Write.