Files
ClawdDotNet/deploy/roadmap/items.json
Richard 1e9cb789c8 Weboberflaeche hinzugefuegt und Fachlogik nach App herausgeloest (#493, #494)
- ClawdDotNet.Web: Kestrel im Prozess der Anwendung, Token-Absicherung (TokenGate mit FixedTimeEquals), Endpunkte unter /api, Ereignisstrom unter /events (Server-Sent Events) und fortlaufendes Log-Streaming.

- Weboberflaeche (wwwroot/): Vollstaendiges Single-Page-Frontend mit nativem HTML5, CSS3 und ES-Modulen ohne Buildschritt (strikt textContent, #-Routing, sofortiger Login-Sprung bei fehlendem Token, Light/Dark-Theme, lokale Barlow-Schriften).

- ClawdDotNet.App: Fachlogik aus den Avalonia-ViewModels in Dienste herausgeloest (AgentAdministration, JobAdministration, ServiceAdministration, RunCoordinator) und ueber InstanceChange synchronisiert.

- Tests: ClawdDotNet.Web.Tests und ClawdDotNet.App.Tests hinzugefuegt, alle 684 Tests erfolgreich.
2026-09-07 21:56:02 +02:00

857 lines
18 KiB
JSON

[
{
"ref": "e10",
"id": 180,
"epic": "DEC",
"rank": 5,
"status": "open",
"title": "E10 entscheiden: Womit wird der Hauptschluessel unter Linux gebunden?",
"neu": true
},
{
"ref": "e1",
"id": 181,
"epic": "DEC",
"rank": 50,
"status": "open",
"title": "E1 entscheiden: Matrix oder Rocket.Chat?",
"neu": true
},
{
"ref": "e4",
"id": 182,
"epic": "DEC",
"rank": 210,
"status": "open",
"title": "E4 entscheiden: ask_agent behalten oder ersatzlos streichen?",
"neu": true
},
{
"ref": "e2",
"id": 183,
"epic": "DEC",
"rank": 220,
"status": "open",
"title": "E2 entscheiden: Nextcloud-Identitaet - Dienstkonto oder Benutzer je Agent?",
"neu": true
},
{
"ref": "e3",
"id": 184,
"epic": "DEC",
"rank": 230,
"status": "open",
"title": "E3 entscheiden: Oeffentliche Freigabe-Links erlauben oder hart sperren?",
"neu": true
},
{
"ref": "e5",
"id": 185,
"epic": "DEC",
"rank": 240,
"status": "open",
"title": "E5 entscheiden: Notfallkanal-Reihenfolge instanzweit oder je Agent?",
"neu": true
},
{
"ref": "e6",
"id": 186,
"epic": "DEC",
"rank": 250,
"status": "open",
"title": "E6 entscheiden: catchUp je Task abschaltbar machen?",
"neu": true
},
{
"ref": "e7",
"id": 187,
"epic": "DEC",
"rank": 260,
"status": "open",
"title": "E7 entscheiden: Prioritaet bei mehreren faelligen Tasks - strikt oder gewichtet?",
"neu": true
},
{
"ref": "e8",
"id": 188,
"epic": "DEC",
"rank": 270,
"status": "open",
"title": "E8 entscheiden: Aufbewahrungsdauer der Agentenkommunikation",
"neu": true
},
{
"ref": "e9",
"id": 189,
"epic": "DEC",
"rank": 280,
"status": "open",
"title": "E9 entscheiden: Automatische Orderausfuehrung - ueberhaupt?",
"neu": true
},
{
"ref": "l1",
"id": 190,
"epic": "SEC",
"rank": 10,
"status": "open",
"title": "L1: Der Hauptschluessel liegt unter Linux im Klartext",
"neu": true
},
{
"ref": "freigabe-ansicht",
"id": 191,
"epic": "SEC",
"rank": 20,
"status": "open",
"title": "Freigabe-Ansicht: gestagte Aufrufe sichtbar machen und freigeben",
"neu": true
},
{
"ref": "output-scrubbing",
"id": 192,
"epic": "SEC",
"rank": 80,
"status": "open",
"title": "Output-Scrubbing: Secret-Werte zentral aus allen Tool-Ergebnissen maskieren",
"neu": true
},
{
"ref": "untrusted-content",
"id": 193,
"epic": "SEC",
"rank": 300,
"status": "open",
"title": "Tool-Ergebnisse als untrusted content rahmen",
"neu": true
},
{
"ref": "secret-ui",
"id": 194,
"epic": "SEC",
"rank": 310,
"status": "open",
"title": "Secret-UI: Zugangsdaten setzen und rotieren",
"neu": true
},
{
"ref": "filerw-papierkorb",
"id": 195,
"epic": "CAP",
"rank": 60,
"status": "open",
"title": "FileRW-Papierkorb statt endgueltigem Loeschen",
"neu": true
},
{
"ref": "l4-shell",
"id": 196,
"epic": "CAP",
"rank": 90,
"status": "open",
"title": "L4: Shell-Tool mit echter Sandbox",
"neu": true
},
{
"ref": "l5-mcp",
"id": 197,
"epic": "CAP",
"rank": 100,
"status": "open",
"title": "L5: MCP-Client fuer stdio- und HTTP-Server",
"neu": true
},
{
"ref": "a4-skills",
"id": 198,
"epic": "CAP",
"rank": 110,
"status": "open",
"title": "A4: Skills und Toolsets - dreischichtiger Prompt statt \"alles immer\"",
"neu": true
},
{
"ref": "l6-vision",
"id": 199,
"epic": "CAP",
"rank": 120,
"status": "open",
"title": "L6: Vision - Bild-Content-Blocks im OpenRouterClient",
"neu": true
},
{
"ref": "l7-browser",
"id": 200,
"epic": "CAP",
"rank": 130,
"status": "open",
"title": "L7: Browser-Tool mit Live-Ansicht",
"neu": true
},
{
"ref": "memory-flush",
"id": 201,
"epic": "CAP",
"rank": 320,
"status": "open",
"title": "Memory-Flush vor der Compaction",
"neu": true
},
{
"ref": "memory-injection",
"id": 202,
"epic": "CAP",
"rank": 330,
"status": "open",
"title": "Memory-Auto-Injection relevanter Abstracts",
"neu": true
},
{
"ref": "proaktive-compaction",
"id": 203,
"epic": "CAP",
"rank": 340,
"status": "open",
"title": "Die Compaction laeuft nach dem API-Aufruf - der ueberfuellte Prompt ist da schon bezahlt",
"neu": true
},
{
"ref": "agent-inspector",
"id": 204,
"epic": "CAP",
"rank": 350,
"status": "open",
"title": "AgentInspector: ein Supervisor-Agent, der die anderen beurteilen kann",
"neu": true
},
{
"ref": "agent-editor",
"id": 205,
"epic": "CAP",
"rank": 360,
"status": "open",
"title": "AgentEditor haerten: Aenderungen an Identity.md und Soul.md freigabepflichtig",
"neu": true
},
{
"ref": "b8-delegationstiefe",
"id": 206,
"epic": "COMM",
"rank": 70,
"status": "open",
"title": "B8: AgentComm.send_message hat keine Tiefenbegrenzung - A nach B nach A verklemmt",
"neu": true
},
{
"ref": "comm-phase1",
"id": 207,
"epic": "COMM",
"rank": 400,
"status": "open",
"title": "Agentenkommunikation Phase 1: ParentRunId und RootRunId",
"neu": true
},
{
"ref": "comm-phase2",
"id": 208,
"epic": "COMM",
"rank": 410,
"status": "open",
"title": "Agentenkommunikation Phase 2: Nachrichtenspeicher AgentMessages mit FTS5",
"neu": true
},
{
"ref": "comm-phase3",
"id": 209,
"epic": "COMM",
"rank": 420,
"status": "deferred",
"title": "Agentenkommunikation Phase 3: ask_agent mit Tiefe 1 und Zykluspruefung",
"neu": true
},
{
"ref": "comm-phase4",
"id": 210,
"epic": "COMM",
"rank": 430,
"status": "deferred",
"title": "Agentenkommunikation Phase 4: Paar-Ansicht an den Datenbestand anschliessen",
"neu": true
},
{
"ref": "comm-phase5",
"id": 211,
"epic": "COMM",
"rank": 440,
"status": "open",
"title": "Agentenkommunikation Phase 5: AgentCommAnalysis",
"neu": true
},
{
"ref": "historie-umzug",
"id": 212,
"epic": "DATA",
"rank": 150,
"status": "open",
"title": "Historie-Umzug in die Instanz-DB (loest B10 und K6)",
"neu": true
},
{
"ref": "a6-mysql-spiegel",
"id": 213,
"epic": "DATA",
"rank": 450,
"status": "deferred",
"title": "A6: MySQL-Spiegel als nachgelagerte Kopie",
"neu": true
},
{
"ref": "l2-betriebsform",
"id": 214,
"epic": "OPS",
"rank": 30,
"status": "open",
"title": "L2: 24/7-Betriebsform unter Linux",
"neu": true
},
{
"ref": "l3-release-linux",
"id": 215,
"epic": "OPS",
"rank": 40,
"status": "open",
"title": "L3: Release-Strecke linux-x64 (DC3)",
"neu": true
},
{
"ref": "dc1-fehler-melden",
"id": 216,
"epic": "OPS",
"rank": 160,
"status": "open",
"title": "DC1: Schaltflaeche \"Fehler melden\" in der Oberflaeche",
"neu": true
},
{
"ref": "dc2-bugtracker-tool",
"id": 217,
"epic": "OPS",
"rank": 500,
"status": "open",
"title": "DC2: Bugtracker-Tool fuer Agenten",
"neu": true
},
{
"ref": "sdk-270",
"id": 218,
"epic": "OPS",
"rank": 505,
"status": "open",
"title": "Deploymentcenter-SDK von 2.6.0 auf 2.7.0 nachziehen",
"neu": true
},
{
"ref": "dc4-sdk-submodul",
"id": 219,
"epic": "OPS",
"rank": 510,
"status": "open",
"title": "DC4: SDK als Git-Submodul statt Cross-Repo-Pfad",
"neu": true
},
{
"ref": "dc5-evaluator-cron",
"id": 220,
"epic": "OPS",
"rank": 520,
"status": "open",
"title": "DC5: Evaluator-Cron einrichten (Betreiberaufgabe)",
"neu": true
},
{
"ref": "release-guard",
"id": 221,
"epic": "OPS",
"rank": 530,
"status": "open",
"title": "Release-Guard beim Upload: ein frisches Produktverzeichnis steht ohne .htaccess da",
"neu": true
},
{
"ref": "dc8-signaturpflicht",
"id": 222,
"epic": "OPS",
"rank": 540,
"status": "deferred",
"title": "DC8: Die Signaturpflicht laesst sich ueber den empfohlenen Weg nicht einschalten",
"neu": true
},
{
"ref": "c1-marktkalender",
"id": 223,
"epic": "FIN",
"rank": 140,
"status": "open",
"title": "C1: Marktkalender - Laeufe ausserhalb der Handelszeiten ueberspringen",
"neu": true
},
{
"ref": "c2-indicators",
"id": 224,
"epic": "FIN",
"rank": 600,
"status": "open",
"title": "C2: Indikatoren im Code rechnen statt im Modell",
"neu": true
},
{
"ref": "c3-datenaktualitaet",
"id": 225,
"epic": "FIN",
"rank": 610,
"status": "open",
"title": "C3: dataAsOf wird geliefert, aber von nichts ausgewertet",
"neu": true
},
{
"ref": "c4-termine",
"id": 226,
"epic": "FIN",
"rank": 620,
"status": "open",
"title": "C4: Termine und Fundamentaldaten",
"neu": true
},
{
"ref": "c5-bestandsregister",
"id": 227,
"epic": "FIN",
"rank": 630,
"status": "open",
"title": "C5: Bestandsregister - stock_add ist eine Wissenssammlung, kein Bestand",
"neu": true
},
{
"ref": "c6-entdopplung",
"id": 228,
"epic": "FIN",
"rank": 640,
"status": "open",
"title": "C6: Nachrichten-Entdopplung",
"neu": true
},
{
"ref": "c7-ergebnisregister",
"id": 229,
"epic": "FIN",
"rank": 650,
"status": "open",
"title": "C7: Ergebnisregister AgentOutput am Lauf",
"neu": true
},
{
"ref": "c8-falsifizierbar",
"id": 230,
"epic": "FIN",
"rank": 660,
"status": "open",
"title": "C8: Falsifizierbare Aussagen als Leistungsmass",
"neu": true
},
{
"ref": "leerlaufquote",
"id": 231,
"epic": "FIN",
"rank": 670,
"status": "open",
"title": "Leerlaufquote: Laeufe ohne greifbares Ergebnis zaehlen",
"neu": true
},
{
"ref": "stock-add-herausloesen",
"id": 232,
"epic": "FIN",
"rank": 680,
"status": "open",
"title": "stock_add aus FileRW herausloesen",
"neu": true
},
{
"ref": "b9-index-count",
"id": 233,
"epic": "HYG",
"rank": 170,
"status": "open",
"title": "B9: index_Count-Race in FileRWTool",
"neu": true
},
{
"ref": "b13-instanceid",
"id": 234,
"epic": "HYG",
"rank": 180,
"status": "open",
"title": "B13: instanceId-Inkonsistenz zwischen RunAsync und SendMessageAsync",
"neu": true
},
{
"ref": "dst-randfall",
"id": 235,
"epic": "HYG",
"rank": 190,
"status": "open",
"title": "DST-Randfall: eine nicht existierende Ortszeit wird uebersprungen statt verschoben",
"neu": true
},
{
"ref": "nullable-warnungen",
"id": 236,
"epic": "HYG",
"rank": 200,
"status": "open",
"title": "45 Nullable-Build-Warnungen",
"neu": true
},
{
"ref": "done-audit",
"id": 237,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "Audit-Log und Receipts (A3, F-A2)",
"neu": true
},
{
"ref": "done-staging",
"id": 238,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "Staging-Kern (A2, F-A1, S4)",
"neu": true
},
{
"ref": "done-taskboard",
"id": 239,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "Taskboard (A1, F-A4, F-A5)",
"neu": true
},
{
"ref": "done-memory",
"id": 240,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "Langzeitgedaechtnis (K1)",
"neu": true
},
{
"ref": "done-atomar",
"id": 241,
"epic": "DATA",
"rank": null,
"status": "resolved",
"title": "Atomares Schreiben nach dem File.Replace-Muster",
"neu": true
},
{
"ref": "done-speicherfundament",
"id": 242,
"epic": "DATA",
"rank": null,
"status": "resolved",
"title": "Speicher-Fundament: WAL, busy_timeout, Pooling, Schreib-Warteschlange",
"neu": true
},
{
"ref": "done-backup",
"id": 243,
"epic": "DATA",
"rank": null,
"status": "resolved",
"title": "Sicherung und Wiederherstellung",
"neu": true
},
{
"ref": "done-zugangsschutz",
"id": 244,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "Zugangsschutz: Lizenzschluessel als Basic-Auth zur Release-Ablage (DC 2.4)",
"neu": true
},
{
"ref": "done-update",
"id": 245,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "Update anwenden (DC6)",
"neu": true
},
{
"ref": "done-erstinstallation",
"id": 246,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "Erstinstallation (DC7)",
"neu": true
},
{
"ref": "done-linux-portierung",
"id": 247,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "Linux-Portierung der Bibliotheken",
"neu": true
},
{
"ref": "done-paketanhebungen",
"id": 248,
"epic": "HYG",
"rank": null,
"status": "resolved",
"title": "Paket-Anhebungen gegen verwundbare transitive Fassungen",
"neu": true
},
{
"ref": "done-s1",
"id": 249,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "S1: SqlGuard statt Teilzeichenketten-Pruefung",
"neu": true
},
{
"ref": "done-s2",
"id": 250,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "S2: YouTubeUrl und ArgumentList gegen Options-Injection",
"neu": true
},
{
"ref": "done-s3",
"id": 251,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "S3: UrlSanitizer gegen API-Key-Leak ins Modell",
"neu": true
},
{
"ref": "done-s5",
"id": 252,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "S5: UrlGuard, Redirects einzeln geprueft",
"neu": true
},
{
"ref": "done-s6",
"id": 253,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "S6: WorkspacePath auf Verzeichnisgrenzen",
"neu": true
},
{
"ref": "done-s7",
"id": 254,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "S7: SecretProtector mit DPAPI",
"neu": true
},
{
"ref": "done-k5",
"id": 255,
"epic": "SEC",
"rank": null,
"status": "resolved",
"title": "K5: Budget-Guard (F-A3)",
"neu": true
},
{
"ref": "done-b1",
"id": 256,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B1 und B14: Compaction mit sicherem Schnittpunkt, kein doppelter System-Prompt",
"neu": true
},
{
"ref": "done-b2",
"id": 257,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B2: Chat-Laeufe je Agent serialisiert",
"neu": true
},
{
"ref": "done-b3",
"id": 258,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B3 und T5: maxCumulativeTokens von maxContextTokens getrennt",
"neu": true
},
{
"ref": "done-b4",
"id": 259,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B4: Prompt und Completion getrennt erfasst, Preise live vom /models-Endpunkt",
"neu": true
},
{
"ref": "done-b5",
"id": 260,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B5 und T2: Tool-Ergebnisse zentral gekappt",
"neu": true
},
{
"ref": "done-b6",
"id": 261,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B6 und B7: gegenstandslos, seit der Scanner die Delay-Schleifen ersetzt",
"neu": true
},
{
"ref": "done-b11",
"id": 262,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B11 und T8: max_tokens aus LoopGuard.MaxResponseTokens",
"neu": true
},
{
"ref": "done-b12",
"id": 263,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "B12: Retry mit Backoff fuer 429 und 5xx",
"neu": true
},
{
"ref": "done-t1",
"id": 264,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "T1 und T9: Prompt-Caching mit Breakpoints, cached_tokens gemessen",
"neu": true
},
{
"ref": "done-t3",
"id": 265,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "T3: guenstiges Modell fuer die Zusammenfassung",
"neu": true
},
{
"ref": "done-t7",
"id": 266,
"epic": "CAP",
"rank": null,
"status": "resolved",
"title": "T7: durch die Assignee-Semantik des Taskboards beantwortet",
"neu": true
},
{
"ref": "done-k3",
"id": 267,
"epic": "HYG",
"rank": null,
"status": "resolved",
"title": "K3: Testfundament",
"neu": true
},
{
"ref": "done-nu1903",
"id": 268,
"epic": "HYG",
"rank": null,
"status": "resolved",
"title": "Fruehjahrsputz: NU1903 und NU1902 geschlossen",
"neu": true
},
{
"ref": "done-altscheduler",
"id": 269,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "Alt-Scheduler abgeloest - alles ist ein Task",
"neu": true
},
{
"ref": "done-dc-ersetzt",
"id": 270,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "Deploymentcenter ersetzt WatchDog und LicenseLabrador",
"neu": true
},
{
"ref": "done-dc3-win",
"id": 271,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "DC3: Release-Strecke win-x64",
"neu": true
},
{
"ref": "done-avalonia",
"id": 272,
"epic": "OPS",
"rank": null,
"status": "resolved",
"title": "Avalonia-Portierung, WinForms entfernt",
"neu": true
},
{
"ref": "done-backup-nie-gestartet",
"id": 273,
"epic": "DATA",
"rank": null,
"status": "resolved",
"title": "Fruehjahrsputz: die automatische Sicherung war nie gestartet",
"neu": true
},
{
"ref": "done-backup-settings",
"id": 274,
"epic": "DATA",
"rank": null,
"status": "resolved",
"title": "Fruehjahrsputz: doppelte Sicherungs-Einstellungen ueberschrieben einander",
"neu": true
}
]