File size: 16,657 Bytes
638dca1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 | # megaHarness β Architektur-Plan
**Status:** Architektur-Lock fΓΌr 5-Tage-MVP (2026-04-23 β 2026-04-28)
**Autor:** Samuel (Vision) + Claude/Opus 4.7 (Architektur-Synthese)
**Basis-Dokumente:** `idea` (Vision), `HarnessEcosystem/docs/gpt5-4-shift-report.md` (empirische Rechtfertigung)
---
## 0. North Star
megaHarness ist Samuels persΓΆnliches **Meta-Harness**: eine Schicht **ΓΌber** existierenden Agent-Harnesses (Claude Code, OpenClaude, Codex, OpenHands, Cursor, β¦), die sie als austauschbare Execution-Engines orchestriert. Der Wert liegt nicht in einem neuen Agent, sondern in **Komposition**: gleiche Task lΓ€uft auf anderem Harness + anderem Modell, ohne Re-Konfiguration.
Die acht Prinzipien aus `idea` sind nicht verhandelbar. Alles andere ist Implementierungsdetail.
---
## 1. Architektur in Schichten
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β L4 β UI-Layer β
β Dashboard Β· Track-Viewer Β· MD-DB-Browser Β· Eval-Viewer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L3 β Kernel (megaHarness-Core) β
β Task-Router Β· Parallel-Orchestrator Β· Sidecar-Engine β
β Eval-Engine Β· MD-Resolver Β· Harness-Swap β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L2 β MD-Datenbank (Source of Truth) β
β projects/ Β· instructions/ Β· skills/ Β· tracks/ Β· evals/ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L1 β Harness-Adapter-Layer β
β Claude-Code Β· OpenClaude Β· Codex Β· OpenHands Β· Hermes β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β L0 β Provider-Layer (extern, nicht megaHarness) β
β Anthropic Β· OpenAI Β· Google Β· MiniMax Β· lokale Modelle β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
**Kern-Invariante:** L3 kennt L1 nur durch Adapter-Interface, L2 nur durch Resolver-Interface, L0 nie direkt. So wird Modell-Swap und Harness-Swap zur Config-Γnderung, nicht zum Refactor.
---
## 2. Kern-Komponenten
### 2.1 MD-Datenbank (L2)
**Rolle:** Einzige Quelle der Wahrheit fΓΌr alle adaptiven VertrΓ€ge.
**EntitΓ€ten:**
- `projects/*.md` β Projekt-Briefs, Done-Kriterien, Scope-Locks
- `instructions/*.md` β CLAUDE.md-Γquivalente, per Harness + Modell versioniert
- `skills/*.md` β wiederverwendbare Skill-Definitionen
- `sidecar/*.md` β Regelwerke (ADHS-Hooks, Scope-Guards, Commit-Gates)
- `tracks/*.md` β Live-Track-Definitionen (Task, Harness, Modell, Budget, Done)
- `evals/*.jsonl` β Eval-LΓ€ufe, append-only
**AdaptivitΓ€t:** jedes MD-File hat Frontmatter mit `applies_when:`-Clauses (Harness-ID, Modell-ID, Projekt-ID, Session-Phase). Der **MD-Resolver** (L3) wΓ€hlt zur Laufzeit das relevante Subset. Nicht-adaptive .md-Files sind Legacy-Schicht.
**Warum Markdown + Frontmatter, nicht SQLite/Postgres:**
- Menschenlesbar, Git-diffbar
- LLM-nativ (kein Query-Layer nΓΆtig fΓΌr Konsumption)
- Versionierbar mit dem Repo
- Zero Infrastruktur, keine Migrations-Drama
**Trade-off:** keine komplexen Joins, keine Transaktionen. FΓΌr diesen Use-Case egal.
### 2.2 Harness-Adapter-Protokoll (L1βL3-Vertrag)
Jeder Harness-Adapter implementiert ein minimales Interface:
| Method | Zweck |
|---|---|
| `spawn(track_md)` | Starte Session aus Track-MD |
| `status(session_id)` | Lebens-Check, Tokens, Turn-Count |
| `interrupt(session_id)` | Hartes Stop |
| `collect(session_id)` | Transcript + Metriken holen |
| `capabilities()` | Was kann der Harness (Tools, Background, Worktrees) |
**Completion-Contract:** jeder Spawn bekommt aus der MD-DB eine explizite `done_when:`-Clause injiziert. Harnesses ohne native Contract-UnterstΓΌtzung (GPT-5.4 im Claude-Code-Harness: siehe Shift-Report) kriegen einen Wrapper-Prompt, der die Clause als System-Message voranstellt.
**Der Harness-Swap-Moment:** Swap = Track-MD unverΓ€ndert lassen, nur `harness_id:` im Frontmatter Γ€ndern. Re-Spawn. Der Kernel liefert dieselben Inputs.
### 2.3 Task-Router (L3)
**Input:** Task-Request (aus UI, CLI, Cron oder Eval-Trigger)
**Output:** Track-MD + Harness-Auswahl
**Routing-Logik:**
1. Matching: welche Harnesses + Modelle sind kompatibel mit Task-Typ
2. Policy: Default-Modell pro Task-Typ aus `instructions/router-policy.md`
3. Override: explizite User-Wahl schlΓ€gt Policy
4. Fallback: wenn PrimΓ€r-Harness unavailable, SekundΓ€r aus Policy
**Empirisch kalibriert:** Shift-Report zeigt, dass GPT-5.4 im Claude-Code-Harness 2β8M Input-Tokens pro Session verbrennt. Router-Policy verhindert diese Kombination by default, es sei denn explizit als Experiment deklariert.
### 2.4 Parallel-Orchestrator (L3)
**Rolle:** N Tracks gleichzeitig, keine Race Conditions im Dateisystem, Checkpoint-fΓ€hig.
**Mechanismen:**
- Git-Worktree pro Track (Isolation auf Repo-Ebene)
- tmux/supervisord fΓΌr Prozess-Leben (keine eigene Prozess-Verwaltung bauen)
- MD-Queue fΓΌr Track-Slots (`tracks/active/`, `tracks/queued/`, `tracks/done/`, `tracks/failed/`)
- Heartbeat-File pro Track fΓΌr Status-Polling
**KapazitΓ€t:** 3β5 Tracks parallel. Mehr ist Token-Verbrennung ohne Kognitions-Nutzen (Samuel kann nicht 8 parallel reviewen).
### 2.5 Sidecar-Engine (L3)
**Rolle:** Samuel-spezifische Kalibrierung β ADHS-Guards, Scope-Warnungen, Commit-Gates.
**Baut auf:** existierendem `Sidecar-ng`-Projekt (bereits produktiv, liefert die Hook-Payloads die dieser Dialog durchgehend zeigt).
**Integration:** Sidecar-Engine ist **kein neuer Code**, sondern ein Adapter der existierende Sidecar-NG-Events an die MD-DB und den Orchestrator sendet. Regeln kommen aus `sidecar/*.md`.
**Kernfunktion fΓΌr megaHarness:** Cross-Track-Scope-Guard. Wenn Track A in `home/` arbeitet und Track B plΓΆtzlich auch: Flag.
### 2.6 Eval-Engine (L3)
**Rolle:** jeder Track misst sich selbst.
**Baut auf:** existierendem `HarnessEcosystem/sidebyside` (liefert bereits snapshot-basierte Vergleiche, siehe Shift-Report).
**Metriken pro Track:**
- Token-Effizienz (in/out, pro Turn)
- Tool-Burst-Dichte (Tool-Calls pro Turn)
- Contract-AdhΓ€renz (Done-Clause erreicht?)
- Termination-Typ (clean / limit / interrupt / crash)
- Outcome-Label (manuell oder durch Review-Track)
**Feedback-Loop:** Eval-Ergebnisse schreiben zurΓΌck nach `evals/*.jsonl`. Router-Policy konsumiert aggregierte Evals β empirische Modell-Auswahl.
### 2.7 UI-Layer (L4)
**Kern-Views:**
1. Track-Dashboard (welche Tracks laufen, Status, ETA, Tokens)
2. MD-DB-Browser (Navigation + Diff)
3. Eval-Viewer (Baut auf `frontier-llm-harness`-Γsthetik auf)
4. Spawn-Composer (Track-MD erstellen β Router β Adapter)
**Technologie-Entscheidung:** statische SPA + lokaler HTTP-Server, liest direkt aus `tracks/` + `evals/`. Kein Backend. Grund: `sidebyside` + `frontier-llm-harness` haben das Pattern bereits bewiesen, keine neue Infrastruktur.
**Live-Updates:** Polling (nicht WebSocket). KISS.
---
## 3. Bausteine-Map (Was existiert, was fehlt)
| Schicht / Komponente | Existierend (β) / Fehlt (β) | Quelle |
|---|---|---|
| L2 MD-DB Schema | β | β |
| L2 MD-Resolver | β | β |
| L2 Adaptive Regeln existierend | (β) teilweise | PromptGarage, Skills |
| L1 Claude Code Adapter | (β) implizit (JSONL-Logs) | `~/.claude/projects/` |
| L1 Codex/GPT-5.4 Adapter | (β) implizit | `extract_codex.py` |
| L1 OpenClaude Adapter | β | Fork existiert, kein Adapter |
| L1 Hermes Adapter | (β) teilweise | `extract_hermes.py` |
| L1 OpenHands Adapter | β | β |
| L3 Harness-Swap Mechanik | (in Arbeit) | `derWolfimSchafspelz/openclaude` |
| L3 Task-Router | β | β |
| L3 Parallel-Orchestrator | β | β |
| L3 Sidecar-Engine | β | `Sidecar-ng` |
| L3 Eval-Engine | β | `HarnessEcosystem/sidebyside` |
| L4 Dashboard | (β) Aesthetik + Pattern | `SidecarDashboard`, `KomandoZentral`, `frontier-llm-harness` |
**SchlΓΌssel-Erkenntnis:** L2 (MD-DB) ist der kritische neue Baustein. L3-Kernel ist dΓΌnne Integration existierender Teile. L1-Adapter sind jeweils 1β2 Tage Arbeit, wir brauchen in 5 Tagen nur 2β3.
---
## 4. Harness-Swap β der aktuelle Build
**Definition:** Harness-Swap ist der Mechanismus, der denselben Task auf einem anderen Harness re-exekutiert, ohne Task-Definition zu Γ€ndern.
**Architekturrolle:** Harness-Swap ist **nicht** ein L1-Adapter. Es ist ein L3-Kernel-Feature, das L1-Adapter koordiniert.
**Interface:**
```
swap(track_id, from_harness, to_harness) β
1. collect(from_harness.session) β transcript + state
2. translate(state, to_harness.capabilities) β new_state
3. track_md.harness_id = to_harness
4. spawn(to_harness, track_md, continuation=new_state)
```
**State-Translation-Regeln** sind in `instructions/harness-translation-*.md` abgelegt (eine Datei pro Harness-Paar). Diese Regeln sind **adaptiv** β sie werden basierend auf Eval-Daten (was hat funktioniert beim letzten Swap?) fortgeschrieben.
**MVP-Umfang:** Claude Code β OpenClaude Swap. Alles andere Post-MVP.
---
## 5. Datenfluss β der eine zentrale Loop
```
User-Intent
β
MD-Resolver liest projects/ + instructions/
β
Task-Router wΓ€hlt Harness + Modell (Policy + Eval-History)
β
Track-MD geschrieben in tracks/active/
β
Parallel-Orchestrator spawnt via L1-Adapter
β
Harness lΓ€uft (mit Completion-Contract injiziert)
β
Sidecar-Engine beobachtet, flagt bei Regel-Verletzung
β
Abschluss: Eval-Engine schreibt nach evals/*.jsonl
β
Track-MD nach tracks/done/ verschoben
β
UI reflektiert neuen Zustand
β
Router-Policy lernt aus evals/ fΓΌr nΓ€chsten Spawn
```
Dieser Loop ist das System. Alles andere ist Verzierung.
---
## 6. 5-Tage-Meilensteine (architektonisch)
Jeder Meilenstein hat **eine binΓ€re Done-Frage**, nicht eine Feature-Liste.
### Tag 1 β Fundament (2026-04-23)
**Done-Frage:** Existiert `md-db/` mit Schema-definierten Frontmatter-Keys, und kann der MD-Resolver aus einer `tracks/example.md` eine zusammengesetzte Instruction produzieren?
- MD-DB-Schema finalisiert (Frontmatter-Felder, Ordner-Layout)
- MD-Resolver als dΓΌnner Layer
- Ein Beispiel-Track in der DB abgelegt
- **Non-Goal Tag 1:** kein Spawn, keine UI, kein Router
### Tag 2 β Execution (2026-04-24)
**Done-Frage:** Kann ein Track-MD via Adapter einen Claude-Code-Subprozess spawnen, laufen lassen, und das Transcript ingesten?
- L1-Adapter: Claude Code (via CLI-Spawn)
- L1-Adapter: OpenClaude (via Fork-CLI)
- L3 Spawn-Funktion im Kernel
- **Non-Goal:** kein Parallelismus, kein Swap, kein Router
### Tag 3 β ParallelitΓ€t + Router (2026-04-25)
**Done-Frage:** Laufen 3 Tracks gleichzeitig in Worktrees, ohne dass sie sich im Dateisystem zerstΓΆren, und wΓ€hlt der Router automatisch Harness+Modell aus der Policy?
- Parallel-Orchestrator mit Worktree-Isolation
- Task-Router mit statischer Policy (Eval-Feedback Post-MVP)
- Heartbeat + Status-Polling
- **Non-Goal:** UI, Swap
### Tag 4 β Swap + Eval-Integration (2026-04-26)
**Done-Frage:** Kann ein laufender Track von Claude Code nach OpenClaude geswapt werden, und schreibt der Eval-Hook nach Abschluss saubere Metriken in `evals/`?
- Harness-Swap (MVP: Claude Code β OpenClaude)
- Eval-Engine-Hook an Adapter-Collection angebunden
- `sidebyside`-Scripts als Eval-Konsumenten integriert
- **Non-Goal:** UI, Router-Lernen aus Evals
### Tag 5 β UI + E2E (2026-04-27, Puffer 2026-04-28)
**Done-Frage:** Sieht Samuel im Browser ein Track-Dashboard, kann er einen neuen Track spawnen und das Ergebnis inklusive Evals einsehen?
- Statische SPA mit Track-Dashboard + MD-DB-Browser + Eval-Viewer
- Spawn-Composer (einfache Form, kein Advanced)
- Ein echter E2E-Run: Spawn β Parallel β Swap β Eval β UI
- Puffer-Tag (28.04) fΓΌr Polish und unerwartete Blocker
---
## 7. Risiken & Mitigationen
| Risiko | Wahrscheinlichkeit | Impact | Mitigation |
|---|---|---|---|
| Scope-Creep ΓΌber MVP hinaus | Hoch | Hoch | Jeder Tag hat eine binΓ€re Done-Frage, nicht Feature-Liste. Post-MVP-Liste explizit in Β§9. |
| GPT-5.4 im Claude-Code-Harness verbrennt Token-Budget | Hoch | Mittel | Router-Policy verhindert Kombination by default. Nur als explizites Experiment. Empirisch belegt durch Shift-Report. |
| UI-Tag-5 wird zum Zeitfresser | Hoch | Hoch | Statische SPA, keine neue Infrastruktur. `frontier-llm-harness` als Muster. Kein Framework-Neuwahl. |
| MD-DB-Schema wird zu komplex | Mittel | Hoch | Schema β€ 10 Frontmatter-Keys im MVP. Erweiterung nur mit belegtem Use-Case. |
| Parallelismus zerstΓΆrt Dateisystem | Mittel | Hoch | Git-Worktree pro Track. Kein Shared-State auΓerhalb `md-db/`. |
| Bestehende Projekte nicht sauber integrierbar | Mittel | Mittel | MVP nutzt nur `Sidecar-ng` und `sidebyside` als Integration. Rest Post-MVP. |
| 5-Tage-SchΓ€tzung zu optimistisch | Hoch | Hoch | Tag 5 hat Puffer 28.04. MVP-Scope bewusst klein. Wenn Tag 3 nicht done: Swap+Eval gehen Post-MVP. |
| ADHS-Fokus-Kollaps | Mittel | Hoch | Sidecar-NG aktiv, tΓ€gliche Done-Frage als Anker, keine Parallelarbeit an mehr als EINEM Kernel-Teil gleichzeitig. |
---
## 8. Done-Kriterien (Tag 5)
Der MVP ist fertig, wenn **alle** folgenden Bedingungen wahr sind:
1. `md-db/` existiert mit den definierten Ordnern
2. Mindestens 2 Harness-Adapter funktionieren (Claude Code, OpenClaude)
3. 3 Tracks sind parallel gelaufen ohne gegenseitige Blockade
4. Ein Harness-Swap wurde erfolgreich durchgefΓΌhrt (Claude Code β OpenClaude)
5. Mindestens ein Eval-Lauf ist in `evals/` persistent
6. UI zeigt aktuelle Tracks + Evals korrekt
7. Ein Ende-zu-Ende-Flow (Spawn β Parallel β Swap β Eval β UI) lief ohne manuelle Eingriffe durch
Wenn 5 von 7 erreicht: **MVP accepted**. Wenn weniger: MVP-Scope reevaluieren, nicht verlΓ€ngern.
---
## 9. Non-Goals (Post-MVP, bewusst ausgeschlossen)
- Cursor-Adapter
- OpenHands-Adapter
- Hermes-Adapter (Collect-Script reicht)
- Router-Policy-Lernen aus Eval-History
- Advanced Spawn-Composer in UI (Form-only reicht)
- Fremde Repos als Tracks (nur eigene im MVP)
- Cloud-Deployment
- Multi-User
- Auth
- Mobile-UI
- Persistente DB (MD-Files reichen)
- Config-Hot-Reload
- Skill-Marketplace
- Eval-Auto-Labeling durch Review-Track
Jeder dieser Punkte ist ein legitimes Feature β aber nicht in 5 Tagen.
---
## 10. Glossar
- **Harness**: AusfΓΌhrungsumgebung fΓΌr einen Agent (Claude Code, Codex, OpenHands β¦)
- **Modell**: LLM-Endpoint (Opus, GPT-5.4, β¦)
- **Track**: Eine konkrete Task-Instanz mit Harness + Modell + Projekt-Kontext
- **Spawn**: Track in einem Harness starten
- **Swap**: Track mitten im Leben auf anderen Harness ΓΌbertragen
- **MD-DB**: Markdown-basierte Datenbank (L2)
- **Completion-Contract**: Explizites `done_when:` in Track-MD
- **Adaptiv**: .md-File gilt nur wenn Frontmatter-`applies_when:` zur Laufzeit matcht
---
## 11. Offene Architektur-Fragen (vor Tag 1 zu entscheiden)
1. **Kernel-Sprache:** Python (ΓΆkosystemnah zu Claude Code + Codex) vs TypeScript (nΓ€her an UI). **Empfehlung: Python**, Grund: alle existierenden Scripts (`extract_*.py`, `build_snapshot.py`) sind Python. Kein Sprach-Bruch.
2. **Prozess-Modell:** tmux vs supervisord vs systemd-user. **Empfehlung: tmux**, Grund: Samuel nutzt es bereits, minimal neues Setup.
3. **UI-Framework:** vanilla JS (wie `sidebyside`) vs Preact vs Svelte. **Empfehlung: vanilla**, Grund: `sidebyside` + `frontier-llm-harness` sind vanilla und lesbar.
4. **MD-DB-Location:** `~/.megaharness/md-db/` vs im Repo. **Empfehlung: im Repo** (`megaHarness/md-db/`), Grund: Git-versioniert, portabel, diffbar.
---
**Dieser Plan ist ein Vertrag zwischen Samuel und dem 5-Tage-Ich. Jede Abweichung muss als ADR (Architecture Decision Record) in `docs/adr/` dokumentiert werden β oder explizit abgelehnt und hier gestrichen. Keine stille Scope-Drift.**
|