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
@@ -282,6 +282,26 @@ public sealed class SqliteStorage
CREATE INDEX IF NOT EXISTS IX_RunReceipts_Run
ON RunReceipts (RunId);
-- #700: one day of one agent, condensed; stays when the rows move to the archive.
CREATE TABLE IF NOT EXISTS RunDaily (
Day TEXT NOT NULL,
AgentId TEXT NOT NULL,
UnitId TEXT NOT NULL DEFAULT '',
Runs INTEGER NOT NULL DEFAULT 0,
Failed INTEGER NOT NULL DEFAULT 0,
LoopLimit INTEGER NOT NULL DEFAULT 0,
PromptTokens INTEGER NOT NULL DEFAULT 0,
CompletionTokens INTEGER NOT NULL DEFAULT 0,
CostUsd TEXT NOT NULL DEFAULT '0',
ToolCalls INTEGER NOT NULL DEFAULT 0,
ToolErrors INTEGER NOT NULL DEFAULT 0,
Denied INTEGER NOT NULL DEFAULT 0,
Staged INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (Day, AgentId)
);
CREATE INDEX IF NOT EXISTS IX_RunDaily_Unit ON RunDaily (UnitId, Day);
-- Staging (A2): eingefrorene, freigabepflichtige Tool-Aufrufe. Ausgeführt wird
-- genau der gespeicherte Argument-JSON (Plan-Freeze).
-- #698: a unit's doctrine, every version kept — who, when, which run, why.