Download ARCHITECTURE.md from smlflg/megaHarness: direct link, hf CLI and curl.
- Browser
- Download file 16.7 kB
-
https://huggingface.co/smlflg/megaHarness/resolve/main/ARCHITECTURE.md
- Command line
-
hf download hf://smlflg/megaHarness/ARCHITECTURE.md
-
curl -L -o ARCHITECTURE.md https://huggingface.co/smlflg/megaHarness/resolve/main/ARCHITECTURE.md
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-Locksinstructions/*.md— CLAUDE.md-Äquivalente, per Harness + Modell versioniertskills/*.md— wiederverwendbare Skill-Definitionensidecar/*.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:
- Matching: welche Harnesses + Modelle sind kompatibel mit Task-Typ
- Policy: Default-Modell pro Task-Typ aus
instructions/router-policy.md - Override: explizite User-Wahl schlägt Policy
- 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:
- Track-Dashboard (welche Tracks laufen, Status, ETA, Tokens)
- MD-DB-Browser (Navigation + Diff)
- Eval-Viewer (Baut auf
frontier-llm-harness-Ästhetik auf) - 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:
md-db/existiert mit den definierten Ordnern- Mindestens 2 Harness-Adapter funktionieren (Claude Code, OpenClaude)
- 3 Tracks sind parallel gelaufen ohne gegenseitige Blockade
- Ein Harness-Swap wurde erfolgreich durchgeführt (Claude Code → OpenClaude)
- Mindestens ein Eval-Lauf ist in
evals/persistent - UI zeigt aktuelle Tracks + Evals korrekt
- 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)
- 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. - Prozess-Modell: tmux vs supervisord vs systemd-user. Empfehlung: tmux, Grund: Samuel nutzt es bereits, minimal neues Setup.
- UI-Framework: vanilla JS (wie
sidebyside) vs Preact vs Svelte. Empfehlung: vanilla, Grund:sidebyside+frontier-llm-harnesssind vanilla und lesbar. - 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.