Audit und Laufbelege: Tageswerte je Agent und Einheit, Monatsarchiv statt Loeschen (#700)

Nach der Vorgabe vom 2026-09-22 (so wenig loeschen wie moeglich): Laeufe
aelter als hotDays (Vorgabe 180, 0 = alles bleibt) wandern aus AuditLog und
RunReceipts in Archive/audit-JJJJ-MM.db - kopiert und entfernt in einer
Transaktion, Zeilen-IDs bleiben, spaeter dazugekommene Spalten werden im
Archiv ergaenzt. Vorher wird jeder Tag in RunDaily verdichtet (Laeufe,
Fehlschlaege, Schrittgrenze, Tokens, Kosten, Werkzeugaufrufe, Fehler,
Verweigert, Freigaben) mit der Einheit des Agenten; die Tageswerte bleiben.
Nachschlagen eines Laufs findet ihn auch im Archiv. API /usage/days,
/usage/archive; Karte 'Tageswerte' in der Verbrauchsansicht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-02 11:44:50 +02:00
co-authored by Claude Opus 5.5
parent 0dd8a761b8
commit 095722ae9c
11 changed files with 761 additions and 13 deletions
+12
View File
@@ -141,6 +141,9 @@ public sealed class AppHost : IAsyncDisposable
/// <summary>#725: Inbound triggers — n8n or any other system hands an agent a task.</summary>
public Core.Triggers.InboundTriggers? Triggers { get; private set; }
/// <summary>#700: Day values and the month archive of audit and receipts.</summary>
public Core.Audit.AuditArchive? AuditArchive { get; private set; }
/// <summary>#197: The external MCP servers, each registered as a tool.</summary>
public Core.Mcp.McpConnections? McpServers { get; private set; }
@@ -724,6 +727,15 @@ public sealed class AppHost : IAsyncDisposable
historyKeeper.Start();
host._shutdown.Add(historyKeeper.DisposeAsync);
// #700: day values, and runs older than the hot window move to the month archive.
var auditArchive = new Core.Audit.AuditArchive(
storage, () => instance.AuditArchive,
agentId => instance.Agents.FirstOrDefault(a => string.Equals(a.AgentId, agentId, StringComparison.OrdinalIgnoreCase))?.UnitId,
loggerFactory.CreateLogger("ClawdDotNet.Core.Audit"));
auditArchive.Start();
host.AuditArchive = auditArchive;
host._shutdown.Add(auditArchive.DisposeAsync);
// #698: what holds in a unit, set by its lead.
var doctrines = new Core.Organisation.SqliteDoctrineStore(storage);
engine.Doctrines = doctrines;