Files
ClawdDotNet/docs/Roadmap.md
T
RichardandClaude Opus 5 2853541629 Fruehjahrsputz: WinForms-Altlast entfernt, Dokumentation nachgezogen
Die Avalonia-Portierung ist abgeschlossen, damit ist die in ClawdDotNet.slnx
angekuendigte Aufgabe "WinForms-Oberflaeche entfernen" faellig. Der Stand
davor liegt unter dem Tag vor-fruehjahrsputz-2026-08.

Entfernt (56 Dateien, seit dem Herausloesen der Anwendungsschicht nicht mehr
Teil des Builds): ClawdDotNet.csproj, Program.cs, sieben frm_*-Formulare,
UI/, Models/, EmbeddedUI/, Properties/, Resources/, Services/, das alte
Anwendungssymbol und Deploy-Build.ps1 (ersetzt durch deploy/publish.py).
Dazu configs/*.json - Beispielkonfigurationen aus der Zeit vor dem
Instanzverzeichnis, auf die nur noch die alten Prompts verwiesen.

Die vier Entwicklungs-Prompts der Anfangszeit ziehen nach docs/archiv/ um,
mit README, das ihren Stand einordnet. Eine Regel darin gilt weiter - die
Pflichtfelder fetchedAt/dataAsOf/source der Internet-Tools -, deshalb
Archiv statt Loeschen; der WebSearch-Plan verweist auf den neuen Pfad.

Toter Code
- PlaceholderPageViewModel samt Ansicht: Es gibt keinen Platzhalter-Bereich
  mehr, seit alle neun Seiten portiert sind.
- Snappier als direkter Paketverweis: MongoDB.Driver loest es ohnehin auf
  dieselbe Fassung auf, der Verweis hob nichts an.

Zwei Fehler, die dabei sichtbar wurden
- Die taegliche Sicherung lief ins Leere. Die Oberflaeche bot sie an und
  schrieb Uhrzeit, Zielordner und Anzahl in die Einstellungen, aber der
  BackupScheduler wurde nirgends erzeugt. Jetzt am AppHost verdrahtet und
  in den geordneten Abbau aufgenommen.
- SettingsPageViewModel hielt die vier Sicherungs-Einstellungen doppelt.
  Aus der Ansicht waren sie laengst verschwunden, gelesen und beim
  Speichern zurueckgeschrieben wurden sie weiter: Wer die Uhrzeit auf der
  Sicherungs-Seite aenderte und danach die Einstellungen speicherte, bekam
  den alten Wert zurueck.

Pakete: keine bekannten Sicherheitsluecken mehr
- SQLitePCLRaw.bundle_e_sqlite3 auf 2.1.13 angehoben. Microsoft.Data.Sqlite
  bringt 2.1.11 mit, darin steckt GHSA-2m69-gcr7-jv3q (NU1903, hoch).
- SharpCompress bleibt als direkter Verweis stehen. Beim Aufraeumen erst
  als ungenutzt entfernt - dabei kam die von MongoDB.Driver gezogene
  Fassung 0.30.1 mit GHSA-6c8g-7p36-r338 zurueck. Der Verweis ist eine
  Anhebung, kein Ballast; das steht jetzt als Kommentar dabei.

Dokumentation
- Roadmap mit Statusblock: A1 und A3 erledigt, A2 nur zur Haelfte - Gate,
  Policy und Dienst greifen, aber keine Ansicht ruft ApproveAsync auf, ein
  gestagter Aufruf liegt unbeantwortet. Das ist jetzt Punkt 1 der Reihung.
  Rocket.Chat steht und kollidiert mit A5 (Matrix) - Entscheidung faellig.
- Avalonia-Portierungsleitfaden -> Oberflaechen-Leitfaden: kein Auftrag mehr,
  sondern Beschreibung des Stands.
- Bestandsaufnahme und Linux-Analyse als datierte Befunde gekennzeichnet;
  der teure Teil der Linux-Analyse (8.900 Zeilen WinForms) ist hinfaellig.
- Verweise auf frm_*, WebView2 und ClawdDotNet.csproj in den lebenden
  Dokumenten richtiggestellt.

Build fehlerfrei, 585 Tests gruen (6 uebersprungen).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 12:26:14 +02:00

22 KiB
Raw Blame History

Roadmap

Stand: 2026-08-23 (Frühjahrsputz). Was seither gilt:

Bereich Stand
A1 Taskboard erledigt — Dateiformat, Scanner mit Claiming, task_*-Tool, Migration, Tests
A3 Audit-Log erledigt — append-only auf SQLite, Engine stempelt die Herkunft
A2 Staging halb — Gate, Policy, Ablage und Dienst stehen und greifen; die Freigabe-Ansicht fehlt. Bis sie da ist, legt ein Agent Vorschläge ab, die niemand freigeben kann
Oberfläche portiert — neun Bereiche nativ in Avalonia, Entwurf aus Mockup/ umgesetzt. Die WinForms-Fassung ist entfernt (Tag vor-fruehjahrsputz-2026-08)
Rocket.Chat Tool umgesetzt und registriert. Damit steht A5 zur Entscheidung an — siehe unten
Pakete keine bekannten Sicherheitslücken mehr; SharpCompress und SQLitePCLRaw.bundle_e_sqlite3 sind als Anhebung direkt verwiesen

Die vier Umsetzungspläne vom 2026-08-05 sind alle noch offen: FileRW-Papierkorb, AgentInspector, AgentEditor-Härtung, WebSearch. Ihre Reihenfolge steht in den Dokumenten selbst; sie sind hier nicht doppelt eingeordnet.


Zentrale Liste aller offenen Vorhaben. Sie löst die beiden „Vorgeschlagene Reihenfolge"-Abschnitte in der Bestandsaufnahme und im Konzepte-Dokument ab — die bleiben als Befund bzw. Konzept bestehen, gepflegt wird nur noch hier.

Kürzel (S4, K2, T4, F-A1, …) verweisen auf die Bestandsaufnahme.


A — Beschlossen (aus dem OpenAlice-Vergleich, Juli 2026)

Hintergrund: Konzeptvergleich mit OpenAlice (AGPL-3.0 — Konzepte übernehmen ja, Code nein). Übernommen werden Taskboard, Staging-Freigabe, Audit-Log und das Skill-Modell. Die Inbox-Idee entfällt zugunsten der geplanten Matrix-Migration (A5).

A1 — Taskboard — erledigt

Aufgaben als Markdown-Dateien mit YAML-Frontmatter im SharedWorkspace: title, status (backlog | todo | in_progress | done | canceled), priority, assignee, optional when (at | every | cron mit Zeitzone).

  • Scanner statt Delay-Schleifen: Ein Takt (~60 s) prüft, was fällig ist. Persistiert werden nur Last-Fired-Marker — ein fehlgeschlagener Lauf bleibt der einzige Versuch für diesen Termin, kein automatischer Retry-Sturm.
  • Assignee bestimmt die Ausführung: @new = frischer Lauf ohne Historie, @<agent> = bestehender Agent mit seinem Kontext, @human = wartet auf uns. Das ersetzt das implizite UseChatContext-Flag (T7) durch eine explizite Angabe am Auftrag.
  • Agenten-Tool: task_create, task_list, task_update, task_comment. Agent-zu-Agent-Delegation läuft künftig über Tasks statt über rekursives send_message.
  • Migration: Die improvisierten coordination/*.md-Dateien der Agenten (task_, status_, broadcast) gehen im Taskboard auf.

Detailbauplan (aus dem Fünf-Repo-Vergleich, Juli 2026 beschlossen):

  • Status zusätzlich mit in_review; im Frontmatter require_approval (Task gilt erst nach Review als done) und acceptance (Abnahmekriterien, gegen die das Ergebnis geprüft wird).
  • Task-Typen approval und human_input — ein Mensch ist einfach ein Assignee; seine Antwort ist das Task-Ergebnis und Input für Folgetasks.
  • Atomares Claiming: Die DB verhindert, dass zwei Läufe denselben Task ziehen. Der Scanner arbeitet mit Claim-before-run (at-most-once — ein doppelter Tick findet den Claim bereits vergeben) und Startup-Reconciliation: Beim Start wird Soll (Frontmatter) gegen Ist (Marker/Claims) abgeglichen, verpasste Läufe werden erkannt statt still übersprungen.
  • blocked_by-Abhängigkeiten mit Auto-Dispatch: Wird der letzte Blocker fertig, wird der wartende Task automatisch angestoßen. Meldet ein Agent einen Blocker, fällt der Task und der Zuständige (Lead/Benutzer) wird benachrichtigt (Blocker-Eskalation).
  • Reopen-/Feedback-Semantik: Ergebnis + Kritik gehen per task_comment an denselben Agenten zur Nachbesserung zurück, statt einen neuen Task von vorn zu beginnen.

Damit erledigt oder aufgegangen:

Punkt Warum
F-A5 Task-Queue das Taskboard ist die Queue
F-A4 Run-Historie Läufe werden am Task verknüpft und persistiert
B8 Rekursion send_message Delegation über Tasks ist strukturell zyklenfrei
B6 Task.Delay-Überlauf Scanner-Modell kennt keine langen Delays
B7 Cron in Lokalzeit Frontmatter-when ist zeitzonen-explizit
T7 RunAsync vs. ChatAsync Assignee-Semantik beantwortet die Frage

Verzahnung: Das Marktkalender-Flag (onlyWhenMarketOpen, siehe C1) gehört ins Frontmatter, nicht in einen eigenen Mechanismus.

Konzept-Doc: Taskboard-Konzept (Dateiformat, Wahrheitsaufteilung Datei/DB, Scanner-Verhalten, Invarianten, Migration).

A2 — Staging-Freigabe für irreversible Aktionen (F-A1 + S4) — Kern erledigt, Ansicht offen

Der offene Rest ist die Freigabe-Ansicht. StagingService bietet ListPendingAsync, ApproveAsync und RejectAsync, AppHost.Staging reicht ihn an die Oberfläche durch — aber kein Ansichtsmodell ruft sie auf. Ein gestagter Aufruf liegt damit unbegrenzt in der Ablage. Solange das so ist, ist jede Aktion auf Approve faktisch eine Aktion auf Deny, nur ohne Rückmeldung an den Agenten.

Konzept-Doc: Staging-Konzept.

Irreversible Aktionen (Mail senden, X posten, DB-Schreibzugriff, Datei löschen, perspektivisch Orders) werden gestaged statt ausgeführt: Vorschlag → Review im Hauptfenster → Freigabe/Ablehnung. Pro Tool/Aktion konfigurierbar: auto | approve | deny.

Das bisher wirkungslose PermissionGate (S4) wird dabei zum zentralen Durchsetzungspunkt ausgebaut: Policy-Prüfung, Staging-Entscheidung und Audit-Hook (A3) an einer Stelle statt ad-hoc in jedem Tool. S4 wird nicht separat bearbeitet, sondern geht hier auf.

Ergänzungen (Juli 2026 beschlossen):

  • Plan-Freeze: Freigegeben wird ein eingefrorener, konkreter Aufruf — Tool, Aktion und exakte Argumente zum Zeitpunkt des Stagings. Ausgeführt wird genau das Eingefrorene; jede nachträgliche Änderung ist eine neue Freigabe.
  • Approval-Records: Jede Entscheidung (Freigabe wie Ablehnung) wird als Datensatz im Audit-Log (A3) verankert — wer, wann, was, mit welchem Ergebnis.

Sicherheitswirkung: Eine Prompt-Injection (K2) kann dann nur noch einen Vorschlag erzeugen, keine Ausführung.

A3 — Audit-Log (F-A2) — erledigt

Konzept-Doc: Audit-Konzept.

Jeder Tool-Aufruf wird protokolliert: Agent, Lauf/Session, Zeitstempel, Argumente, Ergebnis-Status. Append-only (JSONL oder SQLite-Tabelle auf dem vorhandenen SqliteStorage).

Designregeln (aus dem OpenAlice-Provenance-Konzept):

  • Herkunft wird von der Engine gestempelt, nie vom Agenten behauptet.
  • Einträge sind unveränderlich; Korrekturen sind neue Einträge.
  • Unbekannte Herkunft wird als unbekannt markiert, nicht geraten.
  • Worker-Typ (Modell/Engine) und verantwortliche Session sind getrennte Begriffe.

Ergänzung (Juli 2026 beschlossen) — Receipts: Jeder abgeschlossene Task/Lauf erhält einen Abschluss-Beleg mit Ergebnis-Verweis, Schritten, Tokens und Kosten (Verknüpfung RunUsage ↔ Task). Damit fällt C7 („Kosten pro Ergebnis") weitgehend als Abfallprodukt ab.

Das Audit-Log ist zugleich das Fundament für das Ergebnisregister (C7) und die Tool-Fehlerquote aus der Leistungsanalyse.

A4 — Skill-/Toolset-Modell (ersetzt T6)

Dreischichtig statt „alles immer im System-Prompt":

  1. Dauerhafter Kern — Identity, Soul, unveränderliche Regeln. Schlank, damit der Prompt-Cache (T1) stabil bleibt.
  2. Nachladbare Skills/Toolsets — fachliche Abläufe und selten genutzte Tools werden erst auf Anforderung geladen (list_toolsetsload_toolset).
  3. Selbstkorrigierende Tool-Fehler — Fehlermeldungen nennen die gültigen Parameter/Aktionen, statt das Modell raten zu lassen.

Mechanik (Juli 2026 beschlossen, nach GoClaw-Vorbild): Skills liegen als SKILL.md mit Frontmatter (name, description) im Instanz- bzw. Agenten-Verzeichnis. Bei wenigen Skills werden die Kurzbeschreibungen inline in den Prompt eingebettet, bei vielen gibt es stattdessen ein skill_search-Tool. Änderungen an Skill-Dateien werden per Hot-Reload übernommen.

Dazu Hermes' Selbstverbesserungs-Idee: Agenten dürfen Skills aus Erfahrung selbst schreiben (das AgentEditor-Tool ist die Vorstufe). Wichtig: Ein Skill ist Prompt-Input — agentengeschriebene Skills werden erst nach Freigabe (A2) aktiv, sonst wäre das ein Injection-Kanal in künftige Läufe.

A5 — Matrix/Element-Migration

Beschlossene Richtung: Die Kommunikation (Benachrichtigungen, Berichte, Chat mit Agenten) wird auf Element/Matrix umgestellt.

  • Ersetzt die im OpenAlice-Vergleich erwogene Inbox — Berichte landen in Matrix-Räumen.
  • Der Tool-Kandidat Notify entfällt und geht hierin auf.
  • Betroffen: Telegram-Tool (Rolle klären), WebView-Chat (bleibt er Haupt-UI?), Streaming K4 (Matrix streamt nicht — nach dieser Entscheidung neu bewerten).

Scope ist noch unbestimmt — braucht ein eigenes Konzept-Doc, bevor es in die Reihenfolge eingeordnet wird.

Kollision, seit Rocket.Chat steht (August 2026): Das Rocket.Chat-Tool ist umgesetzt und im AppHost registriert — es bedient genau den Zweck, für den A5 Matrix vorsah. Entweder A5 entfällt und Rocket.Chat wird der Weg, oder wir betreiben zwei Chat-Wege nebeneinander. Das ist die nächste offene Grundsatzentscheidung; siehe RocketChat-Nextcloud-Konzept.

A6 — MySQL-Replikations-Spiegel (optional)

Beschlossen Juli 2026. SQLite bleibt die einzige Wahrheit — gearbeitet wird ausschließlich auf der Instanz-DB. MySQL ist ein reiner, nachgelagerter Spiegel: Er empfängt nur INSERT/UPDATE/DELETE vom Replikator; die App liest im Betrieb nie daraus. Einziger Lesezweck: Wiederherstellung, falls die SQLite korrupt ist — daneben steht der Spiegel externen Auswertungen (Dashboards, Ad-hoc-SQL) offen, ohne die Agenten-Maschine zu berühren.

Leitplanken:

  • Outbox-Muster an der vorhandenen Schreib-Warteschlange von SqliteStorage: Replikations-Einträge lokal puffern, idempotente Upserts nach MySQL. Nie blockierend — ist MySQL nicht erreichbar, staut die Outbox und holt auf.
  • Mehrere Instanzen replizieren in denselben Spiegel; Zeilen tragen instance_id.
  • Restore-Pfad (Spiegel → frische SQLite) muss existieren und getestet sein — gleiche Regel wie beim Backup: ein ungeprüftes Restore ist eine Vermutung.
  • Kein Koordinationspunkt: Claiming, Locks, Taskboard-Zustand bleiben lokal. Die Regel „nur der Replikator schreibt, niemand liest im Betrieb" gehört ins Konzept-Doc.
  • Sicherheit: TLS zur Datenbank, Zugangsdaten über SecretProtector; Output-Scrubbing der Tool-Ergebnisse wird wichtiger, weil Kontext-Daten künftig auch im Spiegel liegen.
  • Ergänzt das ZIP-Backup, ersetzt es nicht — Identity/Soul, Settings, Workspace und Telegram-Session bleiben Sache des Instanz-Backups.

Voraussetzung — Historie-Umzug: ChatHistory.json zieht in die Instanz-DB um (aktive Tabelle + Archiv-Tabelle mit FTS5-Volltextindex und history_search-Tool, siehe K6 in Abschnitt B). Das löst nebenbei B10 (O(n²)-Schreiblast) und gibt K6 seine Form; erst danach schützt der Spiegel auch die Historie. Zeitlich passt A6 zu dem Server, der ggf. mit A5 (Matrix) ohnehin dazukommt.


B — Offen aus der Bestandsaufnahme

Punkt Was Stand
T4 Proaktiv statt reaktiv kompaktieren offen, unverändert
K2-Rest Untrusted Content als Daten rahmen (<untrusted_content>) A2 nimmt die Schärfe; die Rahmung selbst bleibt nötig
K4 Streaming zurückgestellt bis A5 entschieden ist
K6 Historie archivieren + durchsuchbar machen (FTS5-Index, history_search-Tool) statt nur rotieren beschlossen; Teil des Historie-Umzugs (Voraussetzung von A6)
Memory-Flush vor Compaction Bevor der ContextCompactor zusammenfasst, bekommt der Agent ein eng begrenztes Fenster, Dauerhaftes per memory_store zu sichern — sonst wirft die Compaction Wissen weg beschlossen (GoClaw-Muster)
Memory-Auto-Injection Relevante Memory-Abstracts werden automatisch eingeblendet (Relevanzschwelle, Deckel ~200 Tokens), in die Nutzernachricht, nie in den System-Prompt (Prompt-Cache T1) beschlossen; löst den offenen Punkt „Automatische Einblendung" im Memory-Konzept
Output-Scrubbing Bekannte Secret-Werte (Register des SecretProtector) werden zentral aus allen Tool-Ergebnissen maskiert, bevor sie in Kontext, Historie oder Spiegel (A6) gelangen beschlossen; schließt die Lücke, die S3 nur für URLs schloss
Hygiene-Paket B9 (index_Count-Race), B13 (instanceId-Inkonsistenz), F-A6-Rest (UI zum Setzen/Rotieren der Secrets) Kleinbugs, in einem Aufwasch. B11/T8 (max_tokens) ist erledigt — AgentEngine setzt es aus LoopGuard.MaxResponseTokens. B10 geht im Historie-Umzug (A6) auf

Erledigt seit der letzten Fortschreibung: B4 vollständig (Preise kommen live vom /models-Endpunkt, unbekannte Modelle werden sichtbar gemeldet). Beim Frühjahrsputz dazugekommen: die automatische Sicherung lief ins Leere — die Oberfläche bot sie an und schrieb die Uhrzeit weg, aber der BackupScheduler wurde nie gestartet. Jetzt verdrahtet.

Neu aufgenommen (aus der Ideensammlung, die dabei aufgelöst wurde):

Punkt Was
Werkzeugwunsch Agenten bekommen in den Kern-Prompt den Hinweis, sich zu melden, wenn ihnen ein Werkzeug fehlt, das es noch nicht gibt. Der Weg dafür ist da — ein Task an @human (A1). Gehört zum Prompt-Kern von A4

B-DC — Deploymentcenter-Anbindung

WatchDog und LicenseLabrador sind durch das Deploymentcenter ersetzt: eine Adresse, ein Token, und dazu Update-Prüfung, Fehler-Stream und Bugtracker. Watchdog läuft wieder pro Instanz (ein Monitor je Instanz, mit Gesundheitsprüfungen und angekündigtem Ende).

Offen:

Punkt Was Bemerkung
DC1 Oberfläche „Fehler melden" Client vorhanden, Schaltfläche fehlt
DC2 Agenten-Tool für den Bugtracker macht den Claim/Lease-Workflow des Deploymentcenters nutzbar
DC3 Release-Strecke erledigt für win-x64/dev (deploy/publish.py, 0.1.1 veröffentlicht). Offen: linux-x64 — die Portierung, auf die das wartete, ist durch — und prod
DC4 SDK als Git-Submodul unter external/ statt Cross-Repo-Pfad betrifft auch die CI
DC5 Betreiber: Evaluator-Cron einrichten, Token ausstellen, parent_source pflegen ohne den Cron ist die Überwachung wertlos
DC6 Update anwenden statt nur melden erledigt. Agent liegt im Paket (Prüfsumme geprüft), Rückfrage in der Oberfläche, geordnetes Herunterfahren vor dem Agentenstart, maintenance an den Watchdog
DC7 Erstinstallation über --action install + setup.json erledigt. Setup-Kette live durchgespielt (Login, Katalog, Token mit Rechteschranke), Round-Trip SDK-Writer → SettingsManager trägt. fileWindows/fileLinux gesetzt
DC8 Signaturpflicht (--require-signature) Schlüssel steht, ab 0.1.2 wird signiert, Prüfung beidseitig getestet. Blockiert: LaunchUpdateAgent reicht den Schalter nicht durch — aus der Anwendung heraus nicht erzwingbar (gemeldet)

Details: Deploymentcenter 2.22.4 Integrationsplan. Der Zugangsschutz aus 2.4 (Lizenzschlüssel als Basic-Auth-Zugang zur Release-Ablage) ist bereits umgesetzt — er muss im ersten veröffentlichten Release enthalten sein.


C — Offen aus dem Finanz-/Analyse-Konzept

Punkte 12 von dort (atomares Schreiben, Backup/Restore inkl. UI) sind umgesetzt.

# Was Bemerkung
C1 Marktkalender (onlyWhenMarketOpen + MarketCalendar-Tool) Scheduler-Teil gehört ins Taskboard-Frontmatter (A1)
C2 Indicators-Tool — deterministische Berechnung Qualität hoch, Tokens runter
C3 Datenaktualität erzwingen (maxAgeSeconds)
C4 Termine & Fundamentaldaten (Earnings, EDGAR, Wirtschaftskalender)
C5 Bestandsregister (Positionen) Grundlage für C7/C8
C6 Nachrichten-Entdopplung (SeenItems)
C7 Ergebnisregister (Stufe 2, „Kosten pro Ergebnis") fällt weitgehend aus den A3-Receipts ab
C8 Falsifizierbare Aussagen + Auflösung, Brier-Score (Stufe 3) braucht C5, C7 und einen Auflösungs-Task (A1)

D — Toolkandidaten (unbeschlossen)

WebSearch, Http (generisch mit Allowlist), Shell (sandboxed), Git, Vision. Notify ist gestrichen — geht in A5 auf.


Vorgeschlagene Reihenfolge

# Vorhaben Begründung
A1 Taskboard Fundament; löste sechs bestehende Punkte auf einmal
A3 Audit-Log klein, sofort nützlich; musste vor A2 da sein, damit Freigaben protokolliert werden
1 A2 — Freigabe-Ansicht Der Rest von A2 und das einzige Stück, das jetzt wirklich blockiert: Ohne sie liegen gestagte Aufrufe unbeantwortet. Kleiner Umfang, große Wirkung
2 FileRW-Papierkorb eigener Plan; kleinster Eingriff, entschärft ein reales Risiko und erlaubt, FileRW.delete von Approve auf Auto zu senken
3 A5 entscheiden: Matrix oder Rocket.Chat Blockiert K4 (Streaming) und färbt auf A6 ab. Entscheidung, keine Umsetzung — deshalb früh
4 C1 Marktkalender spart sofort Kosten; nutzt A1-Frontmatter
5 A4 Skills/Toolsets Token-Hebel, Cache-stabil
6 C2 Indicators Qualität + Kosten
7 C7 + C8 Ergebnisregister, Aussagen das eigentliche Leistungsmaß; braucht A3
DC1 „Fehler melden"-Schaltfläche zwischendurch; der Client steht, es fehlt der Knopf
Hygiene-Paket (B) zwischendurch, unabhängig
Historie-Umzug in die Instanz-DB löst B10 + K6; Voraussetzung für A6
A6 MySQL-Spiegel nach dem Historie-Umzug; natürliches Zuhause auf dem A5-Server
A5 umsetzen erst nach der Entscheidung aus Zeile 3; der gewählte Weg bekommt dann sein Konzept-Doc

Leitlinie der Reihung: erst Nachvollziehbarkeit und Kontrolle (Audit, Staging), dann Fähigkeiten — ein Agent, der unbeaufsichtigt läuft, braucht zuerst Bremsen, dann PS.


Umsetzung mit Opus 4.6 — Einstufung

Die Entwicklung erfolgt mit Opus 4.6. Die meisten Vorhaben sind damit gut machbar, sofern die hier notierten Vorgaben mitgegeben werden.

Die beiden hier markierten Stellen sind inzwischen gebaut: Der Scanner-Kern (A1) steht samt Claiming und Reconciliation, die Fortsetzung nach Freigabe (A2) folgt der Vorgabe unten — der Lauf endet beim Staging regulär, kein Suspend. Die Tabelle bleibt als Begründung stehen, warum es so gebaut wurde. Zwei Stellen berühren Nebenläufigkeits-Invarianten bzw. Engine-Querschnitte — sie sind für Opus 5 / Fable markiert oder durch eine Architektur-Vorgabe entschärft.

Vorhaben Einstufung Vorgabe / Begründung
A1: Dateiformat, Frontmatter-Parsing, task_*-Tool, Migration 4.6 klar spezifizierbar, gut testbar
A1: Scanner-Kern (atomares Claiming, Auto-Dispatch, Reconciliation) ⚠️ Opus 5 / Fable At-most-once-Semantik, Claim-CAS und das Zusammenspiel mit den seit B2 serialisierten Chat-Läufen sind genau die Fehlerklasse, die hier schon einmal schiefging. Falls doch 4.6: erst Konzept-Doc, Umsetzung strikt dagegen, Property-Tests für die Invarianten („nie zwei Claims auf einen Task", „kein Dispatch bei offenem Blocker", „doppelter Tick = ein Lauf")
A2: Gate, Policy, Staging-Queue, Review-UI, Approval-Records 4.6 mit der folgenden Architektur-Vorgabe
A2: Fortsetzung nach Freigabe 4.6 nur mit Vorgabe Kein pausierter, im Speicher gehaltener Lauf. Vorgabe: Der Lauf endet beim Staging regulär — das Tool liefert „zur Freigabe vorgelegt" als Ergebnis, der Agent schließt ab. Die Freigabe erzeugt einen Folge-Task (A1), der den Agenten mit dem eingefrorenen Aufruf weckt. Echtes Suspend/Resume eines laufenden ChatAsync wäre Fable-Terrain — und ist mit dieser Vereinfachung unnötig
A3: Audit-Log + Receipts 4.6 append-only, klares Schema, keine Nebenläufigkeitsfallen
A4: Skills 4.6 FileSystemWatcher mit Debounce (~500 ms); agentengeschriebene Skills erst nach Freigabe aktiv (siehe A4)
Memory-Flush vor Compaction 4.6 mit Anleitung Harte Grenzen: max. 35 Schritte, einziges Tool memory_store, Timeout, günstiges Modell (wie T3), höchstens einmal je Compaction-Zyklus. Vorsicht: Der ContextCompactor hatte B1/B14 — die bestehenden Paarungs-Tests müssen unverändert grün bleiben
Memory-Auto-Injection 4.6 in die Nutzernachricht, nie in den System-Prompt (sonst verfällt der Prompt-Cache T1); Deckel ~200 Tokens
Output-Scrubbing 4.6 ein zentraler Filter an der Stelle, wo Tool-Ergebnisse in den Kontext gelangen (ExecuteToolCallAsync); Werte aus dem Secret-Register
Historie-Umzug + FTS5 + history_search 4.6 Migration nur nach frischem Backup; alte JSON-Dateien erst nach verifiziertem Import löschen
A6: MySQL-Spiegel 4.6 mit Anleitung Outbox mit Wasserzeichen, idempotente Upserts, nie blockieren; der getestete Restore-Pfad ist Teil der Definition of Done
C1 Marktkalender, C2 Indicators 4.6 reine Fachlogik, deterministisch testbar

Generell: Neue Subsysteme (Scanner, Staging, Audit, Replikator) kommen mit Tests nach der Teststrategie — die Invarianten-Tests sind bei den markierten Punkten kein Nice-to-have, sondern die Absicherung dafür, dass ein schwächeres Modell sie umsetzen darf.