Phase 1 Spec: Feedback-Loop schließen
Ziel: Den evolutionären Loop von “Prelife” (Feedback stirbt nach Quality-Gate) zu “Proto-Life” (Feedback fließt in Skill-Bewertung und triggert Verbesserung) bringen.
Scope: Minimal Viable Feedback Loop. Kein automatisches Mutieren — nur Messen, Sichtbar machen, Trigger setzen.
Inspiriert von: EvoFlow (Pareto: Quality + Cost), EvoAgentX (Evaluation Layer), MCE (History of skills, executions, evaluations)
Was existiert (IST)
| Komponente | Tool | Was es liefert | Wo es endet |
|---|---|---|---|
| Skill-Ausführung | Skill Router | Welcher Skill für welchen Intent | Log in DB (skills_usage) |
| Token-Verbrauch | Usage Tracking | Tokens/Session, Velocity | Usage-DB (SQLite) |
| Qualität | Quality-Gate / signal-check | Quality-Score per Output | memory/quality-scores.md |
| Routing-Historie | routing-log | Skill → Trigger → Outcome | knowledge.db |
Das Problem: Diese 4 Datenströme sind nicht verbunden. Wir wissen nicht: “Skill X kostet durchschnittlich Y Tokens und liefert Quality-Score Z.”
Was gebaut werden muss (SOLL)
1. Skill-Performance-Log (Kern)
Was: Nach jeder Skill-Ausführung einen strukturierten Eintrag in eine zentrale Tabelle.
CREATE TABLE IF NOT EXISTS skill_performance (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
skill_name TEXT NOT NULL,
task_type TEXT, -- 'research', 'writing', 'analysis', 'code', 'review'
quality_score REAL, -- 0.0-1.0, aus Quality-Gate/signal-check
token_cost INTEGER, -- Tokens verbraucht (Input + Output)
duration_seconds REAL, -- Wandzeit
outcome TEXT, -- 'success', 'partial', 'failure', 'skipped'
project TEXT, -- Projekt-Name (aus Working Directory / Projekt-State)
notes TEXT -- Optional: Warum Erfolg/Misserfolg
);
Wo: Eine lokale SQLite-Datenbank (z.B. knowledge.db). Kann in jedes bestehende Agent-Framework integriert werden.
Wann: Am Ende jeder Skill-Execution. Kann als Hook oder manuell per Routing-Log-Update implementiert werden.
2. Aggregierte Skill-Metriken (View)
CREATE VIEW IF NOT EXISTS skill_metrics AS
SELECT
skill_name,
COUNT(*) as total_uses,
AVG(quality_score) as avg_quality,
AVG(token_cost) as avg_cost,
AVG(duration_seconds) as avg_duration,
SUM(CASE WHEN outcome = 'success' THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as success_rate,
MIN(timestamp) as first_used,
MAX(timestamp) as last_used
FROM skill_performance
GROUP BY skill_name;
Nutzung: SELECT * FROM skill_metrics ORDER BY avg_quality DESC; zeigt sofort die besten/schlechtesten Skills.
3. Pareto-Ansicht (Quality vs. Cost)
-- Skills die für ihren Cost überdurchschnittliche Quality liefern
SELECT
skill_name,
avg_quality,
avg_cost,
total_uses,
CASE
WHEN avg_quality > (SELECT AVG(avg_quality) FROM skill_metrics)
AND avg_cost < (SELECT AVG(avg_cost) FROM skill_metrics)
THEN 'PARETO-OPTIMAL'
WHEN avg_quality < (SELECT AVG(avg_quality) FROM skill_metrics)
AND avg_cost > (SELECT AVG(avg_cost) FROM skill_metrics)
THEN 'DOMINATED'
ELSE 'TRADE-OFF'
END as pareto_status
FROM skill_metrics
WHERE total_uses >= 3 -- Mindestens 3 Nutzungen für belastbare Daten
ORDER BY avg_quality DESC;
4. Automatische Trigger (Alerts, nicht Aktionen)
| Trigger | Bedingung | Aktion |
|---|---|---|
| Quality Drop | avg_quality < 0.5 UND total_uses >= 5 | “Skill X hat niedrige Quality. Review nötig?” |
| Cost Outlier | avg_cost > 2× Median aller Skills | “Skill X kostet doppelt so viel wie der Median.” |
| Unused Skill | last_used > 30 Tage | “Skill X seit 30 Tagen ungenutzt. Noch relevant?” |
| New Champion | Neuer Skill hat höhere avg_quality als bisheriger Default für task_type | “Skill Y übertrifft Skill X für [task_type].” |
Wichtig: Phase 1 triggert nur Alerts an den User. Keine automatischen Änderungen. Der Mensch entscheidet.
Integration in bestehende Komponenten
Skill Router (anpassen)
Nach Skill-Ausführung → INSERT INTO skill_performance. Der Routing-Log-Eintrag (skills_usage) wird um die Performance-Felder erweitert ODER skill_performance als separater, detaillierterer Log geführt.
Empfehlung: Separater Log. skills_usage bleibt das Routing-Log (warum wurde geroutet), skill_performance ist das Performance-Log (wie gut war das Ergebnis).
Quality Gate (anpassen)
Quality-Score wird zusätzlich zur bestehenden Speicherung in skill_performance geschrieben.
Usage Tracking (auslesen, nicht ändern)
Token-Verbrauch pro Session wird über das bestehende Usage-Tracking erfasst. Für Phase 1: Manuell den Token-Count pro Skill-Nutzung aus der Session ableiten. Für Phase 2: Usage-Events direkt mit skill_performance verknüpfen.
Improvement Loop (anpassen)
Der Verbesserungs-Loop bekommt Zugriff auf skill_metrics View. Statt nur Routing-Logs: echte Performance-Daten als Basis für Verbesserungsvorschläge.
Implementierungsplan
Schritt 1: Schema erstellen (5 Min)
sqlite3 knowledge.db < schema.sql
Schritt 2: Logging-Hook definieren (30 Min)
- Option A: Claude Code Hook (
post_tool_call) der nach Skill-Tool-Aufruf den Performance-Eintrag schreibt - Option B: Manueller Block am Ende jedes Skills: “Log Performance”
- Empfehlung: Option A (Hook) — automatisch, kein manueller Aufwand
Schritt 3: Routing-Log-Eintrag erweitern (15 Min)
-- Bestehenden skills_usage Eintrag mit outcome updaten
UPDATE skills_usage SET outcome = '<success|partial|failure>' WHERE id = <last_insert>;
Schritt 4: Metriken-Abfrage testen (15 Min)
- View erstellen
- Test-Daten einfügen
SELECT * FROM skill_metricsvalidieren
Schritt 5: Trigger-Logik in Improvement Loop einbauen (1h)
- Alerts als Teil des improve-Outputs
- Pareto-Klassifikation pro Skill
Schritt 6: 2 Wochen sammeln, dann auswerten
- Mindestens 50 Skill-Ausführungen für belastbare Statistik
- Erste Erkenntnisse: Welche Skills sind Pareto-optimal? Welche dominated?
Was Phase 1 NICHT tut
- ❌ Automatisches Mutieren von Skills
- ❌ A/B-Testing von Skill-Varianten
- ❌ Crossover (neue Skills aus bestehenden)
- ❌ Populationsmanagement (Niching)
- ❌ Automatische Workflow-Topologie-Änderungen
All das ist Phase 2+. Phase 1 liefert die Datenbasis, ohne die keine Evolution möglich ist.
Erfolgskriterien
| Kriterium | Messung |
|---|---|
| Performance-Daten werden gesammelt | ≥ 50 Einträge nach 2 Wochen |
| Pareto-Ansicht funktioniert | Mindestens 1 Skill als PARETO-OPTIMAL, 1 als DOMINATED identifiziert |
| Erster Alert feuert | Mindestens 1 Quality-Drop oder Cost-Outlier-Alert |
| Improvement Loop nutzt Daten | Output referenziert skill_metrics |
| User-Entscheidung wird getroffen | Mindestens 1 Skill-Änderung basierend auf Performance-Daten |
Verbindung zu Nowak
Diese Phase 1 implementiert den Messapparat — Nowaks fᵢ (Fitness pro Individuum) und φ (Populations-Durchschnitt). Ohne diese Messung gibt es keinen Selektionsdruck, nur Drift.
Die Pareto-Ansicht (Quality vs. Cost) ist der erste Schritt zu Multi-Objective-Selektion — EvoFlow’s Kernidee, auf ein konkretes Agent-System übertragen.
Die Trigger sind der Selektionsdruck — sie erzwingen keine Änderung, aber sie machen sichtbar, WO Änderung nötig wäre. Das ist der Übergang von “kein Signal” zu “Signal vorhanden” — der erste Schritt des Phasenübergangs.