Initial public upload from Projekte/MultiHarnessStudio
Browse files- .codex.pre-coding-mcp-20260908T010027 +0 -0
- .codex/config.toml +31 -0
- .gitignore +8 -0
- Claude +230 -0
- README.md +77 -0
- Spine_Idea/GPT_PLAN +518 -0
- Spine_Idea/spine-konzept.html +1310 -0
- V0.5_KZ_Road_to_Von_NEUMANN-Agent-System/Kritik_GPT +58 -0
- V0.5_KZ_Road_to_Von_NEUMANN-Agent-System/Kritik_mini_gemini +42 -0
- V0.5_KZ_Road_to_Von_NEUMANN-Agent-System/Plan +154 -0
- docs/spine-v1-architecture.md +141 -0
- examples/run_lifecycle/artifact_manifest.json +16 -0
- examples/run_lifecycle/eval_record.json +20 -0
- examples/run_lifecycle/events.json +100 -0
- examples/run_lifecycle/execution_request.json +22 -0
- examples/run_lifecycle/execution_status.json +13 -0
- examples/run_lifecycle/route_trace.json +29 -0
- examples/run_lifecycle/routing_decision.json +19 -0
- examples/run_lifecycle/run_record.json +22 -0
- examples/run_lifecycle/task_request.json +33 -0
- idea +118 -0
- newinfo +40 -0
- path +734 -0
- registry/adapters/agentide.json +14 -0
- registry/adapters/harnessecosystem.json +14 -0
- registry/adapters/komandozentral.json +14 -0
- registry/adapters/metametameta.json +14 -0
- registry/adapters/ueber_agent.json +14 -0
- registry/harnesses/claude-code.json +18 -0
- registry/harnesses/codex-cli.json +18 -0
- registry/harnesses/hermes.json +18 -0
- registry/harnesses/opencode.json +18 -0
- registry/system_manifest.json +55 -0
- schemas/adapter_manifest.schema.json +36 -0
- schemas/artifact_manifest.schema.json +45 -0
- schemas/eval_record.schema.json +42 -0
- schemas/execution_request.schema.json +53 -0
- schemas/execution_status.schema.json +36 -0
- schemas/harness_manifest.schema.json +46 -0
- schemas/operator_context.schema.json +26 -0
- schemas/route_trace.schema.json +41 -0
- schemas/routing_decision.schema.json +44 -0
- schemas/run_record.schema.json +64 -0
- schemas/spine_event.schema.json +56 -0
- schemas/system_manifest.schema.json +48 -0
- schemas/task_request.schema.json +45 -0
- scripts/validate_spine.py +132 -0
.codex.pre-coding-mcp-20260908T010027
ADDED
|
File without changes
|
.codex/config.toml
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Coding MCPs: project-local registration (2026-09-07).
|
| 2 |
+
|
| 3 |
+
[mcp_servers.serena]
|
| 4 |
+
command = "/home/smlflg/.local/share/coding-mcp/serena/.venv/bin/serena"
|
| 5 |
+
args = ["start-mcp-server", "--context=codex", "--project", "/home/smlflg/Projekte/MultiHarnessStudio", "--enable-web-dashboard", "false", "--open-web-dashboard", "false", "--enable-gui-log-window", "false"]
|
| 6 |
+
cwd = "/home/smlflg/Projekte/MultiHarnessStudio"
|
| 7 |
+
enabled = true
|
| 8 |
+
startup_timeout_sec = 120
|
| 9 |
+
tool_timeout_sec = 180
|
| 10 |
+
|
| 11 |
+
[mcp_servers.serena.env]
|
| 12 |
+
"SERENA_HOME" = "/home/smlflg/.local/share/coding-mcp/serena/state"
|
| 13 |
+
|
| 14 |
+
[mcp_servers.gitnexus]
|
| 15 |
+
command = "/home/smlflg/.nvm/versions/node/v24.13.0/bin/node"
|
| 16 |
+
args = ["/home/smlflg/.local/share/coding-mcp/gitnexus/node_modules/gitnexus/dist/cli/index.js", "mcp"]
|
| 17 |
+
cwd = "/home/smlflg/Projekte/MultiHarnessStudio"
|
| 18 |
+
enabled = true
|
| 19 |
+
startup_timeout_sec = 120
|
| 20 |
+
tool_timeout_sec = 180
|
| 21 |
+
|
| 22 |
+
[mcp_servers.gitnexus.env]
|
| 23 |
+
"GITNEXUS_HOME" = "/home/smlflg/.local/share/coding-mcp/gitnexus/runtime"
|
| 24 |
+
|
| 25 |
+
[mcp_servers.context7]
|
| 26 |
+
command = "/home/smlflg/.nvm/versions/node/v24.13.0/bin/node"
|
| 27 |
+
args = ["/home/smlflg/.local/share/coding-mcp/context7/node_modules/@upstash/context7-mcp/dist/index.js"]
|
| 28 |
+
cwd = "/home/smlflg/Projekte/MultiHarnessStudio"
|
| 29 |
+
enabled = true
|
| 30 |
+
startup_timeout_sec = 120
|
| 31 |
+
tool_timeout_sec = 180
|
.gitignore
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.codex
|
| 2 |
+
.hermes/
|
| 3 |
+
.pytest_cache/
|
| 4 |
+
__pycache__/
|
| 5 |
+
**/__pycache__/
|
| 6 |
+
*.py[cod]
|
| 7 |
+
.DS_Store
|
| 8 |
+
|
Claude
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
╭─── Claude Code v2.1.96 ────────────────────────────────────────────────────────────────────────────────────────────────╮
|
| 2 |
+
│ │ Tips for getting s│ │
|
| 3 |
+
│ Welcome back Samuel! │ Run /init to creat│ │
|
| 4 |
+
│ │ ───────────────────────────────────────────────────────────────── │
|
| 5 |
+
│ ▐▛███▜▌ │ Recent activity │ │
|
| 6 |
+
│ ▝▜█████▛▘ │ No recent activity│ │
|
| 7 |
+
│ ▘▘ ▝▝ │ │
|
| 8 |
+
│ Opus 4.6 · Claude API · smlflg@gmail.com's │ │
|
| 9 |
+
│ Organization │ │
|
| 10 |
+
│ ~/Projekte/MultiHarnessStudio │ │
|
| 11 |
+
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
|
| 12 |
+
|
| 13 |
+
❯ researchmode Wait
|
| 14 |
+
|
| 15 |
+
● Skill(/researchmode)
|
| 16 |
+
⎿ Successfully loaded skill
|
| 17 |
+
|
| 18 |
+
● Topic "Wait" ist zu vage — was genau willst du recherchieren?
|
| 19 |
+
|
| 20 |
+
Mögliche Interpretationen:
|
| 21 |
+
- Async Wait Patterns (asyncio, threading, polling strategies)?
|
| 22 |
+
- Wait/Retry in Test Harnesses (Testframework-spezifisch)?
|
| 23 |
+
- UI Wait States (Loading, Skeleton, Progress)?
|
| 24 |
+
- Etwas anderes im Kontext von MultiHarnessStudio?
|
| 25 |
+
|
| 26 |
+
Kurze Klarstellung, dann starte ich sofort die Gemini-Research.
|
| 27 |
+
|
| 28 |
+
❯ So ich bin ja schon länger auf der spur metametameta und ganz viele anderne projekte alle sind teilschritte auf dem weg zum ablsoluten von neumann
|
| 29 |
+
agenten, die erkenntiniss die hier pwd ls abgespiercht sind sollen mit andern ergebnissen und projekten vom wissens und erkenntnis stand verknüpft
|
| 30 |
+
werden. nute pro projekt einen subagent, METAMETAMETA;UEBERAGENT;KOMANDOZTENTRAL;harnessEcosystem;AgentIDE es geht um darum rauszunfidnen was mir
|
| 31 |
+
fehlt, um alle das zu einem konsistenezen system zusammen zu setztn
|
| 32 |
+
|
| 33 |
+
Listed 1 directory (ctrl+o to expand)
|
| 34 |
+
|
| 35 |
+
● Gefunden. Ich spawne jetzt 6 parallele Scouts — einen pro Kernprojekt — plus einen für MultiHarnessStudio selbst. Jeder analysiert Vision, Architektur
|
| 36 |
+
und Erkenntnisstand.
|
| 37 |
+
|
| 38 |
+
● 6 background agents launched (↓ to manage)
|
| 39 |
+
├─ scout-metametameta: Scout: MetaMetaMeta
|
| 40 |
+
├─ scout-ueberagent: Scout: UEBER_AGENT
|
| 41 |
+
├─ scout-komandozentral: Scout: KomandoZentral
|
| 42 |
+
├─ scout-harnessecosystem: Scout: HarnessEcosystem
|
| 43 |
+
├─ scout-agentide: Scout: AgentIDE
|
| 44 |
+
└─ scout-multiharnass: Scout: MultiHarnessStudio
|
| 45 |
+
|
| 46 |
+
● 6 Scouts laufen parallel — je einer für:
|
| 47 |
+
|
| 48 |
+
┌─────┬────────────────────┬────────────────────────────────┐
|
| 49 |
+
│ # │ Projekt │ Fragestellung │
|
| 50 |
+
├─────┼────────────────────┼────────────────────────────────┤
|
| 51 |
+
│ 1 │ MetaMetaMeta │ Vision, Konzepte, Erkenntnisse │
|
| 52 |
+
├─────┼────────────────────┼────────────────────────────────┤
|
| 53 |
+
│ 2 │ UEBER_AGENT │ Vision, Konzepte, Erkenntnisse │
|
| 54 |
+
├─────┼────────────────────┼────────────────────────────────┤
|
| 55 |
+
│ 3 │ KomandoZentral │ Vision, Konzepte, Erkenntnisse │
|
| 56 |
+
├─────┼────────────────────┼────────────────────────────────┤
|
| 57 |
+
│ 4 │ HarnessEcosystem │ Vision, Konzepte, Erkenntnisse │
|
| 58 |
+
├─────┼────────────────────┼��───────────────────────────────┤
|
| 59 |
+
│ 5 │ AgentIDE │ Vision, Konzepte, Erkenntnisse │
|
| 60 |
+
├─────┼────────────────────┼────────────────────────────────┤
|
| 61 |
+
│ 6 │ MultiHarnessStudio │ Vision, Konzepte, Erkenntnisse │
|
| 62 |
+
└─────┴────────────────────┴────────────────────────────────┘
|
| 63 |
+
|
| 64 |
+
Sobald alle zurück sind, synthetisiere ich:
|
| 65 |
+
- Überlappungen — wo machen Projekte das Gleiche?
|
| 66 |
+
- Lücken — was fehlt für ein konsistentes Von-Neumann-System?
|
| 67 |
+
- Verbindungen — welche Projekte sind natürliche Schichten eines Stacks?
|
| 68 |
+
|
| 69 |
+
Warte auf die Ergebnisse — du kannst in der Zwischenzeit weiterreden wenn du willst.
|
| 70 |
+
|
| 71 |
+
✻ Cooked for 41s · 6 local agents still running
|
| 72 |
+
|
| 73 |
+
● Agent "Scout: MetaMetaMeta" completed
|
| 74 |
+
|
| 75 |
+
● MetaMetaMeta-Scout ist zurück — massiver Output. Kernfund: "Sophisticated Planner with Execution Gaps" — starke Diagnose, schwache Umsetzung. 69
|
| 76 |
+
Skills, 10 genutzt. 27% Completion Rate.
|
| 77 |
+
|
| 78 |
+
Warte auf die restlichen 5 Scouts, dann kommt die Synthese.
|
| 79 |
+
|
| 80 |
+
● Agent "Scout: HarnessEcosystem" completed
|
| 81 |
+
|
| 82 |
+
● HarnessEcosystem-Scout zurück — Kernfund: Harness-Router-Website mit Wellenmodus-Workflow und Style-Fit Matrix. ~90% fertig. Insight: "Harness-Wahl
|
| 83 |
+
kritischer als Modell-Wahl."
|
| 84 |
+
|
| 85 |
+
Noch 4 Scouts ausstehend (UEBER_AGENT, KomandoZentral, AgentIDE, MultiHarnessStudio).
|
| 86 |
+
|
| 87 |
+
● Agent "Scout: UEBER_AGENT" completed
|
| 88 |
+
|
| 89 |
+
● Agent "Scout: AgentIDE" completed
|
| 90 |
+
|
| 91 |
+
● Agent "Scout: MultiHarnessStudio" completed
|
| 92 |
+
|
| 93 |
+
● 4 von 5 zurück. Noch ausstehend: KomandoZentral. Sobald der letzte Scout da ist, kommt die Gap-Analyse.
|
| 94 |
+
|
| 95 |
+
● Agent "Scout: KomandoZentral" completed
|
| 96 |
+
|
| 97 |
+
● Alle 6 Scouts sind zurück. Jetzt die Synthese.
|
| 98 |
+
|
| 99 |
+
---
|
| 100 |
+
Synthese: 6 Projekte → Was fehlt zum Von-Neumann-System?
|
| 101 |
+
|
| 102 |
+
Die Landkarte — Was existiert
|
| 103 |
+
|
| 104 |
+
┌────────────────────┬──────────────────────────────────┬────────────────────────────────┬─────────────────────────────────────────────────────────┐
|
| 105 |
+
│ Projekt │ Rolle │ Status │ Kern-Erkenntnis │
|
| 106 |
+
├────────────────────┼──────────────────────────────────┼────────────────────────────────┼─────────────────────────────────────────────────────────┤
|
| 107 |
+
│ MetaMetaMeta │ Diagnose & Forschung │ Analyse fertig, keine │ "Sophisticated Planner with Execution Gaps" │
|
| 108 |
+
│ │ │ Execution │ │
|
| 109 |
+
├────────────────────┼──────────────────────────────────┼────────────────────────────────┼─────────────────────────────────────────────────────────┤
|
| 110 |
+
│ UEBER_AGENT │ Agent→Agent Router (Stern1) │ 14% Pass Rate, kaputt │ Session-Isolation ist schwer, Self-Work statt │
|
| 111 |
+
│ │ │ │ Delegation │
|
| 112 |
+
├────────────────────┼──────────────────────────────────┼────────────────────────────────┼─────────────────────────────────────────────────────────┤
|
| 113 |
+
│ KomandoZentral │ Task→Harness Router (CLI) │ Working Alpha-MVP │ Confidence-Levels + Operator-State als Routing-Input │
|
| 114 |
+
├────────────────────┼──────────────────────────────────┼───────────────────��────────────┼─────────────────────────────────────────────────────────┤
|
| 115 |
+
│ HarnessEcosystem │ Visualisierung & │ ~90% Website fertig │ "Harness-Wahl > Modell-Wahl" │
|
| 116 |
+
│ │ Decision-Support │ │ │
|
| 117 |
+
├────────────────────┼──────────────────────────────────┼────────────────────────────────┼─────────────────────────────────────────────────────────┤
|
| 118 |
+
│ AgentIDE │ Agent-Orchestration UI │ MVP mit Mock-Agents │ Pipeline-Architektur (Coder→Reviewer→Tester) │
|
| 119 |
+
│ │ │ │ funktioniert │
|
| 120 |
+
├────────────────────┼──────────────────────────────────┼────────────────────────────────┼─────────────────────────────────────────────────────────┤
|
| 121 |
+
│ MultiHarnessStudio │ Framework-Konzept │ Nur Docs, kein Code │ Drei-Layer-Prompting (Task / Harness / Model) │
|
| 122 |
+
└────────────────────┴──────────────────────────────────┴────────────────────────────────┴─────────────────────────────────────────────────────────┘
|
| 123 |
+
|
| 124 |
+
Von-Neumann-Mapping — Wo sitzt was?
|
| 125 |
+
|
| 126 |
+
┌─────────────────────────────────────────────────┐
|
| 127 |
+
│ CONTROL (Routing & Orchestrierung) │
|
| 128 |
+
│ ┌──────────────┐ ┌──────────────┐ ┌─────────┐ │
|
| 129 |
+
│ │KomandoZentral│ │ UEBER_AGENT │ │Sidecar │ │
|
| 130 |
+
│ │ Task→Harness │ │ Task→Agent │ │Prompt→ │ │
|
| 131 |
+
│ │ ✅ alpha │ │ ❌ 14% │ │Context │ │
|
| 132 |
+
│ └──────────────┘ └──────────────┘ │ ✅ works│ │
|
| 133 |
+
│ └─────────┘ │
|
| 134 |
+
├─────────────────────────────────────────────────┤
|
| 135 |
+
│ PROCESSING (Execution) │
|
| 136 |
+
│ ┌──────────┐ ┌────────────────────────────┐ │
|
| 137 |
+
│ │ AgentIDE │ │ Externe Harnesses │ │
|
| 138 |
+
│ │ Mock only│ │ Claude Code, Hermes, │ │
|
| 139 |
+
│ │ ⚠️ │ │ OpenCode, Codex, Cursor │ │
|
| 140 |
+
│ └──────────┘ └────────────────────────────┘ │
|
| 141 |
+
├─────────────────────────────────────────────────┤
|
| 142 |
+
│ MEMORY (Persistent State & Lernen) │
|
| 143 |
+
│ ┌──────────────┐ │
|
| 144 |
+
│ │MetaMetaMeta │ ← Markdown-Docs, kein API │
|
| 145 |
+
│ │ Analyse only │ │
|
| 146 |
+
│ └──────────────┘ │
|
| 147 |
+
├─────────────────────────────────────────────────┤
|
| 148 |
+
│ I/O (Human Interface) │
|
| 149 |
+
│ ┌────────────────┐ ┌──────────────────┐ │
|
| 150 |
+
│ │HarnessEcosystem│ │MultiHarnessStudio│ │
|
| 151 |
+
│ │ Website ✅ │ │ Konzept nur 📄 │ │
|
| 152 |
+
│ └────────────────┘ └──────────────────┘ │
|
| 153 |
+
├──────────��──────────────────────────────────────┤
|
| 154 |
+
│ SELF-MODIFICATION (Feedback → Regelanpassung) │
|
| 155 |
+
│ │
|
| 156 |
+
│ ❌ EXISTIERT NICHT │
|
| 157 |
+
│ │
|
| 158 |
+
└─────────────────────────────────────────────────┘
|
| 159 |
+
|
| 160 |
+
Die 7 Lücken
|
| 161 |
+
|
| 162 |
+
1. Drei Router, keine Einheit
|
| 163 |
+
KomandoZentral (Task→Harness), UEBER_AGENT (Task→Agent), Sidecar-NG (Prompt→Context) — drei separate Systeme die dasselbe Problem auf verschiedenen
|
| 164 |
+
Ebenen lösen. Kein gemeinsames Routing-Protokoll.
|
| 165 |
+
|
| 166 |
+
2. Kein Execution-Bridge
|
| 167 |
+
KomandoZentral empfiehlt einen Harness, führt aber nicht aus. AgentIDE hat Pipelines, aber nur Mocks. UEBER_AGENT versucht zu delegieren, scheitert.
|
| 168 |
+
Niemand verbindet Entscheidung → Ausführung.
|
| 169 |
+
|
| 170 |
+
3. Kein persistenter Cross-Project Memory
|
| 171 |
+
MetaMetaMeta dokumentiert Erkenntnisse als Markdown. Aber es gibt keinen programmatischen Weg, wie KomandoZentral auf MetaMetaMeta-Insights zugreift
|
| 172 |
+
oder AgentIDE Outcomes zurückmeldet.
|
| 173 |
+
|
| 174 |
+
4. Kein Feedback-Loop (Self-Modification)
|
| 175 |
+
Das ist die eigentliche Von-Neumann-Lücke: Das System kann sich nicht selbst verbessern. KomandoZentral hat kein Outcome-Tracking. AgentArena kann
|
| 176 |
+
evaluieren, aber die Ergebnisse fließen nicht zurück in Routing-Regeln.
|
| 177 |
+
|
| 178 |
+
5. Kein gemeinsames Datenmodell
|
| 179 |
+
YAML (KomandoZentral), JSON (HarnessEcosystem), Markdown (MetaMetaMeta), SQLite (AgentIDE/PromptGarage). Keine gemeinsame Schema-Sprache.
|
| 180 |
+
|
| 181 |
+
6. Concept-Code-Gap
|
| 182 |
+
MultiHarnessStudio's Drei-Layer-Prompting (Task Spec / Harness Adaptation / Model Adaptation) ist die stärkste konzeptuelle Erkenntnis — aber hat null
|
| 183 |
+
Zeilen Code.
|
| 184 |
+
|
| 185 |
+
7. Samuel ist der Bottleneck
|
| 186 |
+
In allen Projekten ist Samuel der manuelle Router, Evaluator, und Memory-Layer. Das System braucht ihn für jede Entscheidung. Das ist das Gegenteil von
|
| 187 |
+
Von Neumann — ein gespeichertes Programm sollte ohne den Operator laufen können.
|
| 188 |
+
|
| 189 |
+
Was fehlt konkret
|
| 190 |
+
|
| 191 |
+
FÜR EIN KONSISTENTES SYSTEM BRAUCHST DU:
|
| 192 |
+
|
| 193 |
+
1. UNIFIED ROUTING PROTOCOL
|
| 194 |
+
KomandoZentral + Sidecar-NG als ein Stack
|
| 195 |
+
Input: Task → Output: Harness + Context + Confidence
|
| 196 |
+
|
| 197 |
+
2. EXECUTION BRIDGE
|
| 198 |
+
AgentIDE mit echten LLM-Calls statt Mocks
|
| 199 |
+
ODER: KomandoZentral → direkter Harness-Aufruf
|
| 200 |
+
|
| 201 |
+
3. OUTCOME STORE (der fehlende Memory-Layer)
|
| 202 |
+
Task → Routing Decision → Execution → Result → Score
|
| 203 |
+
Jede Entscheidung wird persistent + queryable
|
| 204 |
+
|
| 205 |
+
4. FEEDBACK LOOP
|
| 206 |
+
Outcome Store → KomandoZentral Rules Engine
|
| 207 |
+
Schlechte Outcomes senken Harness-Confidence automatisch
|
| 208 |
+
|
| 209 |
+
5. SHARED SCHEMA
|
| 210 |
+
Ein Format für Task, Decision, Outcome, Insight
|
| 211 |
+
(vermutlich JSON/SQLite, nicht Markdown)
|
| 212 |
+
|
| 213 |
+
Meine Einschätzung
|
| 214 |
+
|
| 215 |
+
Du hast alle Schichten schon gebaut — aber jede als isoliertes Projekt. Das Bild ist da, die Teile sind da. Was fehlt ist nicht ein neues Projekt,
|
| 216 |
+
sondern Kleber:
|
| 217 |
+
|
| 218 |
+
- Ein Unified Router (KomandoZentral + Sidecar-NG merge)
|
| 219 |
+
- Ein Outcome Store (SQLite, ~3 Tabellen)
|
| 220 |
+
- Ein Feedback-Wire (Outcome → Routing Rules)
|
| 221 |
+
|
| 222 |
+
Das wäre das Minimum Viable Von Neumann System. Willst du das durchplanen?
|
| 223 |
+
|
| 224 |
+
✻ Churned for 58s
|
| 225 |
+
|
| 226 |
+
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
| 227 |
+
❯
|
| 228 |
+
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
| 229 |
+
21% [RESEARCHMODE] Sidecar: ok
|
| 230 |
+
|
README.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Spine V1
|
| 2 |
+
|
| 3 |
+
Spine ist die kanonische Integrationsschicht zwischen:
|
| 4 |
+
|
| 5 |
+
- `MetaMetaMeta` als Evidence- und Eval-Layer
|
| 6 |
+
- `KomandoZentral` als Decision-Layer
|
| 7 |
+
- `UEBER_AGENT` als Execution-Layer
|
| 8 |
+
- `AgentIDE` als Operator-UI
|
| 9 |
+
- `HarnessEcosystem` als Observatory- und Docs-Layer
|
| 10 |
+
|
| 11 |
+
Diese Implementierung ist absichtlich `spec-first`. Sie definiert:
|
| 12 |
+
|
| 13 |
+
- kanonische Kernobjekte
|
| 14 |
+
- versionierte JSON-Schemas
|
| 15 |
+
- eine maschinenlesbare Registry
|
| 16 |
+
- einen Beispiel-Run von Intent bis Eval
|
| 17 |
+
- ein lokales Validierungsskript
|
| 18 |
+
|
| 19 |
+
## Kernprinzip
|
| 20 |
+
|
| 21 |
+
Spine ersetzt keine der bestehenden Runtime- oder UI-Systeme. Spine erzwingt nur, dass alle Systeme dieselben Objekte, IDs und Zustandsuebergaenge sprechen.
|
| 22 |
+
|
| 23 |
+
Formel:
|
| 24 |
+
|
| 25 |
+
`Spine = Registry + Schemas + Run-State + Event-Log + Artifact-Index + Adapter-Vertraege`
|
| 26 |
+
|
| 27 |
+
## Repo-Struktur
|
| 28 |
+
|
| 29 |
+
- `docs/` Architektur- und Integrationsbeschreibung
|
| 30 |
+
- `schemas/` kanonische JSON-Schemas
|
| 31 |
+
- `registry/` Systemmanifest, Harness- und Adapter-Registry
|
| 32 |
+
- `examples/` durchgaengiger Beispiel-Run
|
| 33 |
+
- `scripts/validate_spine.py` lokale Konsistenzpruefung
|
| 34 |
+
|
| 35 |
+
## Wichtige Kernobjekte
|
| 36 |
+
|
| 37 |
+
- `TaskRequest`
|
| 38 |
+
- `RoutingDecision`
|
| 39 |
+
- `RunRecord`
|
| 40 |
+
- `ExecutionRequest`
|
| 41 |
+
- `ExecutionStatus`
|
| 42 |
+
- `RouteTrace`
|
| 43 |
+
- `ArtifactManifest`
|
| 44 |
+
- `EvalRecord`
|
| 45 |
+
- `SpineEvent`
|
| 46 |
+
- `SystemManifest`
|
| 47 |
+
|
| 48 |
+
## Lifecycle
|
| 49 |
+
|
| 50 |
+
1. `TaskRequest` wird erzeugt.
|
| 51 |
+
2. `KomandoZentral` liefert eine `RoutingDecision`.
|
| 52 |
+
3. Spine erzeugt oder aktualisiert den `RunRecord`.
|
| 53 |
+
4. Ein `ExecutionRequest` wird an die Runtime uebergeben.
|
| 54 |
+
5. Runtime meldet `ExecutionStatus`, `RouteTrace` und `ArtifactManifest`.
|
| 55 |
+
6. Evidence- und Observatory-Layer konsumieren `EvalRecord` und Event-Historie.
|
| 56 |
+
|
| 57 |
+
## Validierung
|
| 58 |
+
|
| 59 |
+
```bash
|
| 60 |
+
python3 /home/smlflg/Projekte/MultiHarnessStudio/scripts/validate_spine.py
|
| 61 |
+
```
|
| 62 |
+
|
| 63 |
+
Das Skript validiert:
|
| 64 |
+
|
| 65 |
+
- dass alle JSON-Dateien parsebar sind
|
| 66 |
+
- dass die Kernschemas vorhanden sind
|
| 67 |
+
- dass Registry-Eintraege eindeutig sind
|
| 68 |
+
- dass der Beispiel-Run intern konsistent ist
|
| 69 |
+
|
| 70 |
+
## V1 Defaults
|
| 71 |
+
|
| 72 |
+
- lokal-first
|
| 73 |
+
- JSON als Austauschformat
|
| 74 |
+
- append-only Event-Historie
|
| 75 |
+
- versionierte Schemas
|
| 76 |
+
- Registry als Source of Truth fuer Integrationsvertraege
|
| 77 |
+
- Adapter duerfen uebersetzen, aber keine Spine-Kernobjekte verbiegen
|
Spine_Idea/GPT_PLAN
ADDED
|
@@ -0,0 +1,518 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Spine ist die verbindende Systemschicht zwischen deinen bestehenden Ebenen:
|
| 2 |
+
|
| 3 |
+
- MetaMetaMeta liefert Erkenntnisse und Eval-Daten
|
| 4 |
+
- KomandoZentral trifft Entscheidungen
|
| 5 |
+
- UEBER_AGENT führt aus
|
| 6 |
+
- AgentIDE ist Operator-Oberfläche
|
| 7 |
+
- HarnessEcosystem visualisiert und dokumentiert
|
| 8 |
+
|
| 9 |
+
Spine selbst ist weder primär UI noch primär Runtime noch primär Wissensrepo. Es ist die kanonische Integrationsschicht mit gemeinsamer Sprache, gemeinsamen IDs,
|
| 10 |
+
gemeinsamen Verträgen und einem durchgehenden Event-/Artifact-Strom.
|
| 11 |
+
|
| 12 |
+
Das Ziel von Spine ist nicht, alles zu ersetzen, sondern Folgendes zu garantieren:
|
| 13 |
+
|
| 14 |
+
1. Alle Teilsysteme sprechen dieselben Kernobjekte.
|
| 15 |
+
2. Jede Entscheidung, Ausführung, Beobachtung und Bewertung ist als Run nachvollziehbar.
|
| 16 |
+
3. Handoffs zwischen Entscheidung, Runtime, UI und Eval sind maschinenlesbar statt implizit.
|
| 17 |
+
4. Das Gesamtsystem ist beobachtbar, rekonstruierbar und erweiterbar.
|
| 18 |
+
|
| 19 |
+
## Kernfähigkeiten von Spine
|
| 20 |
+
|
| 21 |
+
Spine muss zwingend können:
|
| 22 |
+
|
| 23 |
+
- Kanonische Objekte definieren: Task, Decision, ExecutionRequest, Run, Event, Artifact, EvalResult, Capability, Agent, Harness, Workspace.
|
| 24 |
+
- Globale IDs vergeben und referenzierbar machen:
|
| 25 |
+
task_id, decision_id, run_id, execution_id, artifact_id, eval_id.
|
| 26 |
+
- Zustandsübergänge verwalten:
|
| 27 |
+
draft -> decided -> dispatched -> running -> completed|failed|aborted -> evaluated.
|
| 28 |
+
- Events unverlierbar protokollieren.
|
| 29 |
+
- Artifacts versioniert registrieren.
|
| 30 |
+
- Zwischen Systemen übersetzen, aber nicht inhaltlich “raten”.
|
| 31 |
+
- Provenienz sichern:
|
| 32 |
+
Jede Entscheidung und jedes Ergebnis muss auf Quelle, Version, Zeit und Ursprungssystem rückführbar sein.
|
| 33 |
+
- Capability-Discovery anbieten:
|
| 34 |
+
Welche Harnesses, Agenten und Ausführungsziele existieren, in welchem Zustand, mit welchen Verträgen?
|
| 35 |
+
- Routing und Execution entkoppeln:
|
| 36 |
+
KomandoZentral entscheidet, UEBER_AGENT führt aus, Spine verbindet beides.
|
| 37 |
+
- Eval-Loop schließen:
|
| 38 |
+
Runtime- und Outcome-Daten müssen zurück in MetaMetaMeta und HarnessEcosystem fließen.
|
| 39 |
+
|
| 40 |
+
Spine darf in V1 bewusst nicht sein:
|
| 41 |
+
|
| 42 |
+
- kein LLM-Orchestrator
|
| 43 |
+
- kein Ersatz für OpenClaw
|
| 44 |
+
- kein eigener IDE-Editor
|
| 45 |
+
- kein Wissensfrontend
|
| 46 |
+
- kein autonomer Planer
|
| 47 |
+
- kein “smartes Superhirn”, das implizit fehlende Daten ergänzt
|
| 48 |
+
|
| 49 |
+
## Technische Rolle im System
|
| 50 |
+
|
| 51 |
+
Spine ist logisch in 5 Subsysteme gegliedert:
|
| 52 |
+
|
| 53 |
+
### 1. Registry Layer
|
| 54 |
+
|
| 55 |
+
Hält den kanonischen Bestand an Systemobjekten.
|
| 56 |
+
|
| 57 |
+
Enthält:
|
| 58 |
+
|
| 59 |
+
- Harness-Registry
|
| 60 |
+
- Agent-Registry
|
| 61 |
+
- Capability-Registry
|
| 62 |
+
- Workspace-Registry
|
| 63 |
+
- Runtime-Targets
|
| 64 |
+
- Schema-Versionen
|
| 65 |
+
|
| 66 |
+
Pflichtfragen, die dieser Layer beantworten muss:
|
| 67 |
+
|
| 68 |
+
- Welche Harnesses existieren?
|
| 69 |
+
- Welche Agenten existieren?
|
| 70 |
+
- Welche Inputs akzeptieren sie?
|
| 71 |
+
- Welche Outputs liefern sie?
|
| 72 |
+
- Welche Runtime ist aktiv, blockiert, deprecated oder experimental?
|
| 73 |
+
|
| 74 |
+
### 2. Contract Layer
|
| 75 |
+
|
| 76 |
+
Definiert die formalen Schemas.
|
| 77 |
+
|
| 78 |
+
Pflichtschemas:
|
| 79 |
+
|
| 80 |
+
- TaskRequest
|
| 81 |
+
- RoutingDecision
|
| 82 |
+
- ExecutionRequest
|
| 83 |
+
- ExecutionStatus
|
| 84 |
+
- RouteTrace
|
| 85 |
+
- ArtifactManifest
|
| 86 |
+
- EvalRecord
|
| 87 |
+
- OperatorContext
|
| 88 |
+
- SystemManifest
|
| 89 |
+
|
| 90 |
+
Dieser Layer ist der eigentliche Kern von Spine.
|
| 91 |
+
|
| 92 |
+
### 3. Event Layer
|
| 93 |
+
|
| 94 |
+
Ein append-only Eventstrom.
|
| 95 |
+
|
| 96 |
+
Pflichtevents:
|
| 97 |
+
|
| 98 |
+
- task.created
|
| 99 |
+
- decision.created
|
| 100 |
+
- decision.approved
|
| 101 |
+
- execution.requested
|
| 102 |
+
- execution.dispatched
|
| 103 |
+
- execution.started
|
| 104 |
+
- execution.progress
|
| 105 |
+
- execution.completed
|
| 106 |
+
- execution.failed
|
| 107 |
+
- artifact.created
|
| 108 |
+
- eval.recorded
|
| 109 |
+
- run.closed
|
| 110 |
+
|
| 111 |
+
Jedes Event braucht:
|
| 112 |
+
|
| 113 |
+
- globale ID
|
| 114 |
+
- Typ
|
| 115 |
+
- Zeitstempel
|
| 116 |
+
- run_id
|
| 117 |
+
- source_system
|
| 118 |
+
- schema_version
|
| 119 |
+
- Payload
|
| 120 |
+
- Referenzen auf verursachende Objekte
|
| 121 |
+
|
| 122 |
+
### 4. Artifact Layer
|
| 123 |
+
|
| 124 |
+
Verwaltet alle erzeugten Outputs.
|
| 125 |
+
|
| 126 |
+
Artifact-Typen:
|
| 127 |
+
|
| 128 |
+
- decision yaml/json
|
| 129 |
+
- prompt/tasksheet
|
| 130 |
+
- trace
|
| 131 |
+
- runtime log
|
| 132 |
+
- deploy result
|
| 133 |
+
- evaluation result
|
| 134 |
+
- report/dashboard snapshot
|
| 135 |
+
- patch/commit reference
|
| 136 |
+
- derived summary
|
| 137 |
+
|
| 138 |
+
Pflichtfelder:
|
| 139 |
+
|
| 140 |
+
- artifact_id
|
| 141 |
+
- artifact_type
|
| 142 |
+
- uri
|
| 143 |
+
- produced_by
|
| 144 |
+
- run_id
|
| 145 |
+
- content_hash
|
| 146 |
+
- created_at
|
| 147 |
+
- schema_version
|
| 148 |
+
|
| 149 |
+
### 5. Adapter Layer
|
| 150 |
+
|
| 151 |
+
Adapter zu den bestehenden Projekten.
|
| 152 |
+
|
| 153 |
+
Pflichtadapter:
|
| 154 |
+
|
| 155 |
+
- metametameta_adapter
|
| 156 |
+
- komandozentral_adapter
|
| 157 |
+
- ueber_agent_adapter
|
| 158 |
+
- agentide_adapter
|
| 159 |
+
- harnessecosystem_adapter
|
| 160 |
+
|
| 161 |
+
Adapter-Regel:
|
| 162 |
+
Adapter dürfen lokale Formate ins Spine-Format übersetzen, aber nicht die Spine-Kernmodelle verändern.
|
| 163 |
+
|
| 164 |
+
## Spine Input
|
| 165 |
+
|
| 166 |
+
Spine braucht nur wenige kanonische Input-Klassen.
|
| 167 |
+
|
| 168 |
+
### A. Intent Input
|
| 169 |
+
|
| 170 |
+
Kommt von User, UI oder externem System.
|
| 171 |
+
|
| 172 |
+
Beispiel:
|
| 173 |
+
|
| 174 |
+
- Taskbeschreibung
|
| 175 |
+
- Zielsystem / gewünschtes Ergebnis
|
| 176 |
+
- Priorität
|
| 177 |
+
- Constraints
|
| 178 |
+
- Operator-Kontext
|
| 179 |
+
|
| 180 |
+
Form:
|
| 181 |
+
TaskRequest
|
| 182 |
+
|
| 183 |
+
Pflichtfelder:
|
| 184 |
+
|
| 185 |
+
- task_id
|
| 186 |
+
- title
|
| 187 |
+
- description
|
| 188 |
+
- requested_by
|
| 189 |
+
- created_at
|
| 190 |
+
- origin_system
|
| 191 |
+
- operator_context
|
| 192 |
+
- constraints
|
| 193 |
+
- desired_outcomes
|
| 194 |
+
|
| 195 |
+
### B. Decision Input
|
| 196 |
+
|
| 197 |
+
Kommt typischerweise aus KomandoZentral.
|
| 198 |
+
|
| 199 |
+
Form:
|
| 200 |
+
RoutingDecision
|
| 201 |
+
|
| 202 |
+
Pflichtfelder:
|
| 203 |
+
|
| 204 |
+
- decision_id
|
| 205 |
+
- task_id
|
| 206 |
+
- recommended_harness
|
| 207 |
+
- recommended_runtime_target
|
| 208 |
+
- confidence
|
| 209 |
+
- reasoning_summary
|
| 210 |
+
- risks
|
| 211 |
+
- fallback
|
| 212 |
+
- decision_policy_version
|
| 213 |
+
|
| 214 |
+
### C. Execution Input
|
| 215 |
+
|
| 216 |
+
Kommt aus Entscheidung plus Runtime-Handoff.
|
| 217 |
+
|
| 218 |
+
Form:
|
| 219 |
+
ExecutionRequest
|
| 220 |
+
|
| 221 |
+
Pflichtfelder:
|
| 222 |
+
|
| 223 |
+
- execution_id
|
| 224 |
+
- decision_id
|
| 225 |
+
- run_id
|
| 226 |
+
- target_runtime
|
| 227 |
+
- target_agent
|
| 228 |
+
- input_artifacts
|
| 229 |
+
- execution_mode
|
| 230 |
+
- workspace_ref
|
| 231 |
+
- timeout_policy
|
| 232 |
+
- approval_requirements
|
| 233 |
+
|
| 234 |
+
### D. Observation Input
|
| 235 |
+
|
| 236 |
+
Kommt aus Runtime, UI oder Logs.
|
| 237 |
+
|
| 238 |
+
Formen:
|
| 239 |
+
|
| 240 |
+
- ExecutionStatus
|
| 241 |
+
- RouteTrace
|
| 242 |
+
- ArtifactManifest
|
| 243 |
+
- EvalRecord
|
| 244 |
+
|
| 245 |
+
## Spine Output
|
| 246 |
+
|
| 247 |
+
Spine muss 4 Output-Klassen bereitstellen.
|
| 248 |
+
|
| 249 |
+
### 1. Dispatchable Execution Contract
|
| 250 |
+
|
| 251 |
+
Für UEBER_AGENT oder andere Runtime.
|
| 252 |
+
|
| 253 |
+
Output:
|
| 254 |
+
|
| 255 |
+
- normalisierter ExecutionRequest
|
| 256 |
+
- referenzierte Inputs
|
| 257 |
+
- freigegebene Runtime-Parameter
|
| 258 |
+
- erwartete Rückgabeschemata
|
| 259 |
+
|
| 260 |
+
### 2. Observable Run State
|
| 261 |
+
|
| 262 |
+
Für AgentIDE und Monitoring.
|
| 263 |
+
|
| 264 |
+
Output:
|
| 265 |
+
|
| 266 |
+
- aktueller Status eines Runs
|
| 267 |
+
- Event-Feed
|
| 268 |
+
- Artefakte
|
| 269 |
+
- Fehlerzustände
|
| 270 |
+
- nächste erlaubte Transitionen
|
| 271 |
+
|
| 272 |
+
### 3. Knowledge Feed
|
| 273 |
+
|
| 274 |
+
Für MetaMetaMeta und HarnessEcosystem.
|
| 275 |
+
|
| 276 |
+
Output:
|
| 277 |
+
|
| 278 |
+
- eval-fähige Run-Historie
|
| 279 |
+
- aggregierte Outcome-Daten
|
| 280 |
+
- strukturierte Trace-Daten
|
| 281 |
+
- Registry-Snapshots
|
| 282 |
+
- Dashboard-Feeds
|
| 283 |
+
|
| 284 |
+
### 4. Audit Trail
|
| 285 |
+
|
| 286 |
+
Für Debugging und Vertrauensbildung.
|
| 287 |
+
|
| 288 |
+
Output:
|
| 289 |
+
|
| 290 |
+
- vollständige Rekonstruktion eines Runs
|
| 291 |
+
- welche Entscheidung zu welcher Ausführung führte
|
| 292 |
+
- welche Quellen benutzt wurden
|
| 293 |
+
- welche Artefakte entstanden
|
| 294 |
+
- welches Eval daraus resultierte
|
| 295 |
+
|
| 296 |
+
## Was passiert dazwischen
|
| 297 |
+
|
| 298 |
+
Der zentrale Spine-Flow ist:
|
| 299 |
+
|
| 300 |
+
1. Ein TaskRequest wird erzeugt.
|
| 301 |
+
2. KomandoZentral erzeugt daraus eine RoutingDecision.
|
| 302 |
+
3. Spine validiert diese gegen Registry und Schema.
|
| 303 |
+
4. Spine erzeugt einen Run und daraus ein ExecutionRequest.
|
| 304 |
+
5. UEBER_AGENT oder anderes Runtime-Ziel übernimmt die Ausführung.
|
| 305 |
+
6. Während der Ausführung sendet die Runtime Status, Trace und Artifact-Referenzen zurück.
|
| 306 |
+
7. Spine schreibt alles in Event- und Artifact-Layer.
|
| 307 |
+
8. AgentIDE liest den Live-Zustand.
|
| 308 |
+
9. MetaMetaMeta liest die vollständige Historie als Evidence.
|
| 309 |
+
10. HarnessEcosystem liest verdichtete Registry-/Outcome-/Guide-Daten als Präsentationsfeed.
|
| 310 |
+
|
| 311 |
+
Wichtig:
|
| 312 |
+
Spine ist dabei nicht der “Denkende”, sondern der “Verbindliche”.
|
| 313 |
+
|
| 314 |
+
## Pflicht-Spezifikationen
|
| 315 |
+
|
| 316 |
+
### 1. ID- und Referenzmodell
|
| 317 |
+
|
| 318 |
+
Alle Hauptobjekte brauchen globale, stabile IDs.
|
| 319 |
+
|
| 320 |
+
Minimal:
|
| 321 |
+
|
| 322 |
+
- task_id
|
| 323 |
+
- run_id
|
| 324 |
+
- decision_id
|
| 325 |
+
- execution_id
|
| 326 |
+
- artifact_id
|
| 327 |
+
- eval_id
|
| 328 |
+
|
| 329 |
+
Regel:
|
| 330 |
+
Jedes Objekt referenziert nur über IDs, nie nur über freie Dateipfade oder implizite Dateinamen.
|
| 331 |
+
|
| 332 |
+
### 2. Zustandsmodell
|
| 333 |
+
|
| 334 |
+
Run braucht eine endliche, harte State-Machine.
|
| 335 |
+
|
| 336 |
+
Minimal:
|
| 337 |
+
|
| 338 |
+
- created
|
| 339 |
+
- decided
|
| 340 |
+
- ready_for_dispatch
|
| 341 |
+
- dispatched
|
| 342 |
+
- running
|
| 343 |
+
- waiting_for_input
|
| 344 |
+
- completed
|
| 345 |
+
- failed
|
| 346 |
+
- aborted
|
| 347 |
+
- evaluated
|
| 348 |
+
|
| 349 |
+
Regel:
|
| 350 |
+
Kein System darf Zustände frei erfinden.
|
| 351 |
+
|
| 352 |
+
### 3. Schema-Versionierung
|
| 353 |
+
|
| 354 |
+
Jedes Spine-Objekt braucht:
|
| 355 |
+
|
| 356 |
+
- schema_name
|
| 357 |
+
- schema_version
|
| 358 |
+
|
| 359 |
+
Regel:
|
| 360 |
+
Adapters dürfen alte lokale Formate einlesen, aber Spine intern nur versionierte kanonische Formen führen.
|
| 361 |
+
|
| 362 |
+
### 4. Provenienz
|
| 363 |
+
|
| 364 |
+
Jedes Objekt braucht:
|
| 365 |
+
|
| 366 |
+
- source_system
|
| 367 |
+
- source_ref
|
| 368 |
+
- created_at
|
| 369 |
+
- created_by
|
| 370 |
+
- optional derived_from
|
| 371 |
+
|
| 372 |
+
### 5. Capability-Spezifikation
|
| 373 |
+
|
| 374 |
+
Jeder Harness/Agent braucht maschinenlesbar:
|
| 375 |
+
|
| 376 |
+
- id
|
| 377 |
+
- kind
|
| 378 |
+
- status
|
| 379 |
+
- accepts
|
| 380 |
+
- emits
|
| 381 |
+
- constraints
|
| 382 |
+
- runtime_target
|
| 383 |
+
- cost_class
|
| 384 |
+
- trust_level
|
| 385 |
+
|
| 386 |
+
Das ist die Voraussetzung, damit KomandoZentral nicht nur theoretisch routet, sondern gegen reale Ziele.
|
| 387 |
+
|
| 388 |
+
### 6. Artifact-Spezifikation
|
| 389 |
+
|
| 390 |
+
Artifacts müssen inhaltlich typisiert sein.
|
| 391 |
+
|
| 392 |
+
Minimaltypen:
|
| 393 |
+
|
| 394 |
+
- decision
|
| 395 |
+
- execution_input
|
| 396 |
+
- trace
|
| 397 |
+
- log
|
| 398 |
+
- report
|
| 399 |
+
- tasksheet
|
| 400 |
+
- eval
|
| 401 |
+
- workspace_snapshot
|
| 402 |
+
- patch_ref
|
| 403 |
+
- deploy_result
|
| 404 |
+
|
| 405 |
+
### 7. Fehler- und Abbruchmodell
|
| 406 |
+
|
| 407 |
+
Spine muss Failure first-class behandeln.
|
| 408 |
+
|
| 409 |
+
Fehlertypen:
|
| 410 |
+
|
| 411 |
+
- validation_error
|
| 412 |
+
- dispatch_error
|
| 413 |
+
- runtime_error
|
| 414 |
+
- timeout
|
| 415 |
+
- contract_mismatch
|
| 416 |
+
- missing_capability
|
| 417 |
+
- approval_blocked
|
| 418 |
+
- unknown_failure
|
| 419 |
+
|
| 420 |
+
### 8. Read/Write-Verantwortung
|
| 421 |
+
|
| 422 |
+
Klare Ownership:
|
| 423 |
+
|
| 424 |
+
- KomandoZentral darf RoutingDecision schreiben
|
| 425 |
+
- UEBER_AGENT darf ExecutionStatus, RouteTrace, ArtifactManifest schreiben
|
| 426 |
+
- MetaMetaMeta darf EvalRecord und Derived Insights schreiben
|
| 427 |
+
- HarnessEcosystem liest primär
|
| 428 |
+
- AgentIDE liest primär und darf TaskRequest erzeugen
|
| 429 |
+
|
| 430 |
+
## Minimale öffentliche Interfaces
|
| 431 |
+
|
| 432 |
+
### System Registry API
|
| 433 |
+
|
| 434 |
+
Reads:
|
| 435 |
+
|
| 436 |
+
- list_harnesses()
|
| 437 |
+
- list_agents()
|
| 438 |
+
- get_capability(id)
|
| 439 |
+
- get_runtime_targets()
|
| 440 |
+
- get_schema_versions()
|
| 441 |
+
|
| 442 |
+
### Run API
|
| 443 |
+
|
| 444 |
+
Reads/Writes:
|
| 445 |
+
|
| 446 |
+
- create_task(task_request)
|
| 447 |
+
- attach_decision(routing_decision)
|
| 448 |
+
- create_execution(execution_request)
|
| 449 |
+
- append_event(event)
|
| 450 |
+
- register_artifact(artifact_manifest)
|
| 451 |
+
- close_run(run_id)
|
| 452 |
+
|
| 453 |
+
### Query API
|
| 454 |
+
|
| 455 |
+
Reads:
|
| 456 |
+
|
| 457 |
+
- get_run(run_id)
|
| 458 |
+
- get_run_events(run_id)
|
| 459 |
+
- get_run_artifacts(run_id)
|
| 460 |
+
- get_decision(decision_id)
|
| 461 |
+
- get_task(task_id)
|
| 462 |
+
- get_eval_records(run_id)
|
| 463 |
+
- query_runs(filters)
|
| 464 |
+
|
| 465 |
+
### Feed API
|
| 466 |
+
|
| 467 |
+
Reads:
|
| 468 |
+
|
| 469 |
+
- get_ecosystem_snapshot()
|
| 470 |
+
- get_runtime_health()
|
| 471 |
+
- get_eval_summary()
|
| 472 |
+
- get_registry_snapshot()
|
| 473 |
+
|
| 474 |
+
## V1 Defaults
|
| 475 |
+
|
| 476 |
+
Für die erste Spezifikation sollten folgende Defaults gesetzt werden:
|
| 477 |
+
|
| 478 |
+
- Spine ist zunächst lokal-first.
|
| 479 |
+
- Spine ist source-of-truth für Verträge, nicht zwingend für alle Rohdaten.
|
| 480 |
+
- Persistenzmodell zunächst event-log + registry + artifact-index, nicht sofort komplexe relationale Vollplattform.
|
| 481 |
+
- JSON oder YAML als kanonische Austauschform; intern darf eine DB später folgen.
|
| 482 |
+
- Append-only Events sind Pflicht.
|
| 483 |
+
- Registry und Schemas sind versioniert.
|
| 484 |
+
- Runtime bleibt außerhalb von Spine.
|
| 485 |
+
- UI bleibt außerhalb von Spine.
|
| 486 |
+
- Eval-Interpretation bleibt außerhalb von Spine.
|
| 487 |
+
- Spine macht Validierung, Referenzierung und Rekonstruktion.
|
| 488 |
+
|
| 489 |
+
## Test- und Evaluationskriterien
|
| 490 |
+
|
| 491 |
+
Ein Spine-Design ist nur dann gut, wenn folgende Szenarien vollständig möglich sind:
|
| 492 |
+
|
| 493 |
+
1. Ein Task wird erzeugt, geroutet, ausgeführt und evaluiert, und jede Station ist rekonstruierbar.
|
| 494 |
+
2. KomandoZentral kann eine Entscheidung ausgeben, ohne die Runtime zu kennen, aber Spine kann trotzdem validieren, ob das Ziel existiert.
|
| 495 |
+
3. UEBER_AGENT kann Laufstatus und Trace zurückmelden, ohne UI-spezifische Semantik zu brauchen.
|
| 496 |
+
4. AgentIDE kann einen kompletten Run live darstellen, nur aus Spine-Zustand und Events.
|
| 497 |
+
5. HarnessEcosystem kann aus Spine einen statischen Snapshot oder Feed bauen, ohne Handpflege.
|
| 498 |
+
6. MetaMetaMeta kann aus Spine vollständige Eval-Datensätze ziehen, ohne Ad-hoc-Pfadwissen.
|
| 499 |
+
7. Ein fehlgeschlagener Run ist genauso sauber modelliert wie ein erfolgreicher.
|
| 500 |
+
8. Neue Harnesses oder neue Agenttypen lassen sich über Registry + Capability ergänzen, ohne Kernobjekte neu zu erfinden.
|
| 501 |
+
|
| 502 |
+
## Explizite Annahmen
|
| 503 |
+
|
| 504 |
+
- Spine ist eine Integrationsspezifikation und Integrationsschicht, kein neues monolithisches “Superprojekt”.
|
| 505 |
+
- KomandoZentral bleibt Decision Engine.
|
| 506 |
+
- UEBER_AGENT bleibt Execution Engine.
|
| 507 |
+
- MetaMetaMeta bleibt Evidence Layer.
|
| 508 |
+
- AgentIDE bleibt Operator Frontend.
|
| 509 |
+
- HarnessEcosystem bleibt Präsentations- und Lernlayer.
|
| 510 |
+
- Der wichtigste technische Engpass ist nicht fehlende Intelligenz, sondern fehlender gemeinsamer Vertrag.
|
| 511 |
+
|
| 512 |
+
## Kurzformel
|
| 513 |
+
|
| 514 |
+
Die theoretische Essenz von Spine ist:
|
| 515 |
+
|
| 516 |
+
Spine = Registry + Schemas + Run-State + Event-Log + Artifact-Index + Adapter-Verträge
|
| 517 |
+
|
| 518 |
+
Wenn das sauber spezifiziert ist, werden deine Projekte nicht mehr nur “verbunden gedacht”, sondern wirklich als ein konsistentes System betreibbar.
|
Spine_Idea/spine-konzept.html
ADDED
|
@@ -0,0 +1,1310 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="de">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Spine — Die kanonische Integrationsschicht</title>
|
| 7 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 8 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 9 |
+
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif&family=JetBrains+Mono:wght@400;500;600;700&family=DM+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
|
| 10 |
+
<style>
|
| 11 |
+
:root {
|
| 12 |
+
--font-display: 'Instrument Serif', Georgia, serif;
|
| 13 |
+
--font-body: 'DM Sans', system-ui, sans-serif;
|
| 14 |
+
--font-mono: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
|
| 15 |
+
|
| 16 |
+
--bg: #f6f3ef;
|
| 17 |
+
--surface: #ffffff;
|
| 18 |
+
--surface2: #eee9e2;
|
| 19 |
+
--surface-elevated: #fffcf8;
|
| 20 |
+
--border: rgba(0,0,0,0.07);
|
| 21 |
+
--border-bright: rgba(0,0,0,0.14);
|
| 22 |
+
--text: #1e1e1e;
|
| 23 |
+
--text-dim: #7a7062;
|
| 24 |
+
|
| 25 |
+
--navy: #1e3a5f;
|
| 26 |
+
--navy-dim: rgba(30,58,95,0.08);
|
| 27 |
+
--gold: #b8860b;
|
| 28 |
+
--gold-dim: rgba(184,134,11,0.08);
|
| 29 |
+
--teal: #0f766e;
|
| 30 |
+
--teal-dim: rgba(15,118,110,0.08);
|
| 31 |
+
--sage: #4d7c0f;
|
| 32 |
+
--sage-dim: rgba(77,124,15,0.08);
|
| 33 |
+
--rose: #9f1239;
|
| 34 |
+
--rose-dim: rgba(159,18,57,0.08);
|
| 35 |
+
--amber: #92400e;
|
| 36 |
+
--amber-dim: rgba(146,64,14,0.08);
|
| 37 |
+
--plum: #6b21a8;
|
| 38 |
+
--plum-dim: rgba(107,33,168,0.08);
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
@media (prefers-color-scheme: dark) {
|
| 42 |
+
:root {
|
| 43 |
+
--bg: #111318;
|
| 44 |
+
--surface: #1a1d24;
|
| 45 |
+
--surface2: #22262e;
|
| 46 |
+
--surface-elevated: #252a33;
|
| 47 |
+
--border: rgba(255,255,255,0.06);
|
| 48 |
+
--border-bright: rgba(255,255,255,0.12);
|
| 49 |
+
--text: #e8e4df;
|
| 50 |
+
--text-dim: #8a8377;
|
| 51 |
+
|
| 52 |
+
--navy: #7cb3e0;
|
| 53 |
+
--navy-dim: rgba(124,179,224,0.1);
|
| 54 |
+
--gold: #d4a73a;
|
| 55 |
+
--gold-dim: rgba(212,167,58,0.1);
|
| 56 |
+
--teal: #5eead4;
|
| 57 |
+
--teal-dim: rgba(94,234,212,0.08);
|
| 58 |
+
--rose: #fda4af;
|
| 59 |
+
--rose-dim: rgba(253,164,175,0.08);
|
| 60 |
+
--sage: #a3e635;
|
| 61 |
+
--sage-dim: rgba(163,230,53,0.08);
|
| 62 |
+
--amber: #fbbf24;
|
| 63 |
+
--amber-dim: rgba(251,191,36,0.08);
|
| 64 |
+
--plum: #c084fc;
|
| 65 |
+
--plum-dim: rgba(192,132,252,0.08);
|
| 66 |
+
}
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
| 70 |
+
|
| 71 |
+
body {
|
| 72 |
+
background: var(--bg);
|
| 73 |
+
background-image:
|
| 74 |
+
radial-gradient(ellipse at 15% 0%, var(--navy-dim) 0%, transparent 50%),
|
| 75 |
+
radial-gradient(ellipse at 85% 100%, var(--gold-dim) 0%, transparent 40%);
|
| 76 |
+
color: var(--text);
|
| 77 |
+
font-family: var(--font-body);
|
| 78 |
+
padding: 24px;
|
| 79 |
+
min-height: 100vh;
|
| 80 |
+
line-height: 1.6;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
@keyframes fadeUp {
|
| 84 |
+
from { opacity: 0; transform: translateY(14px); }
|
| 85 |
+
to { opacity: 1; transform: translateY(0); }
|
| 86 |
+
}
|
| 87 |
+
@keyframes fadeScale {
|
| 88 |
+
from { opacity: 0; transform: scale(0.92); }
|
| 89 |
+
to { opacity: 1; transform: scale(1); }
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
.anim { animation: fadeUp 0.45s ease-out both; animation-delay: calc(var(--i,0) * 0.07s); }
|
| 93 |
+
.anim-scale { animation: fadeScale 0.4s ease-out both; animation-delay: calc(var(--i,0) * 0.07s); }
|
| 94 |
+
|
| 95 |
+
@media (prefers-reduced-motion: reduce) {
|
| 96 |
+
*, *::before, *::after {
|
| 97 |
+
animation-duration: 0.01ms !important;
|
| 98 |
+
animation-delay: 0ms !important;
|
| 99 |
+
}
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
/* ===== LAYOUT ===== */
|
| 103 |
+
.wrap {
|
| 104 |
+
max-width: 1400px;
|
| 105 |
+
margin: 0 auto;
|
| 106 |
+
display: grid;
|
| 107 |
+
grid-template-columns: 200px 1fr;
|
| 108 |
+
gap: 0 48px;
|
| 109 |
+
}
|
| 110 |
+
.main { min-width: 0; }
|
| 111 |
+
|
| 112 |
+
/* ===== TOC ===== */
|
| 113 |
+
.toc {
|
| 114 |
+
position: sticky;
|
| 115 |
+
top: 24px;
|
| 116 |
+
align-self: start;
|
| 117 |
+
padding: 14px 0;
|
| 118 |
+
grid-row: 1 / -1;
|
| 119 |
+
max-height: calc(100dvh - 48px);
|
| 120 |
+
overflow-y: auto;
|
| 121 |
+
}
|
| 122 |
+
.toc::-webkit-scrollbar { width: 3px; }
|
| 123 |
+
.toc::-webkit-scrollbar-thumb { background: var(--surface-elevated); border-radius: 2px; }
|
| 124 |
+
.toc-title {
|
| 125 |
+
font-family: var(--font-mono);
|
| 126 |
+
font-size: 9px;
|
| 127 |
+
font-weight: 700;
|
| 128 |
+
text-transform: uppercase;
|
| 129 |
+
letter-spacing: 2px;
|
| 130 |
+
color: var(--text-dim);
|
| 131 |
+
padding: 0 0 10px;
|
| 132 |
+
margin-bottom: 8px;
|
| 133 |
+
border-bottom: 1px solid var(--border);
|
| 134 |
+
}
|
| 135 |
+
.toc a {
|
| 136 |
+
display: block;
|
| 137 |
+
font-size: 11px;
|
| 138 |
+
color: var(--text-dim);
|
| 139 |
+
text-decoration: none;
|
| 140 |
+
padding: 4px 8px;
|
| 141 |
+
border-radius: 5px;
|
| 142 |
+
border-left: 2px solid transparent;
|
| 143 |
+
transition: all 0.15s;
|
| 144 |
+
line-height: 1.4;
|
| 145 |
+
margin-bottom: 1px;
|
| 146 |
+
}
|
| 147 |
+
.toc a:hover { color: var(--text); background: var(--surface2); }
|
| 148 |
+
.toc a.active { color: var(--text); border-left-color: var(--gold); }
|
| 149 |
+
|
| 150 |
+
@media (max-width: 1100px) {
|
| 151 |
+
.wrap { grid-template-columns: 1fr; padding-top: 0; }
|
| 152 |
+
body { padding: 20px; padding-top: 0; }
|
| 153 |
+
.toc {
|
| 154 |
+
position: sticky; top: 0; z-index: 200;
|
| 155 |
+
max-height: none; display: flex; gap: 4px; align-items: center;
|
| 156 |
+
overflow-x: auto; -webkit-overflow-scrolling: touch;
|
| 157 |
+
background: var(--bg); border-bottom: 1px solid var(--border);
|
| 158 |
+
padding: 10px 0; margin: 0 -20px; padding-left: 20px; padding-right: 20px;
|
| 159 |
+
grid-row: auto;
|
| 160 |
+
}
|
| 161 |
+
.toc::-webkit-scrollbar { display: none; }
|
| 162 |
+
.toc-title { display: none; }
|
| 163 |
+
.toc a {
|
| 164 |
+
white-space: nowrap; flex-shrink: 0; border-left: none;
|
| 165 |
+
border-bottom: 2px solid transparent; border-radius: 4px 4px 0 0;
|
| 166 |
+
padding: 6px 10px; font-size: 10px;
|
| 167 |
+
}
|
| 168 |
+
.toc a.active { border-left: none; border-bottom-color: var(--gold); background: var(--surface); }
|
| 169 |
+
.main { padding-top: 20px; }
|
| 170 |
+
.sec-head { scroll-margin-top: 52px; }
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
/* ===== TYPOGRAPHY ===== */
|
| 174 |
+
h1 {
|
| 175 |
+
font-family: var(--font-display);
|
| 176 |
+
font-size: 52px;
|
| 177 |
+
font-weight: 400;
|
| 178 |
+
letter-spacing: -0.5px;
|
| 179 |
+
margin-bottom: 8px;
|
| 180 |
+
color: var(--navy);
|
| 181 |
+
text-wrap: balance;
|
| 182 |
+
}
|
| 183 |
+
.subtitle {
|
| 184 |
+
color: var(--text-dim);
|
| 185 |
+
font-size: 14px;
|
| 186 |
+
margin-bottom: 16px;
|
| 187 |
+
font-family: var(--font-mono);
|
| 188 |
+
font-weight: 400;
|
| 189 |
+
}
|
| 190 |
+
.lead {
|
| 191 |
+
font-size: 14px;
|
| 192 |
+
line-height: 1.6;
|
| 193 |
+
color: var(--text-dim);
|
| 194 |
+
margin-bottom: 8px;
|
| 195 |
+
max-width: 760px;
|
| 196 |
+
}
|
| 197 |
+
.sec-head {
|
| 198 |
+
font-family: var(--font-display);
|
| 199 |
+
font-size: 28px;
|
| 200 |
+
font-weight: 400;
|
| 201 |
+
margin-top: 32px;
|
| 202 |
+
margin-bottom: 20px;
|
| 203 |
+
padding-bottom: 10px;
|
| 204 |
+
border-bottom: 2px solid var(--border);
|
| 205 |
+
display: flex;
|
| 206 |
+
align-items: baseline;
|
| 207 |
+
gap: 10px;
|
| 208 |
+
}
|
| 209 |
+
.assume-list {
|
| 210 |
+
list-style: none;
|
| 211 |
+
font-size: 13px;
|
| 212 |
+
line-height: 1.6;
|
| 213 |
+
}
|
| 214 |
+
.assume-list li {
|
| 215 |
+
padding: 10px 16px;
|
| 216 |
+
background: var(--surface);
|
| 217 |
+
border: 1px solid var(--border);
|
| 218 |
+
border-radius: 8px;
|
| 219 |
+
margin-bottom: 8px;
|
| 220 |
+
display: flex;
|
| 221 |
+
gap: 12px;
|
| 222 |
+
align-items: baseline;
|
| 223 |
+
}
|
| 224 |
+
.assume-list li::before {
|
| 225 |
+
content: '\2014';
|
| 226 |
+
font-family: var(--font-mono);
|
| 227 |
+
color: var(--gold);
|
| 228 |
+
font-weight: 700;
|
| 229 |
+
flex-shrink: 0;
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
/* ===== THEORIE LIST ===== */
|
| 233 |
+
.theorie-list {
|
| 234 |
+
list-style: none;
|
| 235 |
+
font-size: 13px;
|
| 236 |
+
line-height: 1.7;
|
| 237 |
+
}
|
| 238 |
+
.theorie-list li {
|
| 239 |
+
padding-left: 18px;
|
| 240 |
+
position: relative;
|
| 241 |
+
margin-bottom: 4px;
|
| 242 |
+
}
|
| 243 |
+
.theorie-list li::before {
|
| 244 |
+
content: '\2192';
|
| 245 |
+
position: absolute;
|
| 246 |
+
left: 0;
|
| 247 |
+
color: var(--text-dim);
|
| 248 |
+
font-family: var(--font-mono);
|
| 249 |
+
font-size: 12px;
|
| 250 |
+
}
|
| 251 |
+
|
| 252 |
+
/* ===== FLOW STEPS ===== */
|
| 253 |
+
.flow-steps {
|
| 254 |
+
display: flex;
|
| 255 |
+
flex-direction: column;
|
| 256 |
+
gap: 8px;
|
| 257 |
+
}
|
| 258 |
+
.flow-step {
|
| 259 |
+
display: flex;
|
| 260 |
+
align-items: flex-start;
|
| 261 |
+
gap: 14px;
|
| 262 |
+
padding: 8px 12px;
|
| 263 |
+
background: var(--surface);
|
| 264 |
+
border: 1px solid var(--border);
|
| 265 |
+
border-radius: 8px;
|
| 266 |
+
}
|
| 267 |
+
.flow-num {
|
| 268 |
+
font-family: var(--font-mono);
|
| 269 |
+
font-size: 11px;
|
| 270 |
+
font-weight: 700;
|
| 271 |
+
color: var(--gold);
|
| 272 |
+
background: var(--gold-dim);
|
| 273 |
+
width: 22px;
|
| 274 |
+
height: 22px;
|
| 275 |
+
border-radius: 6px;
|
| 276 |
+
display: flex;
|
| 277 |
+
align-items: center;
|
| 278 |
+
justify-content: center;
|
| 279 |
+
flex-shrink: 0;
|
| 280 |
+
}
|
| 281 |
+
.flow-text {
|
| 282 |
+
font-size: 13px;
|
| 283 |
+
color: var(--text);
|
| 284 |
+
line-height: 1.5;
|
| 285 |
+
padding-top: 1px;
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
/* ===== COMPACT CARD SYSTEM ===== */
|
| 289 |
+
.ve-card { padding: 10px 14px !important; }
|
| 290 |
+
.ve-card--hero { padding: 14px 18px !important; }
|
| 291 |
+
.ve-card--recessed { padding: 10px 14px !important; }
|
| 292 |
+
.card-label { font-size: 10px !important; margin-bottom: 6px !important; margin-top: 0 !important; }
|
| 293 |
+
.card-title { font-size: 13px !important; margin-bottom: 4px !important; }
|
| 294 |
+
.card-desc { font-size: 12px !important; line-height: 1.5 !important; margin-bottom: 0 !important; color: var(--text-dim) !important; }
|
| 295 |
+
.callout { padding: 10px 14px !important; margin-bottom: 8px !important; font-size: 12px !important; }
|
| 296 |
+
.eco-card { padding: 12px 14px !important; }
|
| 297 |
+
.eco-name { font-size: 13px !important; margin-bottom: 2px !important; }
|
| 298 |
+
.eco-role { font-size: 11px !important; }
|
| 299 |
+
.eco-icon { font-size: 10px !important; margin-bottom: 4px !important; }
|
| 300 |
+
.subsys-card { padding: 14px !important; }
|
| 301 |
+
.subsys-title { font-size: 15px !important; margin-bottom: 4px !important; }
|
| 302 |
+
.subsys-desc { font-size: 12px !important; margin-bottom: 10px !important; line-height: 1.5 !important; }
|
| 303 |
+
.subsys-items { font-size: 11px !important; line-height: 1.6 !important; }
|
| 304 |
+
.subsys-items li { margin-bottom: 2px !important; }
|
| 305 |
+
.subsys-num { font-size: 9px !important; margin-bottom: 6px !important; }
|
| 306 |
+
.hero-formula { font-size: 12px !important; padding: 10px 16px !important; margin: 12px 0 !important; }
|
| 307 |
+
.theorie-grid { gap: 8px !important; }
|
| 308 |
+
.flow-steps { gap: 4px !important; }
|
| 309 |
+
.flow-step { padding: 6px 10px !important; }
|
| 310 |
+
.flow-num { width: 18px !important; height: 18px !important; font-size: 10px !important; }
|
| 311 |
+
.flow-text { font-size: 12px !important; }
|
| 312 |
+
.assume-list { font-size: 12px !important; }
|
| 313 |
+
.assume-list li { padding: 8px 12px !important; margin-bottom: 4px !important; }
|
| 314 |
+
.io-card { padding: 12px 14px !important; }
|
| 315 |
+
.io-title { font-size: 14px !important; margin: 4px 0 !important; }
|
| 316 |
+
.io-subtitle { font-size: 11px !important; margin-bottom: 8px !important; }
|
| 317 |
+
.io-label { font-size: 9px !important; margin: 8px 0 4px !important; }
|
| 318 |
+
.field-list { font-size: 11px !important; }
|
| 319 |
+
.field-name { font-size: 10px !important; }
|
| 320 |
+
.spec-card { padding: 12px 14px !important; }
|
| 321 |
+
.anti-grid { gap: 8px !important; }
|
| 322 |
+
.anti-item { padding: 8px 12px !important; font-size: 12px !important; }
|
| 323 |
+
.test-card { padding: 12px 14px !important; }
|
| 324 |
+
.test-title { font-size: 13px !important; margin-bottom: 4px !important; }
|
| 325 |
+
.test-desc { font-size: 11px !important; }
|
| 326 |
+
.api-card { padding: 12px 14px !important; }
|
| 327 |
+
.api-title { font-size: 13px !important; margin-bottom: 4px !important; }
|
| 328 |
+
.api-method { font-size: 9px !important; padding: 2px 6px !important; }
|
| 329 |
+
.state-node { padding: 6px 10px !important; font-size: 10px !important; }
|
| 330 |
+
.state-machine { gap: 4px !important; }
|
| 331 |
+
.state-arrow { font-size: 14px !important; padding: 0 4px !important; }
|
| 332 |
+
.section-title { margin-bottom: 12px !important; }
|
| 333 |
+
.section-num { width: 18px !important; height: 18px !important; font-size: 10px !important; }
|
| 334 |
+
|
| 335 |
+
/* ===== RESPONSIVE ===== */
|
| 336 |
+
@media (max-width: 900px) {
|
| 337 |
+
.ecosystem-grid { grid-template-columns: 1fr 1fr; }
|
| 338 |
+
.anti-grid { grid-template-columns: 1fr 1fr; }
|
| 339 |
+
.subsystem-grid { grid-template-columns: 1fr; }
|
| 340 |
+
.theorie-grid { grid-template-columns: 1fr; }
|
| 341 |
+
.io-grid { grid-template-columns: 1fr; }
|
| 342 |
+
.api-grid { grid-template-columns: 1fr; }
|
| 343 |
+
.spec-grid { grid-template-columns: 1fr; }
|
| 344 |
+
.test-grid { grid-template-columns: 1fr; }
|
| 345 |
+
.flow-diagram { flex-wrap: wrap; gap: 8px; justify-content: center; }
|
| 346 |
+
.flow-arrow { display: none; }
|
| 347 |
+
.state-machine { flex-wrap: wrap; gap: 8px; justify-content: center; }
|
| 348 |
+
.state-arrow { display: none; }
|
| 349 |
+
h1 { font-size: 36px; }
|
| 350 |
+
}
|
| 351 |
+
@media (max-width: 600px) {
|
| 352 |
+
.ecosystem-grid { grid-template-columns: 1fr; }
|
| 353 |
+
.anti-grid { grid-template-columns: 1fr; }
|
| 354 |
+
}
|
| 355 |
+
</style>
|
| 356 |
+
</head>
|
| 357 |
+
<body>
|
| 358 |
+
|
| 359 |
+
<div class="wrap">
|
| 360 |
+
|
| 361 |
+
<nav class="toc" id="toc">
|
| 362 |
+
<div class="toc-title">Spine</div>
|
| 363 |
+
<a href="#s00">Theorie</a>
|
| 364 |
+
<a href="#s01">Einleitung</a>
|
| 365 |
+
<a href="#s02">Spine ist nicht</a>
|
| 366 |
+
<a href="#s03">5 Subsysteme</a>
|
| 367 |
+
<a href="#s04">Input Classes</a>
|
| 368 |
+
<a href="#s05">Output Classes</a>
|
| 369 |
+
<a href="#s06">Zentraler Flow</a>
|
| 370 |
+
<a href="#s07">Pflicht-Spezifikationen</a>
|
| 371 |
+
<a href="#s08">Public Interfaces</a>
|
| 372 |
+
<a href="#s09">V1 Defaults</a>
|
| 373 |
+
<a href="#s10">Test-Szenarien</a>
|
| 374 |
+
<a href="#s11">Annahmen</a>
|
| 375 |
+
<a href="#s12">Kurzformel</a>
|
| 376 |
+
</nav>
|
| 377 |
+
|
| 378 |
+
<div class="main">
|
| 379 |
+
|
| 380 |
+
<!-- ===== S01: HERO ===== -->
|
| 381 |
+
<h1 class="anim" style="--i:0">Spine</h1>
|
| 382 |
+
<p class="subtitle anim" style="--i:1">Die kanonische Integrationsschicht im MultiHarness Studio</p>
|
| 383 |
+
|
| 384 |
+
<p class="lead anim" style="--i:2">
|
| 385 |
+
Spine ist die verbindende Systemschicht zwischen deinen bestehenden Ebenen. Sie ist weder primär UI noch primär Runtime noch primär Wissensrepo. Es ist die kanonische Integrationsschicht mit gemeinsamer Sprache, gemeinsamen IDs, gemeinsamen Verträgen und einem durchgehenden Event-/Artifact-Strom.
|
| 386 |
+
</p>
|
| 387 |
+
|
| 388 |
+
<div class="hero-formula anim" style="--i:3">
|
| 389 |
+
<strong>Spine</strong> = Registry + Schemas + Run-State + Event-Log + Artifact-Index + Adapter-Verträge
|
| 390 |
+
</div>
|
| 391 |
+
|
| 392 |
+
<div class="callout callout--navy anim" style="--i:4">
|
| 393 |
+
<strong>Ziel:</strong> Alle Teilsysteme sprechen dieselben Kernobjekte. Jede Entscheidung, Ausführung, Beobachtung und Bewertung ist als Run nachvollziehbar. Handoffs zwischen Entscheidung, Runtime, UI und Eval sind maschinenlesbar statt implizit. Das Gesamtsystem ist beobachtbar, rekonstruierbar und erweiterbar.
|
| 394 |
+
</div>
|
| 395 |
+
|
| 396 |
+
<!-- ===== S00: THEORIE ===== -->
|
| 397 |
+
<div id="s00" class="sec-head anim" style="--i:5; margin-top:32px;"><span class="sec-num">00</span> Theorie</div>
|
| 398 |
+
|
| 399 |
+
<div class="ve-card ve-card--hero anim" style="--i:6; border-left: 4px solid var(--navy); margin-bottom: 12px;">
|
| 400 |
+
<div class="card-label"><span class="dot" style="background:var(--navy);"></span> Die gemeinsame Sprache</div>
|
| 401 |
+
<p class="card-desc" style="font-size:14px; line-height:1.8;">
|
| 402 |
+
Spine ist die gemeinsame Sprache zwischen:
|
| 403 |
+
</p>
|
| 404 |
+
<ul class="theorie-list">
|
| 405 |
+
<li><strong>MetaMetaMeta</strong> als Erkenntnis- und Eval-Layer</li>
|
| 406 |
+
<li><strong>KomandoZentral</strong> als Decision-Layer</li>
|
| 407 |
+
<li><strong>UEBER_AGENT</strong> als Execution-Layer</li>
|
| 408 |
+
<li><strong>AgentIDE</strong> als Operator-Layer</li>
|
| 409 |
+
<li><strong>HarnessEcosystem</strong> als Darstellungs-Layer</li>
|
| 410 |
+
</ul>
|
| 411 |
+
<p class="card-desc" style="font-size:14px; line-height:1.8;">
|
| 412 |
+
Die Kernidee ist: Diese Systeme bleiben getrennt, aber sie sprechen dieselben Objekte, IDs, Zustände und Ereignisse. Spine ist also kein "Superagent", sondern die kanonische Integrationsschicht.
|
| 413 |
+
</p>
|
| 414 |
+
</div>
|
| 415 |
+
|
| 416 |
+
<div id="s01" class="sec-head anim" style="--i:7; margin-top:32px;"><span class="sec-num">01</span> Das ökosystem</div>
|
| 417 |
+
|
| 418 |
+
<p class="lead anim" style="--i:6">
|
| 419 |
+
Spine sitzt im Zentrum und verbindet 5 umgebende Systeme. Keines davon wird ersetzt — Spine sorgt für die verbindliche Sprache dazwischen.
|
| 420 |
+
</p>
|
| 421 |
+
|
| 422 |
+
<div class="ecosystem-grid anim" style="--i:7">
|
| 423 |
+
<div class="eco-card" style="border-top: 3px solid var(--teal);">
|
| 424 |
+
<div class="eco-icon" style="color:var(--teal);">MetaMetaMeta</div>
|
| 425 |
+
<div class="eco-name">MetaMetaMeta</div>
|
| 426 |
+
<div class="eco-role">Liefert Erkenntnisse und Eval-Daten</div>
|
| 427 |
+
</div>
|
| 428 |
+
<div class="eco-card" style="border-top: 3px solid var(--gold);">
|
| 429 |
+
<div class="eco-icon" style="color:var(--gold);">KomandoZentral</div>
|
| 430 |
+
<div class="eco-name">KomandoZentral</div>
|
| 431 |
+
<div class="eco-role">Trifft Entscheidungen</div>
|
| 432 |
+
</div>
|
| 433 |
+
<div class="eco-card" style="border-top: 3px solid var(--sage);">
|
| 434 |
+
<div class="eco-icon" style="color:var(--sage);">UEBER_AGENT</div>
|
| 435 |
+
<div class="eco-name">UEBER_AGENT</div>
|
| 436 |
+
<div class="eco-role">Führt aus</div>
|
| 437 |
+
</div>
|
| 438 |
+
<div class="eco-card" style="border-top: 3px solid var(--plum);">
|
| 439 |
+
<div class="eco-icon" style="color:var(--plum);">AgentIDE</div>
|
| 440 |
+
<div class="eco-name">AgentIDE</div>
|
| 441 |
+
<div class="eco-role">Operator-Oberfläche</div>
|
| 442 |
+
</div>
|
| 443 |
+
<div class="eco-card" style="border-top: 3px solid var(--rose);">
|
| 444 |
+
<div class="eco-icon" style="color:var(--rose);">HarnessEcosystem</div>
|
| 445 |
+
<div class="eco-name">HarnessEcosystem</div>
|
| 446 |
+
<div class="eco-role">Visualisiert und dokumentiert</div>
|
| 447 |
+
</div>
|
| 448 |
+
<div class="eco-card" style="border-top: 3px solid var(--navy); background:var(--navy-dim);">
|
| 449 |
+
<div class="eco-icon" style="color:var(--navy);">SPINE</div>
|
| 450 |
+
<div class="eco-name" style="color:var(--navy);">Spine</div>
|
| 451 |
+
<div class="eco-role">Integrationsschicht</div>
|
| 452 |
+
</div>
|
| 453 |
+
</div>
|
| 454 |
+
|
| 455 |
+
<!-- ===== S00.1: THEORIE — WAS SPINE KÖNNEN MUSS ===== -->
|
| 456 |
+
<div class="card-label anim" style="--i:8; margin-top:16px; margin-bottom:6px;"><span class="dot" style="background:var(--gold);"></span> Was Spine können muss</div>
|
| 457 |
+
|
| 458 |
+
<div class="theorie-grid anim" style="--i:9; display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:8px;">
|
| 459 |
+
<div class="ve-card" style="border-left:3px solid var(--teal);">
|
| 460 |
+
<div class="card-title" style="color:var(--teal); font-size:13px;">Kanonische Objekte</div>
|
| 461 |
+
<div class="card-desc" style="font-size:12px;">Task, Decision, Run, ExecutionRequest, ExecutionStatus, Event, Artifact, EvalResult, Capability, Workspace</div>
|
| 462 |
+
</div>
|
| 463 |
+
<div class="ve-card" style="border-left:3px solid var(--gold);">
|
| 464 |
+
<div class="card-title" style="color:var(--gold); font-size:13px;">Globale IDs</div>
|
| 465 |
+
<div class="card-desc" style="font-size:12px;">task_id, decision_id, run_id, execution_id, artifact_id, eval_id</div>
|
| 466 |
+
</div>
|
| 467 |
+
<div class="ve-card" style="border-left:3px solid var(--sage);">
|
| 468 |
+
<div class="card-title" style="color:var(--sage); font-size:13px;">State Machine</div>
|
| 469 |
+
<div class="card-desc" style="font-size:12px;">Harte Zustandsmaschine für Runs und Executions</div>
|
| 470 |
+
</div>
|
| 471 |
+
<div class="ve-card" style="border-left:3px solid var(--rose);">
|
| 472 |
+
<div class="card-title" style="color:var(--rose); font-size:13px;">Append-only Events</div>
|
| 473 |
+
<div class="card-desc" style="font-size:12px;">Jeder Ablauf rekonstruierbar</div>
|
| 474 |
+
</div>
|
| 475 |
+
<div class="ve-card" style="border-left:3px solid var(--plum);">
|
| 476 |
+
<div class="card-title" style="color:var(--plum); font-size:13px;">Artifacts</div>
|
| 477 |
+
<div class="card-desc" style="font-size:12px;">Registriert und referenzierbar</div>
|
| 478 |
+
</div>
|
| 479 |
+
<div class="ve-card" style="border-left:3px solid var(--amber);">
|
| 480 |
+
<div class="card-title" style="color:var(--amber); font-size:13px;">Provenienz</div>
|
| 481 |
+
<div class="card-desc" style="font-size:12px;">Wer hat was wann in welchem System erzeugt?</div>
|
| 482 |
+
</div>
|
| 483 |
+
<div class="ve-card" style="border-left:3px solid var(--navy);">
|
| 484 |
+
<div class="card-title" style="color:var(--navy); font-size:13px;">Capability Discovery</div>
|
| 485 |
+
<div class="card-desc" style="font-size:12px;">Welche Harnesses, Agenten und Runtime-Ziele existieren real?</div>
|
| 486 |
+
</div>
|
| 487 |
+
<div class="ve-card" style="border-left:3px solid var(--teal);">
|
| 488 |
+
<div class="card-title" style="color:var(--teal); font-size:13px;">Decision & Execution entkoppeln</div>
|
| 489 |
+
<div class="card-desc" style="font-size:12px;">KomandoZentral entscheidet, UEBER_AGENT führt aus, Spine verbindet</div>
|
| 490 |
+
</div>
|
| 491 |
+
</div>
|
| 492 |
+
|
| 493 |
+
<div class="callout anim" style="--i:10; margin-bottom:12px;">
|
| 494 |
+
<strong>Eval Rückfluss:</strong> Ergebnisse müssen wieder in MetaMetaMeta und HarnessEcosystem einfliessen.
|
| 495 |
+
</div>
|
| 496 |
+
|
| 497 |
+
<!-- ===== S00.2: MINIMALER INPUT ===== -->
|
| 498 |
+
<div class="card-label anim" style="--i:11; margin-bottom:6px;"><span class="dot" style="background:var(--sage);"></span> Minimaler Input für einen echten Run</div>
|
| 499 |
+
|
| 500 |
+
<div class="ve-card ve-card--recessed anim" style="--i:12; margin-bottom:12px;">
|
| 501 |
+
<ul class="theorie-list" style="margin-bottom:0;">
|
| 502 |
+
<li>Taskbeschreibung</li>
|
| 503 |
+
<li>Operator-Kontext</li>
|
| 504 |
+
<li>Ziel- oder Runtime-Präferenz</li>
|
| 505 |
+
<li>Decision-Objekt</li>
|
| 506 |
+
<li>Rückmeldungen aus der Ausführung</li>
|
| 507 |
+
</ul>
|
| 508 |
+
</div>
|
| 509 |
+
|
| 510 |
+
<!-- ===== S00.3: WAS ZWISCHEN PASSIERT ===== -->
|
| 511 |
+
<div class="card-label anim" style="--i:13; margin-bottom:6px;"><span class="dot" style="background:var(--rose);"></span> Was dazwischen passiert</div>
|
| 512 |
+
|
| 513 |
+
<div class="flow-steps anim" style="--i:14; margin-bottom:12px;">
|
| 514 |
+
<div class="flow-step">
|
| 515 |
+
<div class="flow-num">1</div>
|
| 516 |
+
<div class="flow-text">Ein Task wird angelegt.</div>
|
| 517 |
+
</div>
|
| 518 |
+
<div class="flow-step">
|
| 519 |
+
<div class="flow-num">2</div>
|
| 520 |
+
<div class="flow-text">KomandoZentral liefert eine Routing-Entscheidung.</div>
|
| 521 |
+
</div>
|
| 522 |
+
<div class="flow-step">
|
| 523 |
+
<div class="flow-num">3</div>
|
| 524 |
+
<div class="flow-text">Spine validiert, ob das Ziel in der Registry real existiert.</div>
|
| 525 |
+
</div>
|
| 526 |
+
<div class="flow-step">
|
| 527 |
+
<div class="flow-num">4</div>
|
| 528 |
+
<div class="flow-text">Spine erzeugt einen Run und daraus einen ExecutionRequest.</div>
|
| 529 |
+
</div>
|
| 530 |
+
<div class="flow-step">
|
| 531 |
+
<div class="flow-num">5</div>
|
| 532 |
+
<div class="flow-text">UEBER_AGENT oder ein anderes Runtime-Ziel führt aus.</div>
|
| 533 |
+
</div>
|
| 534 |
+
<div class="flow-step">
|
| 535 |
+
<div class="flow-num">6</div>
|
| 536 |
+
<div class="flow-text">Während der Ausführung kommen Status, Trace und Artifacts zurück.</div>
|
| 537 |
+
</div>
|
| 538 |
+
<div class="flow-step">
|
| 539 |
+
<div class="flow-num">7</div>
|
| 540 |
+
<div class="flow-text">Spine schreibt alles als Events und referenzierte Artefakte.</div>
|
| 541 |
+
</div>
|
| 542 |
+
<div class="flow-step">
|
| 543 |
+
<div class="flow-num">8</div>
|
| 544 |
+
<div class="flow-text">MetaMetaMeta bewertet den Run.</div>
|
| 545 |
+
</div>
|
| 546 |
+
<div class="flow-step">
|
| 547 |
+
<div class="flow-num">9</div>
|
| 548 |
+
<div class="flow-text">HarnessEcosystem zeigt den verdichteten Zustand.</div>
|
| 549 |
+
</div>
|
| 550 |
+
</div>
|
| 551 |
+
|
| 552 |
+
<!-- ===== S00.4: TECHNISCHE SPEZIFIKATIONEN ===== -->
|
| 553 |
+
<div class="card-label anim" style="--i:15; margin-bottom:6px;"><span class="dot" style="background:var(--plum);"></span> Technische Spezifikationsbereiche</div>
|
| 554 |
+
|
| 555 |
+
<div class="theorie-grid anim" style="--i:16; display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:8px;">
|
| 556 |
+
<div class="ve-card" style="border-left:3px solid var(--navy);">
|
| 557 |
+
<div class="card-title" style="font-size:13px;">Registry Model</div>
|
| 558 |
+
<div class="card-desc" style="font-size:12px;">Harnesses, Agenten, Runtime-Ziele und Capabilities</div>
|
| 559 |
+
</div>
|
| 560 |
+
<div class="ve-card" style="border-left:3px solid var(--gold);">
|
| 561 |
+
<div class="card-title" style="font-size:13px;">Contract Model</div>
|
| 562 |
+
<div class="card-desc" style="font-size:12px;">Alle Kernobjekte</div>
|
| 563 |
+
</div>
|
| 564 |
+
<div class="ve-card" style="border-left:3px solid var(--teal);">
|
| 565 |
+
<div class="card-title" style="font-size:13px;">State Model</div>
|
| 566 |
+
<div class="card-desc" style="font-size:12px;">Zulässige Zustandsübergänge</div>
|
| 567 |
+
</div>
|
| 568 |
+
<div class="ve-card" style="border-left:3px solid var(--rose);">
|
| 569 |
+
<div class="card-title" style="font-size:13px;">Event Model</div>
|
| 570 |
+
<div class="card-desc" style="font-size:12px;">Append-only Historie</div>
|
| 571 |
+
</div>
|
| 572 |
+
<div class="ve-card" style="border-left:3px solid var(--sage);">
|
| 573 |
+
<div class="card-title" style="font-size:13px;">Artifact Model</div>
|
| 574 |
+
<div class="card-desc" style="font-size:12px;">Outputs und Referenzen</div>
|
| 575 |
+
</div>
|
| 576 |
+
<div class="ve-card" style="border-left:3px solid var(--amber);">
|
| 577 |
+
<div class="card-title" style="font-size:13px;">Adapter Model</div>
|
| 578 |
+
<div class="card-desc" style="font-size:12px;">Übersetzungen zwischen lokalen Formaten und Spine-Objekten</div>
|
| 579 |
+
</div>
|
| 580 |
+
<div class="ve-card" style="border-left:3px solid var(--plum);">
|
| 581 |
+
<div class="card-title" style="font-size:13px;">Versioning Model</div>
|
| 582 |
+
<div class="card-desc" style="font-size:12px;">Schema-Evolution</div>
|
| 583 |
+
</div>
|
| 584 |
+
<div class="ve-card" style="border-left:3px solid var(--rose);">
|
| 585 |
+
<div class="card-title" style="font-size:13px;">Error Model</div>
|
| 586 |
+
<div class="card-desc" style="font-size:12px;">validation_error, dispatch_error, runtime_error, timeout, contract_mismatch</div>
|
| 587 |
+
</div>
|
| 588 |
+
</div>
|
| 589 |
+
|
| 590 |
+
<!-- ===== S00.5: HARTE SPEZIFIKATIONSREGELN ===== -->
|
| 591 |
+
<div class="card-label anim" style="--i:17; margin-bottom:6px;"><span class="dot" style="background:var(--gold);"></span> Harte Spezifikationsregeln</div>
|
| 592 |
+
|
| 593 |
+
<div class="ve-card anim" style="--i:18; margin-bottom:12px;">
|
| 594 |
+
<ul class="theorie-list">
|
| 595 |
+
<li>Jedes Spine-Objekt braucht <code style="font-family:var(--font-mono);font-size:11px;background:var(--gold-dim);color:var(--gold);padding:1px 5px;border-radius:3px;">schema_name</code> und <code style="font-family:var(--font-mono);font-size:11px;background:var(--gold-dim);color:var(--gold);padding:1px 5px;border-radius:3px;">schema_version</code>.</li>
|
| 596 |
+
<li>Jedes relevante Objekt braucht eine globale ID.</li>
|
| 597 |
+
<li>Kein Teilsystem darf eigene Run-States erfinden.</li>
|
| 598 |
+
<li>Adapter dürfen mappen, aber keine Semantik verändern.</li>
|
| 599 |
+
<li>Events sind append-only.</li>
|
| 600 |
+
<li>Artifacts werden explizit registriert, nicht nur als freie Dateipfade erwähnt.</li>
|
| 601 |
+
<li>Provenienz ist Pflicht, nicht Zusatzinfo.</li>
|
| 602 |
+
</ul>
|
| 603 |
+
</div>
|
| 604 |
+
|
| 605 |
+
<!-- ===== S02: SPINE IS NOT ===== -->
|
| 606 |
+
<div id="s02" class="sec-head anim" style="--i:8"><span class="sec-num">02</span> Spine ist nicht</div>
|
| 607 |
+
|
| 608 |
+
<p class="lead anim" style="--i:9">
|
| 609 |
+
Spine bewusst V1 nicht zu sein — dies sind harte Anti-Features, keine fehlenden Bugs.
|
| 610 |
+
</p>
|
| 611 |
+
|
| 612 |
+
<div class="anti-grid anim" style="--i:10">
|
| 613 |
+
<div class="anti-item"><span class="anti-x">X</span> kein LLM-Orchestrator</div>
|
| 614 |
+
<div class="anti-item"><span class="anti-x">X</span> kein Ersatz für OpenClaw</div>
|
| 615 |
+
<div class="anti-item"><span class="anti-x">X</span> kein eigener IDE-Editor</div>
|
| 616 |
+
<div class="anti-item"><span class="anti-x">X</span> kein Wissensfrontend</div>
|
| 617 |
+
<div class="anti-item"><span class="anti-x">X</span> kein autonomer Planer</div>
|
| 618 |
+
<div class="anti-item"><span class="anti-x">X</span> kein "smartes Superhirn"</div>
|
| 619 |
+
</div>
|
| 620 |
+
|
| 621 |
+
<div class="callout anim" style="--i:11">
|
| 622 |
+
<strong>Regel:</strong> Spine ist der "Verbindliche", nicht der "Denkende". Er übersetzt zwischen Systemen, validiert Verträge und verwaltet Zustand — aber trifft keine eigenen Entscheidungen.
|
| 623 |
+
</div>
|
| 624 |
+
|
| 625 |
+
<!-- ===== S03: 5 SUBSYSTEME ===== -->
|
| 626 |
+
<div id="s03" class="sec-head anim" style="--i:12"><span class="sec-num">03</span> Die 5 Subsysteme</div>
|
| 627 |
+
|
| 628 |
+
<p class="lead anim" style="--i:13">
|
| 629 |
+
Spine ist logisch in 5 Subsysteme gegliedert. Zusammen bilden sie die vollständige Integrationsschicht.
|
| 630 |
+
</p>
|
| 631 |
+
|
| 632 |
+
<div class="subsystem-grid anim" style="--i:14">
|
| 633 |
+
|
| 634 |
+
<div class="subsys-card" style="border-top: 3px solid var(--navy);">
|
| 635 |
+
<div class="subsys-num" style="color:var(--navy);">1 — Registry Layer</div>
|
| 636 |
+
<div class="subsys-title">Hält den kanonischen Bestand</div>
|
| 637 |
+
<div class="subsys-desc">Pflichtfragen: Welche Harnesses existieren? Welche Agenten? Welche Inputs akzeptieren sie? Welche Outputs liefern sie? Welche Runtime ist aktiv, blockiert, deprecated oder experimental?</div>
|
| 638 |
+
<ul class="subsys-items" style="color:var(--navy);">
|
| 639 |
+
<li>Harness-Registry</li>
|
| 640 |
+
<li>Agent-Registry</li>
|
| 641 |
+
<li>Capability-Registry</li>
|
| 642 |
+
<li>Workspace-Registry</li>
|
| 643 |
+
<li>Runtime-Targets</li>
|
| 644 |
+
<li>Schema-Versionen</li>
|
| 645 |
+
</ul>
|
| 646 |
+
</div>
|
| 647 |
+
|
| 648 |
+
<div class="subsys-card" style="border-top: 3px solid var(--gold);">
|
| 649 |
+
<div class="subsys-num" style="color:var(--gold);">2 — Contract Layer</div>
|
| 650 |
+
<div class="subsys-title">Definiert die formalen Schemas</div>
|
| 651 |
+
<div class="subsys-desc">Dieser Layer ist der eigentliche Kern von Spine. Alle Nachrichten zwischen Systemen müssen gegen diese Schemas validierbar sein.</div>
|
| 652 |
+
<ul class="subsys-items" style="color:var(--gold);">
|
| 653 |
+
<li>TaskRequest</li>
|
| 654 |
+
<li>RoutingDecision</li>
|
| 655 |
+
<li>ExecutionRequest</li>
|
| 656 |
+
<li>ExecutionStatus</li>
|
| 657 |
+
<li>RouteTrace</li>
|
| 658 |
+
<li>ArtifactManifest</li>
|
| 659 |
+
<li>EvalRecord</li>
|
| 660 |
+
<li>OperatorContext</li>
|
| 661 |
+
<li>SystemManifest</li>
|
| 662 |
+
</ul>
|
| 663 |
+
</div>
|
| 664 |
+
|
| 665 |
+
<div class="subsys-card" style="border-top: 3px solid var(--teal);">
|
| 666 |
+
<div class="subsys-num" style="color:var(--teal);">3 — Event Layer</div>
|
| 667 |
+
<div class="subsys-title">Append-only Eventstrom</div>
|
| 668 |
+
<div class="subsys-desc">Jedes Event ist unveränderlich. Die vollständige Historie eines Runs ist immer rekonstruierbar.</div>
|
| 669 |
+
<ul class="subsys-items" style="color:var(--teal);">
|
| 670 |
+
<li>task.created</li>
|
| 671 |
+
<li>decision.created</li>
|
| 672 |
+
<li>decision.approved</li>
|
| 673 |
+
<li>execution.requested</li>
|
| 674 |
+
<li>execution.dispatched</li>
|
| 675 |
+
<li>execution.started</li>
|
| 676 |
+
<li>execution.progress</li>
|
| 677 |
+
<li>execution.completed</li>
|
| 678 |
+
<li>execution.failed</li>
|
| 679 |
+
<li>artifact.created</li>
|
| 680 |
+
<li>eval.recorded</li>
|
| 681 |
+
<li>run.closed</li>
|
| 682 |
+
</ul>
|
| 683 |
+
</div>
|
| 684 |
+
|
| 685 |
+
<div class="subsys-card" style="border-top: 3px solid var(--sage);">
|
| 686 |
+
<div class="subsys-num" style="color:var(--sage);">4 — Artifact Layer</div>
|
| 687 |
+
<div class="subsys-title">Verwaltet alle erzeugten Outputs</div>
|
| 688 |
+
<div class="subsys-desc">Artifacts sind versioniert und referenzierbar. Jedes Artifact hat einen klaren Producer und eine nachvollziehbare Provenienz.</div>
|
| 689 |
+
<ul class="subsys-items" style="color:var(--sage);">
|
| 690 |
+
<li>decision yaml/json</li>
|
| 691 |
+
<li>prompt/tasksheet</li>
|
| 692 |
+
<li>trace</li>
|
| 693 |
+
<li>runtime log</li>
|
| 694 |
+
<li>deploy result</li>
|
| 695 |
+
<li>evaluation result</li>
|
| 696 |
+
<li>report/dashboard snapshot</li>
|
| 697 |
+
<li>patch/commit reference</li>
|
| 698 |
+
<li>derived summary</li>
|
| 699 |
+
</ul>
|
| 700 |
+
</div>
|
| 701 |
+
|
| 702 |
+
<div class="subsys-card" style="border-top: 3px solid var(--plum); grid-column: 1 / -1;">
|
| 703 |
+
<div class="subsys-num" style="color:var(--plum);">5 — Adapter Layer</div>
|
| 704 |
+
<div class="subsys-title">Adapter zu den bestehenden Projekten</div>
|
| 705 |
+
<div class="subsys-desc">Jedes umgebende System braucht einen eigenen Adapter, der lokale Formate ins Spine-Format übersetzt. Adapter dürfen lokale Formate ins Spine-Format übersetzen, aber nicht die Spine-Kernmodelle verändern.</div>
|
| 706 |
+
<ul class="subsys-items" style="color:var(--plum); display: inline-flex; flex-wrap: wrap; gap: 8px 24px; padding-left: 0;">
|
| 707 |
+
<li>metametameta_adapter</li>
|
| 708 |
+
<li>komandozentral_adapter</li>
|
| 709 |
+
<li>ueber_agent_adapter</li>
|
| 710 |
+
<li>agentide_adapter</li>
|
| 711 |
+
<li>harnessecosystem_adapter</li>
|
| 712 |
+
</ul>
|
| 713 |
+
</div>
|
| 714 |
+
|
| 715 |
+
</div>
|
| 716 |
+
|
| 717 |
+
<div class="callout anim" style="--i:15">
|
| 718 |
+
<strong>Adapter-Regel:</strong> Adapter übersetzen lokale Formate ins Spine-Format, verändern aber niemals die Spine-Kernmodelle selbst.
|
| 719 |
+
</div>
|
| 720 |
+
|
| 721 |
+
<!-- ===== S04: INPUT CLASSES ===== -->
|
| 722 |
+
<div id="s04" class="sec-head anim" style="--i:16"><span class="sec-num">04</span> Input Classes</div>
|
| 723 |
+
|
| 724 |
+
<p class="lead anim" style="--i:17">
|
| 725 |
+
Spine braucht nur wenige kanonische Input-Klassen. Alles, was von außen reinkommt, passt in genau eine dieser 4 Kategorien.
|
| 726 |
+
</p>
|
| 727 |
+
|
| 728 |
+
<div class="io-grid anim" style="--i:18">
|
| 729 |
+
|
| 730 |
+
<div class="io-card" style="border-top: 3px solid var(--navy);">
|
| 731 |
+
<span class="io-badge" style="background:var(--navy-dim); color:var(--navy);">A — Intent Input</span>
|
| 732 |
+
<div class="io-title">TaskRequest</div>
|
| 733 |
+
<div class="io-subtitle">Kommt von User, UI oder externem System</div>
|
| 734 |
+
<div class="io-label">Pflichtfelder</div>
|
| 735 |
+
<ul class="field-list">
|
| 736 |
+
<li><span class="field-name">task_id</span> — globale ID</li>
|
| 737 |
+
<li><span class="field-name">title</span> — Kurzbezeichnung</li>
|
| 738 |
+
<li><span class="field-name">description</span> — Freitext-Beschreibung</li>
|
| 739 |
+
<li><span class="field-name">requested_by</span> — Absender</li>
|
| 740 |
+
<li><span class="field-name">created_at</span> — Zeitstempel</li>
|
| 741 |
+
<li><span class="field-name">origin_system</span> — Quellsystem</li>
|
| 742 |
+
<li><span class="field-name">operator_context</span> — Kontext-Info</li>
|
| 743 |
+
<li><span class="field-name">constraints</span> — Randbedingungen</li>
|
| 744 |
+
<li><span class="field-name">desired_outcomes</span> — Ziele</li>
|
| 745 |
+
</ul>
|
| 746 |
+
</div>
|
| 747 |
+
|
| 748 |
+
<div class="io-card" style="border-top: 3px solid var(--gold);">
|
| 749 |
+
<span class="io-badge" style="background:var(--gold-dim); color:var(--gold);">B — Decision Input</span>
|
| 750 |
+
<div class="io-title">RoutingDecision</div>
|
| 751 |
+
<div class="io-subtitle">Kommt typischerweise aus KomandoZentral</div>
|
| 752 |
+
<div class="io-label">Pflichtfelder</div>
|
| 753 |
+
<ul class="field-list">
|
| 754 |
+
<li><span class="field-name">decision_id</span> — globale ID</li>
|
| 755 |
+
<li><span class="field-name">task_id</span> — referenzierte Task</li>
|
| 756 |
+
<li><span class="field-name">recommended_harness</span> — Ziel-Harness</li>
|
| 757 |
+
<li><span class="field-name">recommended_runtime_target</span> — Runtime-Ziel</li>
|
| 758 |
+
<li><span class="field-name">confidence</span> — Konfidenzwert</li>
|
| 759 |
+
<li><span class="field-name">reasoning_summary</span> — Begründung</li>
|
| 760 |
+
<li><span class="field-name">risks</span> — identifizierte Risiken</li>
|
| 761 |
+
<li><span class="field-name">fallback</span> — Fallback-Option</li>
|
| 762 |
+
<li><span class="field-name">decision_policy_version</span> — Policy-Version</li>
|
| 763 |
+
</ul>
|
| 764 |
+
</div>
|
| 765 |
+
|
| 766 |
+
<div class="io-card" style="border-top: 3px solid var(--teal);">
|
| 767 |
+
<span class="io-badge" style="background:var(--teal-dim); color:var(--teal);">C — Execution Input</span>
|
| 768 |
+
<div class="io-title">ExecutionRequest</div>
|
| 769 |
+
<div class="io-subtitle">Kommt aus Entscheidung plus Runtime-Handoff</div>
|
| 770 |
+
<div class="io-label">Pflichtfelder</div>
|
| 771 |
+
<ul class="field-list">
|
| 772 |
+
<li><span class="field-name">execution_id</span> — globale ID</li>
|
| 773 |
+
<li><span class="field-name">decision_id</span> — referenzierte Decision</li>
|
| 774 |
+
<li><span class="field-name">run_id</span> — übergeordneter Run</li>
|
| 775 |
+
<li><span class="field-name">target_runtime</span> — Ziel-Runtime</li>
|
| 776 |
+
<li><span class="field-name">target_agent</span> — Ziel-Agent</li>
|
| 777 |
+
<li><span class="field-name">input_artifacts</span> — Eingabe-Artefakte</li>
|
| 778 |
+
<li><span class="field-name">execution_mode</span> — Modus</li>
|
| 779 |
+
<li><span class="field-name">workspace_ref</span> — Workspace-Referenz</li>
|
| 780 |
+
<li><span class="field-name">timeout_policy</span> — Timeout-Regel</li>
|
| 781 |
+
<li><span class="field-name">approval_requirements</span> — Freigabe-Bedarf</li>
|
| 782 |
+
</ul>
|
| 783 |
+
</div>
|
| 784 |
+
|
| 785 |
+
<div class="io-card" style="border-top: 3px solid var(--sage);">
|
| 786 |
+
<span class="io-badge" style="background:var(--sage-dim); color:var(--sage);">D — Observation Input</span>
|
| 787 |
+
<div class="io-title">Observation Forms</div>
|
| 788 |
+
<div class="io-subtitle">Kommt aus Runtime, UI oder Logs</div>
|
| 789 |
+
<div class="io-label">Formen</div>
|
| 790 |
+
<ul class="field-list">
|
| 791 |
+
<li><span class="field-name">ExecutionStatus</span> — Laufzeit-Status</li>
|
| 792 |
+
<li><span class="field-name">RouteTrace</span> — Routing-Verfolgung</li>
|
| 793 |
+
<li><span class="field-name">ArtifactManifest</span> — erzeugte Artefakte</li>
|
| 794 |
+
<li><span class="field-name">EvalRecord</span> — Evaluations-Datensatz</li>
|
| 795 |
+
</ul>
|
| 796 |
+
<div class="io-label">Event Required Fields</div>
|
| 797 |
+
<ul class="field-list">
|
| 798 |
+
<li><span class="field-name">globale ID</span></li>
|
| 799 |
+
<li><span class="field-name">Typ</span></li>
|
| 800 |
+
<li><span class="field-name">Zeitstempel</span></li>
|
| 801 |
+
<li><span class="field-name">run_id</span></li>
|
| 802 |
+
<li><span class="field-name">source_system</span></li>
|
| 803 |
+
<li><span class="field-name">schema_version</span></li>
|
| 804 |
+
<li><span class="field-name">Payload</span></li>
|
| 805 |
+
<li><span class="field-name">Referenzen auf verursachende Objekte</span></li>
|
| 806 |
+
</ul>
|
| 807 |
+
</div>
|
| 808 |
+
|
| 809 |
+
</div>
|
| 810 |
+
|
| 811 |
+
<!-- ===== S05: OUTPUT CLASSES ===== -->
|
| 812 |
+
<div id="s05" class="sec-head anim" style="--i:19"><span class="sec-num">05</span> Output Classes</div>
|
| 813 |
+
|
| 814 |
+
<p class="lead anim" style="--i:20">
|
| 815 |
+
Spine muss 4 Output-Klassen bereitstellen. Jede ist für einen anderen Konsumenten optimiert.
|
| 816 |
+
</p>
|
| 817 |
+
|
| 818 |
+
<div class="io-grid anim" style="--i:21">
|
| 819 |
+
|
| 820 |
+
<div class="io-card" style="border-top: 3px solid var(--teal);">
|
| 821 |
+
<span class="io-badge" style="background:var(--teal-dim); color:var(--teal);">1 — Dispatchable</span>
|
| 822 |
+
<div class="io-title">Execution Contract</div>
|
| 823 |
+
<div class="io-subtitle">Für UEBER_AGENT oder andere Runtime</div>
|
| 824 |
+
<ul class="field-list">
|
| 825 |
+
<li>Normalisierter ExecutionRequest</li>
|
| 826 |
+
<li>Referenzierte Inputs</li>
|
| 827 |
+
<li>Freigegebene Runtime-Parameter</li>
|
| 828 |
+
<li>Erwartete Rückgabeschemata</li>
|
| 829 |
+
</ul>
|
| 830 |
+
</div>
|
| 831 |
+
|
| 832 |
+
<div class="io-card" style="border-top: 3px solid var(--plum);">
|
| 833 |
+
<span class="io-badge" style="background:var(--plum-dim); color:var(--plum);">2 — Observable</span>
|
| 834 |
+
<div class="io-title">Run State</div>
|
| 835 |
+
<div class="io-subtitle">Für AgentIDE und Monitoring</div>
|
| 836 |
+
<ul class="field-list">
|
| 837 |
+
<li>Aktueller Status eines Runs</li>
|
| 838 |
+
<li>Event-Feed</li>
|
| 839 |
+
<li>Artefakte</li>
|
| 840 |
+
<li>Fehlerzustände</li>
|
| 841 |
+
<li>Nächste erlaubte Transitionen</li>
|
| 842 |
+
</ul>
|
| 843 |
+
</div>
|
| 844 |
+
|
| 845 |
+
<div class="io-card" style="border-top: 3px solid var(--amber);">
|
| 846 |
+
<span class="io-badge" style="background:var(--amber-dim); color:var(--amber);">3 — Knowledge</span>
|
| 847 |
+
<div class="io-title">Knowledge Feed</div>
|
| 848 |
+
<div class="io-subtitle">Für MetaMetaMeta und HarnessEcosystem</div>
|
| 849 |
+
<ul class="field-list">
|
| 850 |
+
<li>Eval-fähige Run-Historie</li>
|
| 851 |
+
<li>Aggregierte Outcome-Daten</li>
|
| 852 |
+
<li>Strukturierte Trace-Daten</li>
|
| 853 |
+
<li>Registry-Snapshots</li>
|
| 854 |
+
<li>Dashboard-Feeds</li>
|
| 855 |
+
</ul>
|
| 856 |
+
</div>
|
| 857 |
+
|
| 858 |
+
<div class="io-card" style="border-top: 3px solid var(--rose);">
|
| 859 |
+
<span class="io-badge" style="background:var(--rose-dim); color:var(--rose);">4 — Audit</span>
|
| 860 |
+
<div class="io-title">Audit Trail</div>
|
| 861 |
+
<div class="io-subtitle">Für Debugging und Vertrauensbildung</div>
|
| 862 |
+
<ul class="field-list">
|
| 863 |
+
<li>Vollständige Rekonstruktion eines Runs</li>
|
| 864 |
+
<li>Welche Entscheidung zu welcher Ausführung führte</li>
|
| 865 |
+
<li>Welche Quellen benutzt wurden</li>
|
| 866 |
+
<li>Welche Artefakte entstanden</li>
|
| 867 |
+
<li>Welches Eval daraus resultierte</li>
|
| 868 |
+
</ul>
|
| 869 |
+
</div>
|
| 870 |
+
|
| 871 |
+
</div>
|
| 872 |
+
|
| 873 |
+
<!-- ===== S06: FLOW ===== -->
|
| 874 |
+
<div id="s06" class="sec-head anim" style="--i:22"><span class="sec-num">06</span> Der zentrale Spine-Flow</div>
|
| 875 |
+
|
| 876 |
+
<p class="lead anim" style="--i:23">
|
| 877 |
+
Von TaskRequest bis HarnessEcosystem — der komplette Lebenszyklus in 10 Schritten.
|
| 878 |
+
</p>
|
| 879 |
+
|
| 880 |
+
<div class="ve-card ve-card--hero anim" style="--i:24">
|
| 881 |
+
<div class="flow-diagram">
|
| 882 |
+
<div class="flow-step">
|
| 883 |
+
<div class="flow-node" style="border-color:var(--navy-dim);">
|
| 884 |
+
<div class="flow-num" style="color:var(--navy);">01</div>
|
| 885 |
+
<div class="flow-name">TaskRequest</div>
|
| 886 |
+
<div class="flow-system">AgentIDE / User</div>
|
| 887 |
+
</div>
|
| 888 |
+
</div>
|
| 889 |
+
<div class="flow-arrow">-→</div>
|
| 890 |
+
<div class="flow-step">
|
| 891 |
+
<div class="flow-node" style="border-color:var(--gold-dim);">
|
| 892 |
+
<div class="flow-num" style="color:var(--gold);">02</div>
|
| 893 |
+
<div class="flow-name">RoutingDecision</div>
|
| 894 |
+
<div class="flow-system">KomandoZentral</div>
|
| 895 |
+
</div>
|
| 896 |
+
</div>
|
| 897 |
+
<div class="flow-arrow">-→</div>
|
| 898 |
+
<div class="flow-step">
|
| 899 |
+
<div class="flow-node" style="border-color:var(--teal-dim);">
|
| 900 |
+
<div class="flow-num" style="color:var(--teal);">03</div>
|
| 901 |
+
<div class="flow-name">Validierung</div>
|
| 902 |
+
<div class="flow-system">Spine Registry + Schema</div>
|
| 903 |
+
</div>
|
| 904 |
+
</div>
|
| 905 |
+
<div class="flow-arrow">-→</div>
|
| 906 |
+
<div class="flow-step">
|
| 907 |
+
<div class="flow-node" style="border-color:var(--sage-dim);">
|
| 908 |
+
<div class="flow-num" style="color:var(--sage);">04</div>
|
| 909 |
+
<div class="flow-name">Run + ExecutionRequest</div>
|
| 910 |
+
<div class="flow-system">Spine erzeugt</div>
|
| 911 |
+
</div>
|
| 912 |
+
</div>
|
| 913 |
+
<div class="flow-arrow">-→</div>
|
| 914 |
+
<div class="flow-step">
|
| 915 |
+
<div class="flow-node" style="border-color:var(--sage-dim);">
|
| 916 |
+
<div class="flow-num" style="color:var(--sage);">05</div>
|
| 917 |
+
<div class="flow-name">Execution</div>
|
| 918 |
+
<div class="flow-system">UEBER_AGENT</div>
|
| 919 |
+
</div>
|
| 920 |
+
</div>
|
| 921 |
+
</div>
|
| 922 |
+
<div class="flow-diagram" style="padding-top:0;">
|
| 923 |
+
<div class="flow-arrow" style="padding:0 8px 0 60px;">↓</div>
|
| 924 |
+
</div>
|
| 925 |
+
<div class="flow-diagram" style="margin-top:-16px;">
|
| 926 |
+
<div class="flow-step">
|
| 927 |
+
<div class="flow-node" style="border-color:var(--teal-dim);">
|
| 928 |
+
<div class="flow-num" style="color:var(--teal);">06</div>
|
| 929 |
+
<div class="flow-name">Status + Trace + Artifacts</div>
|
| 930 |
+
<div class="flow-system">Runtime meldet zurück</div>
|
| 931 |
+
</div>
|
| 932 |
+
</div>
|
| 933 |
+
<div class="flow-arrow">-→</div>
|
| 934 |
+
<div class="flow-step">
|
| 935 |
+
<div class="flow-node" style="border-color:var(--teal-dim);">
|
| 936 |
+
<div class="flow-num" style="color:var(--teal);">07</div>
|
| 937 |
+
<div class="flow-name">Event + Artifact Layer</div>
|
| 938 |
+
<div class="flow-system">Spine schreibt</div>
|
| 939 |
+
</div>
|
| 940 |
+
</div>
|
| 941 |
+
<div class="flow-arrow">-→</div>
|
| 942 |
+
<div class="flow-step">
|
| 943 |
+
<div class="flow-node" style="border-color:var(--plum-dim);">
|
| 944 |
+
<div class="flow-num" style="color:var(--plum);">08</div>
|
| 945 |
+
<div class="flow-name">Live-Zustand</div>
|
| 946 |
+
<div class="flow-system">AgentIDE liest</div>
|
| 947 |
+
</div>
|
| 948 |
+
</div>
|
| 949 |
+
<div class="flow-arrow">-→</div>
|
| 950 |
+
<div class="flow-step">
|
| 951 |
+
<div class="flow-node" style="border-color:var(--amber-dim);">
|
| 952 |
+
<div class="flow-num" style="color:var(--amber);">09</div>
|
| 953 |
+
<div class="flow-name">Vollständige Historie</div>
|
| 954 |
+
<div class="flow-system">MetaMetaMeta</div>
|
| 955 |
+
</div>
|
| 956 |
+
</div>
|
| 957 |
+
<div class="flow-arrow">-→</div>
|
| 958 |
+
<div class="flow-step">
|
| 959 |
+
<div class="flow-node" style="border-color:var(--rose-dim);">
|
| 960 |
+
<div class="flow-num" style="color:var(--rose);">10</div>
|
| 961 |
+
<div class="flow-name">Snapshot + Feed</div>
|
| 962 |
+
<div class="flow-system">HarnessEcosystem</div>
|
| 963 |
+
</div>
|
| 964 |
+
</div>
|
| 965 |
+
</div>
|
| 966 |
+
</div>
|
| 967 |
+
|
| 968 |
+
<div class="callout anim" style="--i:25">
|
| 969 |
+
<strong>Wichtig:</strong> Spine ist dabei nicht der "Denkende", sondern der "Verbindliche". Er validiert, referenziert und schreibt — entscheidet aber nicht selbst.
|
| 970 |
+
</div>
|
| 971 |
+
|
| 972 |
+
<!-- ===== S07: MANDATORY SPECS ===== -->
|
| 973 |
+
<div id="s07" class="sec-head anim" style="--i:26"><span class="sec-num">07</span> Pflicht-Spezifikationen</div>
|
| 974 |
+
|
| 975 |
+
<p class="lead anim" style="--i:27">
|
| 976 |
+
8 Spezifikationen, die jedes Spine-konforme System zwingend erfüllen muss. Keine Ausnahmen, keine Kompromisse.
|
| 977 |
+
</p>
|
| 978 |
+
|
| 979 |
+
<div class="spec-grid anim" style="--i:28">
|
| 980 |
+
|
| 981 |
+
<div class="spec-card" style="border-left: 4px solid var(--navy);">
|
| 982 |
+
<div class="spec-num" style="color:var(--navy);">1 — ID- und Referenzmodell</div>
|
| 983 |
+
<div class="spec-title">Globale, stabile IDs</div>
|
| 984 |
+
<div class="spec-desc">Alle Hauptobjekte brauchen globale, stabile IDs. Jedes Objekt referenziert nur über IDs, nie über freie Dateipfade oder implizite Dateinamen.</div>
|
| 985 |
+
<div class="ve-card ve-card--recessed" style="padding:14px 18px;">
|
| 986 |
+
<div class="card-label" style="margin-bottom:8px;"><span class="dot" style="background:var(--navy);"></span> Pflicht-IDs</div>
|
| 987 |
+
<span class="mono">task_id</span> <span class="mono">run_id</span> <span class="mono">decision_id</span> <span class="mono">execution_id</span> <span class="mono">artifact_id</span> <span class="mono">eval_id</span>
|
| 988 |
+
</div>
|
| 989 |
+
</div>
|
| 990 |
+
|
| 991 |
+
<div class="spec-card" style="border-left: 4px solid var(--gold);">
|
| 992 |
+
<div class="spec-num" style="color:var(--gold);">2 — Zustandsmodell</div>
|
| 993 |
+
<div class="spec-title">Endliche State-Machine</div>
|
| 994 |
+
<div class="spec-desc">Run braucht eine endliche, harte State-Machine. Kein System darf Zustände frei erfinden.</div>
|
| 995 |
+
<div class="state-machine" style="margin:12px 0 0;">
|
| 996 |
+
<div class="state-box"><div class="state-name">created</div><div class="state-label">initial</div></div>
|
| 997 |
+
<div class="state-arrow">→</div>
|
| 998 |
+
<div class="state-box"><div class="state-name">decided</div></div>
|
| 999 |
+
<div class="state-arrow">→</div>
|
| 1000 |
+
<div class="state-box"><div class="state-name">ready</div></div>
|
| 1001 |
+
<div class="state-arrow">→</div>
|
| 1002 |
+
<div class="state-box"><div class="state-name">dispatched</div></div>
|
| 1003 |
+
<div class="state-arrow">→</div>
|
| 1004 |
+
<div class="state-box"><div class="state-name">running</div></div>
|
| 1005 |
+
<div class="state-arrow">→</div>
|
| 1006 |
+
<div class="state-box" style="border-color:var(--sage-dim);"><div class="state-name">completed</div><div class="state-label">success</div></div>
|
| 1007 |
+
<div class="state-box" style="border-color:var(--rose-dim);"><div class="state-name">failed</div></div>
|
| 1008 |
+
<div class="state-box" style="border-color:var(--amber-dim);"><div class="state-name">aborted</div></div>
|
| 1009 |
+
</div>
|
| 1010 |
+
<div style="text-align:center; margin-top:8px;">
|
| 1011 |
+
<span class="state-terminal" style="background:var(--sage-dim); color:var(--sage);">evaluated</span>
|
| 1012 |
+
<span style="font-family:var(--font-mono);font-size:10px;color:var(--text-dim);margin:0 8px;"> als Endzustand</span>
|
| 1013 |
+
</div>
|
| 1014 |
+
</div>
|
| 1015 |
+
|
| 1016 |
+
<div class="spec-card" style="border-left: 4px solid var(--teal);">
|
| 1017 |
+
<div class="spec-num" style="color:var(--teal);">3 — Schema-Versionierung</div>
|
| 1018 |
+
<div class="spec-title">Versionierte Objekte</div>
|
| 1019 |
+
<div class="spec-desc">Jedes Spine-Objekt braucht schema_name und schema_version. Adapter dürfen alte lokale Formate einlesen, aber Spine intern nur versionierte kanonische Formen führen.</div>
|
| 1020 |
+
<div class="ve-card ve-card--recessed" style="padding:14px 18px; margin-top:8px;">
|
| 1021 |
+
<div class="card-label" style="margin-bottom:8px;"><span class="dot" style="background:var(--teal);"></span> Pflichtfelder</div>
|
| 1022 |
+
<span class="mono">schema_name</span> <span class="mono">schema_version</span>
|
| 1023 |
+
</div>
|
| 1024 |
+
</div>
|
| 1025 |
+
|
| 1026 |
+
<div class="spec-card" style="border-left: 4px solid var(--sage);">
|
| 1027 |
+
<div class="spec-num" style="color:var(--sage);">4 — Provenienz</div>
|
| 1028 |
+
<div class="spec-title">Rückverfolgbarkeit</div>
|
| 1029 |
+
<div class="spec-desc">Jedes Objekt muss auf Quelle, Version, Zeit und Ursprungssystem rückführbar sein.</div>
|
| 1030 |
+
<div class="ve-card ve-card--recessed" style="padding:14px 18px; margin-top:8px;">
|
| 1031 |
+
<div class="card-label" style="margin-bottom:8px;"><span class="dot" style="background:var(--sage);"></span> Pflichtfelder</div>
|
| 1032 |
+
<span class="mono">source_system</span> <span class="mono">source_ref</span> <span class="mono">created_at</span> <span class="mono">created_by</span> <span class="mono">derived_from</span> <span style="font-size:11px;color:var(--text-dim);">(optional)</span>
|
| 1033 |
+
</div>
|
| 1034 |
+
</div>
|
| 1035 |
+
|
| 1036 |
+
<div class="spec-card" style="border-left: 4px solid var(--plum);">
|
| 1037 |
+
<div class="spec-num" style="color:var(--plum);">5 — Capability-Spezifikation</div>
|
| 1038 |
+
<div class="spec-title">Maschinenlesbare Fähigkeiten</div>
|
| 1039 |
+
<div class="spec-desc">Jeder Harness/Agent braucht maschinenlesbar: id, kind, status, accepts, emits, constraints, runtime_target, cost_class, trust_level. Das ist die Voraussetzung für echtes Routing.</div>
|
| 1040 |
+
</div>
|
| 1041 |
+
|
| 1042 |
+
<div class="spec-card" style="border-left: 4px solid var(--rose);">
|
| 1043 |
+
<div class="spec-num" style="color:var(--rose);">6 — Artifact-Spezifikation</div>
|
| 1044 |
+
<div class="spec-title">Inhaltlich typisierte Artifacts</div>
|
| 1045 |
+
<div class="spec-desc">Artifacts müssen inhaltlich typisiert sein. Dies ermöglicht korrekte Weiterverarbeitung und Bewertung.</div>
|
| 1046 |
+
<div class="ve-card ve-card--recessed" style="padding:14px 18px; margin-top:8px;">
|
| 1047 |
+
<div class="card-label" style="margin-bottom:8px;"><span class="dot" style="background:var(--rose);"></span> Minimaltypen</div>
|
| 1048 |
+
<span class="mono">decision</span> <span class="mono">execution_input</span> <span class="mono">trace</span> <span class="mono">log</span> <span class="mono">report</span> <span class="mono">tasksheet</span> <span class="mono">eval</span> <span class="mono">workspace_snapshot</span> <span class="mono">patch_ref</span> <span class="mono">deploy_result</span>
|
| 1049 |
+
</div>
|
| 1050 |
+
</div>
|
| 1051 |
+
|
| 1052 |
+
<div class="spec-card" style="border-left: 4px solid var(--amber);">
|
| 1053 |
+
<div class="spec-num" style="color:var(--amber);">7 — Fehler- und Abbruchmodell</div>
|
| 1054 |
+
<div class="spec-title">Failure first-class</div>
|
| 1055 |
+
<div class="spec-desc">Spine muss Failure first-class behandeln. Ein fehlgeschlagener Run ist genauso sauber modelliert wie ein erfolgreicher.</div>
|
| 1056 |
+
<div style="display:flex; flex-wrap:wrap; gap:6px; margin-top:8px;">
|
| 1057 |
+
<span class="badge badge--rose">validation_error</span>
|
| 1058 |
+
<span class="badge badge--rose">dispatch_error</span>
|
| 1059 |
+
<span class="badge badge--rose">runtime_error</span>
|
| 1060 |
+
<span class="badge badge--amber">timeout</span>
|
| 1061 |
+
<span class="badge badge--amber">contract_mismatch</span>
|
| 1062 |
+
<span class="badge badge--gold">missing_capability</span>
|
| 1063 |
+
<span class="badge badge--gold">approval_blocked</span>
|
| 1064 |
+
<span class="badge badge--navy">unknown_failure</span>
|
| 1065 |
+
</div>
|
| 1066 |
+
</div>
|
| 1067 |
+
|
| 1068 |
+
<div class="spec-card" style="border-left: 4px solid var(--navy);">
|
| 1069 |
+
<div class="spec-num" style="color:var(--navy);">8 — Read/Write-Verantwortung</div>
|
| 1070 |
+
<div class="spec-title">Klare Ownership</div>
|
| 1071 |
+
<div class="spec-desc">Jedes System hat genau definierte Schreibrechte. Kein System darf Daten modifizieren, für die es nicht zuständig ist.</div>
|
| 1072 |
+
<table class="data-table" style="margin-top:10px; font-size:12px;">
|
| 1073 |
+
<thead>
|
| 1074 |
+
<tr><th>System</th><th>Darf schreiben</th></tr>
|
| 1075 |
+
</thead>
|
| 1076 |
+
<tbody>
|
| 1077 |
+
<tr><td class="mono" style="color:var(--gold);">KomandoZentral</td><td class="mono">RoutingDecision</td></tr>
|
| 1078 |
+
<tr><td class="mono" style="color:var(--sage);">UEBER_AGENT</td><td class="mono">ExecutionStatus, RouteTrace, ArtifactManifest</td></tr>
|
| 1079 |
+
<tr><td class="mono" style="color:var(--amber);">MetaMetaMeta</td><td class="mono">EvalRecord, Derived Insights</td></tr>
|
| 1080 |
+
<tr><td class="mono" style="color:var(--rose);">HarnessEcosystem</td><td class="mono">liest primär</td></tr>
|
| 1081 |
+
<tr><td class="mono" style="color:var(--plum);">AgentIDE</td><td class="mono">liest primär, erzeugt TaskRequest</td></tr>
|
| 1082 |
+
</tbody>
|
| 1083 |
+
</table>
|
| 1084 |
+
</div>
|
| 1085 |
+
|
| 1086 |
+
</div>
|
| 1087 |
+
|
| 1088 |
+
<!-- ===== S08: PUBLIC INTERFACES ===== -->
|
| 1089 |
+
<div id="s08" class="sec-head anim" style="--i:29"><span class="sec-num">08</span> Öffentliche Interfaces</div>
|
| 1090 |
+
|
| 1091 |
+
<p class="lead anim" style="--i:30">
|
| 1092 |
+
4 API-Gruppen definieren die vollständige Schnittstelle zu Spine. Alles, was ein System von Spine braucht, ist hier.
|
| 1093 |
+
</p>
|
| 1094 |
+
|
| 1095 |
+
<div class="api-grid anim" style="--i:31">
|
| 1096 |
+
|
| 1097 |
+
<div class="api-card" style="border-top: 3px solid var(--navy);">
|
| 1098 |
+
<div class="api-name">System Registry API</div>
|
| 1099 |
+
<div class="api-type">Reads only</div>
|
| 1100 |
+
<ul class="api-methods">
|
| 1101 |
+
<li><span class="method-badge method-read">R</span> list_harnesses()</li>
|
| 1102 |
+
<li><span class="method-badge method-read">R</span> list_agents()</li>
|
| 1103 |
+
<li><span class="method-badge method-read">R</span> get_capability(id)</li>
|
| 1104 |
+
<li><span class="method-badge method-read">R</span> get_runtime_targets()</li>
|
| 1105 |
+
<li><span class="method-badge method-read">R</span> get_schema_versions()</li>
|
| 1106 |
+
</ul>
|
| 1107 |
+
</div>
|
| 1108 |
+
|
| 1109 |
+
<div class="api-card" style="border-top: 3px solid var(--gold);">
|
| 1110 |
+
<div class="api-name">Run API</div>
|
| 1111 |
+
<div class="api-type">Reads + Writes</div>
|
| 1112 |
+
<ul class="api-methods">
|
| 1113 |
+
<li><span class="method-badge method-write">W</span> create_task(task_request)</li>
|
| 1114 |
+
<li><span class="method-badge method-write">W</span> attach_decision(routing_decision)</li>
|
| 1115 |
+
<li><span class="method-badge method-write">W</span> create_execution(execution_request)</li>
|
| 1116 |
+
<li><span class="method-badge method-write">W</span> append_event(event)</li>
|
| 1117 |
+
<li><span class="method-badge method-write">W</span> register_artifact(artifact_manifest)</li>
|
| 1118 |
+
<li><span class="method-badge method-write">W</span> close_run(run_id)</li>
|
| 1119 |
+
</ul>
|
| 1120 |
+
</div>
|
| 1121 |
+
|
| 1122 |
+
<div class="api-card" style="border-top: 3px solid var(--teal);">
|
| 1123 |
+
<div class="api-name">Query API</div>
|
| 1124 |
+
<div class="api-type">Reads only</div>
|
| 1125 |
+
<ul class="api-methods">
|
| 1126 |
+
<li><span class="method-badge method-read">R</span> get_run(run_id)</li>
|
| 1127 |
+
<li><span class="method-badge method-read">R</span> get_run_events(run_id)</li>
|
| 1128 |
+
<li><span class="method-badge method-read">R</span> get_run_artifacts(run_id)</li>
|
| 1129 |
+
<li><span class="method-badge method-read">R</span> get_decision(decision_id)</li>
|
| 1130 |
+
<li><span class="method-badge method-read">R</span> get_task(task_id)</li>
|
| 1131 |
+
<li><span class="method-badge method-read">R</span> get_eval_records(run_id)</li>
|
| 1132 |
+
<li><span class="method-badge method-read">R</span> query_runs(filters)</li>
|
| 1133 |
+
</ul>
|
| 1134 |
+
</div>
|
| 1135 |
+
|
| 1136 |
+
<div class="api-card" style="border-top: 3px solid var(--sage);">
|
| 1137 |
+
<div class="api-name">Feed API</div>
|
| 1138 |
+
<div class="api-type">Reads only</div>
|
| 1139 |
+
<ul class="api-methods">
|
| 1140 |
+
<li><span class="method-badge method-read">R</span> get_ecosystem_snapshot()</li>
|
| 1141 |
+
<li><span class="method-badge method-read">R</span> get_runtime_health()</li>
|
| 1142 |
+
<li><span class="method-badge method-read">R</span> get_eval_summary()</li>
|
| 1143 |
+
<li><span class="method-badge method-read">R</span> get_registry_snapshot()</li>
|
| 1144 |
+
</ul>
|
| 1145 |
+
</div>
|
| 1146 |
+
|
| 1147 |
+
</div>
|
| 1148 |
+
|
| 1149 |
+
<!-- ===== S09: V1 DEFAULTS ===== -->
|
| 1150 |
+
<div id="s09" class="sec-head anim" style="--i:32"><span class="sec-num">09</span> V1 Defaults</div>
|
| 1151 |
+
|
| 1152 |
+
<p class="lead anim" style="--i:33">
|
| 1153 |
+
Für die erste Spezifikation gelten diese konkreten Defaults. Sie definieren den minimalen Umfang von V1.
|
| 1154 |
+
</p>
|
| 1155 |
+
|
| 1156 |
+
<div class="ve-card anim" style="--i:34; border-left: 4px solid var(--navy);">
|
| 1157 |
+
<div class="card-label"><span class="dot" style="background:var(--navy);"></span> Persistenzmodell</div>
|
| 1158 |
+
<table class="data-table">
|
| 1159 |
+
<thead>
|
| 1160 |
+
<tr><th>Eigenschaft</th><th>Default</th><th>Bemerkung</th></tr>
|
| 1161 |
+
</thead>
|
| 1162 |
+
<tbody>
|
| 1163 |
+
<tr><td class="mono">Deploy</td><td>lokal-first</td><td>Kein Cloud-Zwang in V1</td></tr>
|
| 1164 |
+
<tr><td class="mono">Datenmodell</td><td>event-log + registry + artifact-index</td><td>Einfach, nicht relational</td></tr>
|
| 1165 |
+
<tr><td class="mono">Serialisierung</td><td>JSON oder YAML</td><td>DB darf später folgen</td></tr>
|
| 1166 |
+
<tr><td class="mono">Events</td><td>append-only</td><td>Unverlierbar</td></tr>
|
| 1167 |
+
<tr><td class="mono">Registry/Schemas</td><td>versioniert</td><td> schema_version Pflicht</td></tr>
|
| 1168 |
+
<tr><td class="mono">Runtime</td><td>auerhalb von Spine</td><td>Spine ist nicht die Runtime</td></tr>
|
| 1169 |
+
<tr><td class="mono">UI</td><td>auerhalb von Spine</td><td>Spine ist kein UI</td></tr>
|
| 1170 |
+
<tr><td class="mono">Eval-Interpretation</td><td>auerhalb von Spine</td><td>Spine liefert Daten, nicht Deutung</td></tr>
|
| 1171 |
+
<tr><td class="mono">Spine-Funktion</td><td>Validierung + Referenzierung + Rekonstruktion</td><td></td></tr>
|
| 1172 |
+
</tbody>
|
| 1173 |
+
</table>
|
| 1174 |
+
</div>
|
| 1175 |
+
|
| 1176 |
+
<!-- ===== S10: TEST SCENARIOS ===== -->
|
| 1177 |
+
<div id="s10" class="sec-head anim" style="--i:35"><span class="sec-num">10</span> Test-Szenarien</div>
|
| 1178 |
+
|
| 1179 |
+
<p class="lead anim" style="--i:36">
|
| 1180 |
+
Ein Spine-Design ist nur dann gut, wenn alle 8 Szenarien vollständig möglich sind.
|
| 1181 |
+
</p>
|
| 1182 |
+
|
| 1183 |
+
<div class="test-grid anim" style="--i:37">
|
| 1184 |
+
|
| 1185 |
+
<div class="test-card" style="border-top: 3px solid var(--navy);">
|
| 1186 |
+
<div class="test-num" style="color:var(--navy);">Test 1</div>
|
| 1187 |
+
<div class="test-title">Vollständige Rekonstruktion</div>
|
| 1188 |
+
<div class="test-desc">Ein Task wird erzeugt, geroutet, ausgeführt und evaluiert, und jede Station ist rekonstruierbar.</div>
|
| 1189 |
+
</div>
|
| 1190 |
+
|
| 1191 |
+
<div class="test-card" style="border-top: 3px solid var(--gold);">
|
| 1192 |
+
<div class="test-num" style="color:var(--gold);">Test 2</div>
|
| 1193 |
+
<div class="test-title">Entkoppeltes Routing</div>
|
| 1194 |
+
<div class="test-desc">KomandoZentral kann eine Entscheidung ausgeben, ohne die Runtime zu kennen, aber Spine kann trotzdem validieren, ob das Ziel existiert.</div>
|
| 1195 |
+
</div>
|
| 1196 |
+
|
| 1197 |
+
<div class="test-card" style="border-top: 3px solid var(--teal);">
|
| 1198 |
+
<div class="test-num" style="color:var(--teal);">Test 3</div>
|
| 1199 |
+
<div class="test-title">Entkoppelte Ausführung</div>
|
| 1200 |
+
<div class="test-desc">UEBER_AGENT kann Laufstatus und Trace zurückmelden, ohne UI-spezifische Semantik zu brauchen.</div>
|
| 1201 |
+
</div>
|
| 1202 |
+
|
| 1203 |
+
<div class="test-card" style="border-top: 3px solid var(--plum);">
|
| 1204 |
+
<div class="test-num" style="color:var(--plum);">Test 4</div>
|
| 1205 |
+
<div class="test-title">Live-Darstellung</div>
|
| 1206 |
+
<div class="test-desc">AgentIDE kann einen kompletten Run live darstellen, nur aus Spine-Zustand und Events.</div>
|
| 1207 |
+
</div>
|
| 1208 |
+
|
| 1209 |
+
<div class="test-card" style="border-top: 3px solid var(--rose);">
|
| 1210 |
+
<div class="test-num" style="color:var(--rose);">Test 5</div>
|
| 1211 |
+
<div class="test-title">Automatischer Feed</div>
|
| 1212 |
+
<div class="test-desc">HarnessEcosystem kann aus Spine einen statischen Snapshot oder Feed bauen, ohne Handpflege.</div>
|
| 1213 |
+
</div>
|
| 1214 |
+
|
| 1215 |
+
<div class="test-card" style="border-top: 3px solid var(--amber);">
|
| 1216 |
+
<div class="test-num" style="color:var(--amber);">Test 6</div>
|
| 1217 |
+
<div class="test-title">Vollständige Eval-Daten</div>
|
| 1218 |
+
<div class="test-desc">MetaMetaMeta kann aus Spine vollständige Eval-Datensätze ziehen, ohne Ad-hoc-Pfadwissen.</div>
|
| 1219 |
+
</div>
|
| 1220 |
+
|
| 1221 |
+
<div class="test-card" style="border-top: 3px solid var(--sage);">
|
| 1222 |
+
<div class="test-num" style="color:var(--sage);">Test 7</div>
|
| 1223 |
+
<div class="test-title">Saubere Fehlermodellierung</div>
|
| 1224 |
+
<div class="test-desc">Ein fehlgeschlagener Run ist genauso sauber modelliert wie ein erfolgreicher.</div>
|
| 1225 |
+
</div>
|
| 1226 |
+
|
| 1227 |
+
<div class="test-card" style="border-top: 3px solid var(--navy);">
|
| 1228 |
+
<div class="test-num" style="color:var(--navy);">Test 8</div>
|
| 1229 |
+
<div class="test-title">Erweiterbarkeit</div>
|
| 1230 |
+
<div class="test-desc">Neue Harnesses oder neue Agenttypen lassen sich über Registry + Capability ergänzen, ohne Kernobjekte neu zu erfinden.</div>
|
| 1231 |
+
</div>
|
| 1232 |
+
|
| 1233 |
+
</div>
|
| 1234 |
+
|
| 1235 |
+
<!-- ===== S11: ASSUMPTIONS ===== -->
|
| 1236 |
+
<div id="s11" class="sec-head anim" style="--i:38"><span class="sec-num">11</span> Explizite Annahmen</div>
|
| 1237 |
+
|
| 1238 |
+
<p class="lead anim" style="--i:39">
|
| 1239 |
+
Diese Annahmen sind die Grundlage des Spine-Designs. Änderungen an diesen Annahmen erfordern ein Redesign.
|
| 1240 |
+
</p>
|
| 1241 |
+
|
| 1242 |
+
<ul class="assume-list anim" style="--i:40">
|
| 1243 |
+
<li>Spine ist eine Integrationsspezifikation und Integrationsschicht, kein neues monolithisches "Superprojekt".</li>
|
| 1244 |
+
<li>KomandoZentral bleibt Decision Engine — Decisions werden nicht von Spine übernommen.</li>
|
| 1245 |
+
<li>UEBER_AGENT bleibt Execution Engine — Ausführung passiert nicht in Spine.</li>
|
| 1246 |
+
<li>MetaMetaMeta bleibt Evidence Layer — Eval-Interpretation passiert nicht in Spine.</li>
|
| 1247 |
+
<li>AgentIDE bleibt Operator Frontend — UI bleibt außerhalb von Spine.</li>
|
| 1248 |
+
<li>HarnessEcosystem bleibt Präsentations- und Lernlayer — Präsentation passiert nicht in Spine.</li>
|
| 1249 |
+
<li>Der wichtigste technische Engpass ist nicht fehlende Intelligenz, sondern fehlender gemeinsamer Vertrag.</li>
|
| 1250 |
+
</ul>
|
| 1251 |
+
|
| 1252 |
+
<!-- ===== S12: FORMULA ===== -->
|
| 1253 |
+
<div id="s12" class="sec-head anim" style="--i:41"><span class="sec-num">12</span> Die Kurzformel</div>
|
| 1254 |
+
|
| 1255 |
+
<div class="ve-card ve-card--hero anim" style="--i:42; text-align:center; padding:40px;">
|
| 1256 |
+
<div style="font-family:var(--font-display); font-size:22px; color:var(--text); margin-bottom:16px; line-height:1.4;">
|
| 1257 |
+
Die theoretische Essenz von Spine ist:
|
| 1258 |
+
</div>
|
| 1259 |
+
<div style="font-family:var(--font-mono); font-size:16px; background:var(--navy-dim); border:2px solid var(--navy); border-radius:14px; padding:20px 32px; color:var(--navy); display:inline-block; letter-spacing:0.5px;">
|
| 1260 |
+
<span style="font-weight:700; color:var(--gold);">Spine</span> = Registry + Schemas + Run-State + Event-Log + Artifact-Index + Adapter-Verträge
|
| 1261 |
+
</div>
|
| 1262 |
+
<div style="margin-top:20px; font-size:15px; color:var(--text-dim); max-width:560px; margin-left:auto; margin-right:auto; line-height:1.6;">
|
| 1263 |
+
Wenn das sauber spezifiziert ist, werden deine Projekte nicht mehr nur "verbunden gedacht", sondern wirklich als ein konsistentes System betreibbar.
|
| 1264 |
+
</div>
|
| 1265 |
+
</div>
|
| 1266 |
+
|
| 1267 |
+
</div><!-- /main -->
|
| 1268 |
+
</div><!-- /wrap -->
|
| 1269 |
+
|
| 1270 |
+
<script>
|
| 1271 |
+
(function() {
|
| 1272 |
+
const toc = document.getElementById('toc');
|
| 1273 |
+
const links = toc.querySelectorAll('a');
|
| 1274 |
+
const sections = [];
|
| 1275 |
+
links.forEach(link => {
|
| 1276 |
+
const id = link.getAttribute('href').slice(1);
|
| 1277 |
+
const el = document.getElementById(id);
|
| 1278 |
+
if (el) sections.push({ id, el, link });
|
| 1279 |
+
});
|
| 1280 |
+
const observer = new IntersectionObserver(entries => {
|
| 1281 |
+
entries.forEach(entry => {
|
| 1282 |
+
if (entry.isIntersecting) {
|
| 1283 |
+
links.forEach(l => l.classList.remove('active'));
|
| 1284 |
+
const match = sections.find(s => s.el === entry.target);
|
| 1285 |
+
if (match) {
|
| 1286 |
+
match.link.classList.add('active');
|
| 1287 |
+
if (window.innerWidth <= 1100) {
|
| 1288 |
+
match.link.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
|
| 1289 |
+
}
|
| 1290 |
+
}
|
| 1291 |
+
}
|
| 1292 |
+
});
|
| 1293 |
+
}, { rootMargin: '-10% 0px -80% 0px' });
|
| 1294 |
+
sections.forEach(s => observer.observe(s.el));
|
| 1295 |
+
links.forEach(link => {
|
| 1296 |
+
link.addEventListener('click', e => {
|
| 1297 |
+
e.preventDefault();
|
| 1298 |
+
const id = link.getAttribute('href').slice(1);
|
| 1299 |
+
const el = document.getElementById(id);
|
| 1300 |
+
if (el) {
|
| 1301 |
+
el.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
| 1302 |
+
history.replaceState(null, '', '#' + id);
|
| 1303 |
+
}
|
| 1304 |
+
});
|
| 1305 |
+
});
|
| 1306 |
+
})();
|
| 1307 |
+
</script>
|
| 1308 |
+
|
| 1309 |
+
</body>
|
| 1310 |
+
</html>
|
V0.5_KZ_Road_to_Von_NEUMANN-Agent-System/Kritik_GPT
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
• Ja, als V0.5 kann das funktionieren.
|
| 3 |
+
Nein, nicht sauber in der Form, wie der Plan es behauptet.
|
| 4 |
+
|
| 5 |
+
Die Idee ist gut: KomandoZentral entscheiden lassen, Sidecar-NG spiegeln lassen, Outcomes zurückführen. Aber beim aktuellen Code gibt es ein paar harte Schwachstellen.
|
| 6 |
+
|
| 7 |
+
1. Der latest-decision.json-Kanal ist global und nicht task- oder sessiongebunden.
|
| 8 |
+
Das ist der größte Designfehler. Ein einzelnes ~/.cache/kz/latest-decision.json wird von jedem neuen kz-Run überschrieben. Sidecar-NG kennt aber Session-ID und Prompt,
|
| 9 |
+
nicht “welche KZ-Entscheidung zu genau diesem Prompt gehört”. Ergebnis: Du kannst sehr leicht die falsche Decision in die falsche Claude-Session injizieren. Das ist
|
| 10 |
+
besonders gefährlich, weil es plausibel aussieht und dadurch Vertrauen zerstört. Siehe /home/smlflg/Projekte/KomandoZentral/src/kz/service.py und /home/smlflg/Projekte/
|
| 11 |
+
Sidecar-ng/hook_inject.py.
|
| 12 |
+
2. Der geplante Sidecar-Hook-Punkt ist semantisch nicht der richtige.
|
| 13 |
+
In hook_inject.py wird _load_knowledge() nur benutzt, um den Klassifizierungs-LLM-Call zu füttern, nicht um direkt additionalContext an Claude auszugeben. Wenn du dort
|
| 14 |
+
KZ-Text “vor den Knowledge-Block” hängst, beeinflusst das erstmal nur die Regelklassifikation. Das ist nicht dasselbe wie die behauptete direkte Injection [KZ-
|
| 15 |
+
ROUTING] .... Dazu kommt: viele Pfade returnen vorher schon bei Mode/Skill/Guardrail-Matches. In genau diesen Fällen würde dein KZ-Kontext gar nicht greifen. Siehe /
|
| 16 |
+
home/smlflg/Projekte/Sidecar-ng/hook_inject.py.
|
| 17 |
+
3. Der Outcome-Loop über YAML-Scanning ist brauchbar, aber kein sauberer Outcome Store.
|
| 18 |
+
update_outcome() schreibt heute in die gespeicherte YAML unter DECISIONS/, relativ zum aktuellen Arbeitsverzeichnis. Das heißt:
|
| 19 |
+
- nur gespeicherte Decisions zählen
|
| 20 |
+
- der Feedback-Loop hängt am cwd
|
| 21 |
+
- programmatic routes ohne --save sind für Outcomes unsichtbar
|
| 22 |
+
- Historie wird über verteilte YAML-Dateien rekonstruiert statt aus einer echten zentralen Wahrheit
|
| 23 |
+
Das kann als Hack laufen, aber es ist fragiler als der Plan zugibt. Siehe /home/smlflg/Projekte/KomandoZentral/src/kz/persist.py.
|
| 24 |
+
4. Das kz outcome-Subcommand ist nicht nur “20 LOC”.
|
| 25 |
+
Die CLI ist aktuell kein Subcommand-CLI, sondern ein einfacher Parser mit freier task-Positional-Argumentliste. Ein echtes outcome-Subcommand bedeutet Parser-Struktur
|
| 26 |
+
ändern, Help/Dispatch anpassen und bestehende Tests anfassen. Das ist nicht riesig, aber mehr als der Plan suggeriert. Siehe /home/smlflg/Projekte/KomandoZentral/src/kz/
|
| 27 |
+
cli.py.
|
| 28 |
+
5. customization_depth als direkter Confidence-Bonus ist konzeptionell riskant.
|
| 29 |
+
Der aktuelle Confidence-Stack hat schon Baseline, Operator-State und Evidence-Caps. Ein fixer Bonus wie Claude +4, Aider -4 kann reale Outcome-Daten überstimmen und
|
| 30 |
+
zementiert Vorlieben statt sie zu messen. Das ist eher ein Prior oder Tiebreaker als ein “objektiver” Confidence-Faktor. Sonst baust du dir einen self-fulfilling loop.
|
| 31 |
+
Siehe /home/smlflg/Projekte/KomandoZentral/src/kz/confidence.py und /home/smlflg/Projekte/KomandoZentral/src/kz/registry.py.
|
| 32 |
+
6. Die Sidecar-Integration wird testbar sein, aber nicht ganz so billig wie behauptet.
|
| 33 |
+
Sidecar-ng hat viele dateibasierte, zustandsbehaftete Tests. Drei neue reine Reader-Tests sind machbar, aber sobald die Injection-Priorität korrekt gelöst werden soll,
|
| 34 |
+
landet man schnell in mehr Integrationslogik als nur _load_kz_decision(). Die Testbasis ist da, aber der Hook ist schon komplex. Siehe /home/smlflg/Projekte/Sidecar-ng/
|
| 35 |
+
tests.
|
| 36 |
+
|
| 37 |
+
Mein Urteil
|
| 38 |
+
|
| 39 |
+
- Die Richtung stimmt.
|
| 40 |
+
- Die kleinste funktionierende Version ist möglich.
|
| 41 |
+
- Der Plan ist aber an zwei Stellen zu optimistisch: Kommunikationskanal und Hook-Integrationspunkt.
|
| 42 |
+
|
| 43 |
+
So würde ich ihn härter schneiden, damit er wirklich funktioniert
|
| 44 |
+
|
| 45 |
+
- Nicht latest-decision.json, sondern mindestens decision-by-fingerprint.json oder decision-by-session.json plus latest als Fallback.
|
| 46 |
+
- Nicht KZ-Text in den Knowledge-Block mischen, sondern als eigene zusätzliche Injection komponieren.
|
| 47 |
+
- Outcome-Feedback zunächst klein halten: nur gespeicherte Decisions zählen und das explizit dokumentieren.
|
| 48 |
+
- customization_depth höchstens als kleiner Tiebreaker von -2..+2, nicht als starker Confidence-Faktor.
|
| 49 |
+
|
| 50 |
+
Kurzfassung
|
| 51 |
+
Wenn du den Plan unverändert umsetzt, läuft er vermutlich technisch, aber semantisch oft falsch.
|
| 52 |
+
Wenn du Session-/Task-Zuordnung + echten Injection-Punkt korrigierst, dann ist das ein sehr brauchbarer Minimal-Glue-V1.
|
| 53 |
+
|
| 54 |
+
Wenn du willst, zerlege ich dir den bestehenden Plan jetzt in:
|
| 55 |
+
|
| 56 |
+
1. “funktioniert wie geplant”
|
| 57 |
+
2. “muss angepasst werden”
|
| 58 |
+
3. “kann man komplett streichen”
|
V0.5_KZ_Road_to_Von_NEUMANN-Agent-System/Kritik_mini_gemini
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## Meine Kritik (kurz)
|
| 2 |
+
|
| 3 |
+
**Plan ist gut — aber 3 Löcher:**
|
| 4 |
+
|
| 5 |
+
1. **`~/.cache/kz/` existiert vielleicht nicht** — `mkdir -p` fehlt in jedem Step
|
| 6 |
+
2. **`outcome_adjustment()` wird bei 1000+ YAMLs zum Performance-Killer** — braucht einen Index/Cache
|
| 7 |
+
3. **`kz outcome <filename>`** — Du musst den Dateinamen manuell tippen. Das ist umständlich. Warum nicht einfach `kz
|
| 8 |
+
outcome 4` und gut?
|
| 9 |
+
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
## Gemini's Kritik (Zusammenfassung)
|
| 13 |
+
|
| 14 |
+
**5 Schwächen:**
|
| 15 |
+
|
| 16 |
+
1. **Race Conditions** — KZ schreibt JSON, Sidecar liest gleichzeitig. Kein Lock.
|
| 17 |
+
2. **Performance-Engpass** — `outcome_adjustment()` scannt alle YAMLs bei jeder Confidence-Berechnung. Bei 500+ Decisions
|
| 18 |
+
wird das spürbar langsam.
|
| 19 |
+
3. **`ts` von heute = stale** — Wenn ein Task über Mitternacht läuft, wird die Decision ignoriert obwohl sie gültig ist.
|
| 20 |
+
4. **`kz outcome<filename>`** — Umständlich. Sollte heißen: `kz outcome` ohne Argument, nutzt automatisch die letzte
|
| 21 |
+
Decision.
|
| 22 |
+
5. **`customization_depth` ist statisch/manuell** — Wer updated den Wert wenn sich Claude Code Skills ändern? Das wird
|
| 23 |
+
sofort veraltet.
|
| 24 |
+
|
| 25 |
+
**Was übersehen wurde:**
|
| 26 |
+
- Error Handling bei `JSONDecodeError` (Sidecar-NG würde crashen statt graceful zu degradieren)
|
| 27 |
+
- Kein Lifecycle-Management für alte YAMLs (DECISIONS/ wird zum Dump)
|
| 28 |
+
- Container/Remote-Umgebungen = anderer `~/.cache/` Pfad
|
| 29 |
+
|
| 30 |
+
**Ist der Scope realistisch?** Ja — für die Minimal-Version. Aber robust ist anders.
|
| 31 |
+
|
| 32 |
+
---
|
| 33 |
+
|
| 34 |
+
## Die 3 wichtigsten Fixes vor dem Start
|
| 35 |
+
|
| 36 |
+
```
|
| 37 |
+
1. Sidecar-NG: try/except um _load_kz_decision() — bei Fehler einfach weiter ohne KZ-Context
|
| 38 |
+
2. KZ: mkdir -p ~/.cache/kz/ vor dem JSON-Schreiben
|
| 39 |
+
3. KZ: outcome_adjustment() braucht einen einfachen Index-Cache (SQLite oder Pickle)
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
**Das Wichtigste aber:** `kz outcome` ohne Argument wäre ein massiver UX-Gewinn. Willst du das reinnehmen?
|
V0.5_KZ_Road_to_Von_NEUMANN-Agent-System/Plan
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Plan steht. ~160 LOC, ~2 Stunden, 6 Schritte. Kein neues Projekt — nur Erweiterungen an KomandoZentral und Sidecar-NG.
|
| 2 |
+
|
| 3 |
+
Kernpunkte:
|
| 4 |
+
- Customization-Level als neuer Routing-Faktor (Claude Code 95, Aider 10)
|
| 5 |
+
- JSON-Drop (~/.cache/kz/latest-decision.json) als Kommunikationskanal
|
| 6 |
+
- Sidecar liest KZ-Decision und injiziert als [KZ-ROUTING] Context
|
| 7 |
+
- Outcome-Feedback verändert zukünftige Confidence-Scores
|
| 8 |
+
- 7 Tests über beide Projekte
|
| 9 |
+
|
| 10 |
+
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
| 11 |
+
Ready to code?
|
| 12 |
+
|
| 13 |
+
Here is Claude's plan:
|
| 14 |
+
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
|
| 15 |
+
Plan: KomandoZentral + Sidecar-NG Glue
|
| 16 |
+
|
| 17 |
+
Context
|
| 18 |
+
|
| 19 |
+
Samuel hat 6+ Projekte die alle Teile eines Von-Neumann-Agent-Systems sind. Keines ist mit den anderen verbunden. Statt ein neues Meta-Projekt zu
|
| 20 |
+
starten, verbinden wir die zwei funktionalsten Projekte mit minimalem Kleber:
|
| 21 |
+
- KomandoZentral (Task-to-Harness Router, working alpha CLI)
|
| 22 |
+
- Sidecar-NG (Claude Code Hook, daily driver)
|
| 23 |
+
|
| 24 |
+
Ziel: KZ-Entscheidungen fliessen automatisch in Claude Code Sessions. Outcomes fliessen zurueck und verbessern zukuenftige Routing-Entscheidungen.
|
| 25 |
+
|
| 26 |
+
Zusaetzlich: Customization-Level als Routing-Faktor — Claude Code mit 69 Skills + 21 Agents + Sidecar-NG ist fundamental anders als Claude Code
|
| 27 |
+
out-of-the-box. Das muss in die Confidence einfliessen.
|
| 28 |
+
|
| 29 |
+
---
|
| 30 |
+
Architektur
|
| 31 |
+
|
| 32 |
+
kz "fix auth bug" --save
|
| 33 |
+
|
|
| 34 |
+
v
|
| 35 |
+
KZ: classify -> route -> confidence -> YAML + latest-decision.json
|
| 36 |
+
| |
|
| 37 |
+
v v
|
| 38 |
+
DECISIONS/2026-04-08_BUILD_fix-auth.yaml ~/.cache/kz/latest-decision.json
|
| 39 |
+
|
|
| 40 |
+
v
|
| 41 |
+
Sidecar-NG hook_inject.py
|
| 42 |
+
liest JSON, injiziert als additionalContext:
|
| 43 |
+
"[KZ-ROUTING] Harness: Claude Code (87%) | Why: ..."
|
| 44 |
+
|
|
| 45 |
+
v
|
| 46 |
+
Claude Code Session mit KZ-Kontext
|
| 47 |
+
|
|
| 48 |
+
v
|
| 49 |
+
kz outcome <filename> 4 "hat funktioniert"
|
| 50 |
+
|
|
| 51 |
+
v
|
| 52 |
+
outcome_adjustment() in confidence.py
|
| 53 |
+
beeinflusst zukuenftige Confidence-Scores
|
| 54 |
+
|
| 55 |
+
---
|
| 56 |
+
Aenderungen
|
| 57 |
+
|
| 58 |
+
1. KZ: write_latest_decision() (~20 LOC)
|
| 59 |
+
|
| 60 |
+
Datei: /home/smlflg/Projekte/KomandoZentral/src/kz/persist.py
|
| 61 |
+
- Neue Funktion nach save_decision() (nach Zeile 57)
|
| 62 |
+
- Schreibt kompaktes JSON nach ~/.cache/kz/latest-decision.json
|
| 63 |
+
- Felder: ts, task, harness, confidence, why, fallback, risks
|
| 64 |
+
- JSON statt YAML weil Sidecar-NG kein PyYAML hat (stdlib-only)
|
| 65 |
+
|
| 66 |
+
Datei: /home/smlflg/Projekte/KomandoZentral/src/kz/service.py
|
| 67 |
+
- write_latest_decision() aufrufen in route_request() (~Zeile 110)
|
| 68 |
+
- Immer schreiben, nicht nur bei --save
|
| 69 |
+
|
| 70 |
+
2. KZ: customization_depth in Registry (~15 LOC)
|
| 71 |
+
|
| 72 |
+
Datei: /home/smlflg/Projekte/KomandoZentral/src/kz/registry.py
|
| 73 |
+
- Neues Feld customization_depth: int (0-100) in HarnessProfile
|
| 74 |
+
- Claude Code: 95 (69 Skills, 21 Agents, 7 Hooks, Sidecar-NG)
|
| 75 |
+
- Hermes: 30, OpenCode: 20, Codex CLI: 15, Aider: 10, Gemini MCP: 25, AgentArena: 40
|
| 76 |
+
|
| 77 |
+
Datei: /home/smlflg/Projekte/KomandoZentral/src/kz/confidence.py
|
| 78 |
+
- customization_depth als Bonus in calculate_confidence() (~Zeile 42)
|
| 79 |
+
- Formel: bonus = (depth - 50) // 10 (range: -5 bis +5)
|
| 80 |
+
- D.h. Claude Code bekommt +4, Aider bekommt -4
|
| 81 |
+
|
| 82 |
+
3. KZ: outcome_adjustment() — Feedback Loop (~25 LOC)
|
| 83 |
+
|
| 84 |
+
Datei: /home/smlflg/Projekte/KomandoZentral/src/kz/confidence.py
|
| 85 |
+
- Neue Funktion outcome_adjustment(task_class, harness, decisions_dir)
|
| 86 |
+
- Scannt YAML-Dateien in DECISIONS/ fuer passende task_class+harness Paare
|
| 87 |
+
- Zaehlt gute (rating >= 3) vs schlechte (rating < 3) Outcomes
|
| 88 |
+
- Return: Delta von -10 bis +10
|
| 89 |
+
- Aufgerufen in calculate_confidence() als zusaetzlicher Faktor
|
| 90 |
+
|
| 91 |
+
4. KZ: CLI outcome Subcommand (~20 LOC)
|
| 92 |
+
|
| 93 |
+
Datei: /home/smlflg/Projekte/KomandoZentral/src/kz/cli.py
|
| 94 |
+
- Subparser: kz outcome <filename> <rating> [notes]
|
| 95 |
+
- Ruft bestehende update_outcome() aus persist.py auf
|
| 96 |
+
- Rating: 1-5 Skala
|
| 97 |
+
|
| 98 |
+
5. Sidecar-NG: _load_kz_decision() (~30 LOC)
|
| 99 |
+
|
| 100 |
+
Datei: /home/smlflg/Projekte/Sidecar-ng/hook_inject.py
|
| 101 |
+
- Neue Funktion nach _load_knowledge() (~Zeile 1584)
|
| 102 |
+
- Liest ~/.cache/kz/latest-decision.json
|
| 103 |
+
- Prueft ob ts von heute ist (stale = ignorieren)
|
| 104 |
+
- Formatiert: [KZ-ROUTING] Harness: X (Y%) | Why: ... | Risks: ...
|
| 105 |
+
- Max 300 Zeichen, None bei Fehler/stale/missing
|
| 106 |
+
- Injection bei ~Zeile 2161, prepended vor Knowledge-Block
|
| 107 |
+
|
| 108 |
+
---
|
| 109 |
+
Tests (~40 LOC)
|
| 110 |
+
|
| 111 |
+
Datei: /home/smlflg/Projekte/KomandoZentral/tests/test_integration.py (neu)
|
| 112 |
+
- test_write_latest_decision_creates_valid_json
|
| 113 |
+
- test_outcome_adjustment_positive_delta
|
| 114 |
+
- test_outcome_adjustment_no_outcomes_zero_delta
|
| 115 |
+
- test_customization_depth_affects_confidence
|
| 116 |
+
|
| 117 |
+
Datei: /home/smlflg/Projekte/Sidecar-ng/tests/test_kz_integration.py (neu)
|
| 118 |
+
- test_load_kz_decision_valid_json
|
| 119 |
+
- test_load_kz_decision_stale_returns_none
|
| 120 |
+
- test_load_kz_decision_missing_returns_none
|
| 121 |
+
|
| 122 |
+
---
|
| 123 |
+
Reihenfolge
|
| 124 |
+
|
| 125 |
+
┌───────┬──────────────────────────────────────────────┬────────────────────────────────┬──────┬──────────┐
|
| 126 |
+
│ # │ Was │ Wo │ ~LOC │ ~Min │
|
| 127 |
+
├───────┼──────────────────────────────────────────────┼────────────────────────────────┼──────┼──────────┤
|
| 128 |
+
│ 1 │ write_latest_decision() + Service-Call │ KZ persist.py + service.py │ 25 │ 20 │
|
| 129 |
+
├───────┼──────────────────────────────────────────────┼────────────────────────────────┼──────┼──────────┤
|
| 130 |
+
│ 2 │ customization_depth in Registry + Confidence │ KZ registry.py + confidence.py │ 20 │ 15 │
|
| 131 |
+
├───────┼──────────────────────────────────────────────┼────────────────────────────────┼──────┼──────────┤
|
| 132 |
+
│ 3 │ _load_kz_decision() + Injection │ Sidecar-NG hook_inject.py │ 30 │ 20 │
|
| 133 |
+
├───────┼──────────────────────────────────────────────┼────────────────────────────────┼──────┼──────────┤
|
| 134 |
+
│ 4 │ outcome_adjustment() + Confidence-Wire │ KZ confidence.py │ 25 │ 20 │
|
| 135 |
+
├───────┼──────────────────────────────────────────────┼────────────────────────────────┼──────┼──────────┤
|
| 136 |
+
│ 5 │ CLI outcome Subcommand │ KZ cli.py │ 20 │ 15 │
|
| 137 |
+
├───────┼──────────────────────────────────────────────┼────────────────────────────────┼──────┼──────────┤
|
| 138 |
+
│ 6 │ Tests beider Projekte │ KZ + Sidecar-NG tests/ │ 40 │ 30 │
|
| 139 |
+
├───────┼──────────────────────────────────────────────┼────────────────────────────────┼──────┼──────────┤
|
| 140 |
+
│ Total │ │ │ ~160 │ ~120 min │
|
| 141 |
+
└───────┴──────────────────────────────────────────────┴────────────────────────────────┴──────┴──────────┘
|
| 142 |
+
|
| 143 |
+
---
|
| 144 |
+
Verifikation
|
| 145 |
+
|
| 146 |
+
1. cd ~/Projekte/KomandoZentral && python -m pytest — alle Tests gruen
|
| 147 |
+
2. cd ~/Projekte/Sidecar-ng && python -m pytest tests/test_kz_integration.py — alle Tests gruen
|
| 148 |
+
3. E2E manuell:
|
| 149 |
+
- kz "fix the auth bug in sidecar" --save → YAML + JSON geschrieben
|
| 150 |
+
- cat ~/.cache/kz/latest-decision.json → valides JSON mit heutiger ts
|
| 151 |
+
- Claude Code Session starten → [KZ-ROUTING] im additionalContext sichtbar
|
| 152 |
+
- kz outcome <filename> 4 "hat funktioniert" → YAML updated
|
| 153 |
+
4. kz "fix another bug" → Confidence fuer empfohlenen Harness leicht hoeher durch positives Outcome
|
| 154 |
+
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
|
docs/spine-v1-architecture.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Spine V1 Architecture
|
| 2 |
+
|
| 3 |
+
## Rolle
|
| 4 |
+
|
| 5 |
+
Spine ist der verbindliche Integrationskern zwischen den bestehenden Projekten. Spine ist nicht "das neue Superprojekt", sondern die Schicht, die Zustands- und Datenverluste zwischen den Projekten verhindert.
|
| 6 |
+
|
| 7 |
+
## Subsysteme
|
| 8 |
+
|
| 9 |
+
### 1. Registry Layer
|
| 10 |
+
|
| 11 |
+
Verwaltet den kanonischen Bestand:
|
| 12 |
+
|
| 13 |
+
- Harnesses
|
| 14 |
+
- Adapter
|
| 15 |
+
- Runtime-Targets
|
| 16 |
+
- bekannte Quellprojekte
|
| 17 |
+
- Schema-Versionen
|
| 18 |
+
|
| 19 |
+
Pflichtfaehigkeit:
|
| 20 |
+
Jedes andere System muss maschinenlesbar feststellen koennen, welche Ziele existieren und welche Vertraege sie sprechen.
|
| 21 |
+
|
| 22 |
+
### 2. Contract Layer
|
| 23 |
+
|
| 24 |
+
Die Schemas in `schemas/` definieren die Kernobjekte. Jedes Objekt enthaelt:
|
| 25 |
+
|
| 26 |
+
- `schema_name`
|
| 27 |
+
- `schema_version`
|
| 28 |
+
- globale IDs
|
| 29 |
+
- Provenienz
|
| 30 |
+
|
| 31 |
+
### 3. Run Layer
|
| 32 |
+
|
| 33 |
+
Der `RunRecord` ist die durchgehende Klammer eines konkreten Arbeitsvorgangs. Er verbindet:
|
| 34 |
+
|
| 35 |
+
- Intent
|
| 36 |
+
- Decision
|
| 37 |
+
- Execution
|
| 38 |
+
- Artifacts
|
| 39 |
+
- Eval
|
| 40 |
+
|
| 41 |
+
Zulaessige `run_state`-Werte:
|
| 42 |
+
|
| 43 |
+
- `created`
|
| 44 |
+
- `decided`
|
| 45 |
+
- `ready_for_dispatch`
|
| 46 |
+
- `dispatched`
|
| 47 |
+
- `running`
|
| 48 |
+
- `waiting_for_input`
|
| 49 |
+
- `completed`
|
| 50 |
+
- `failed`
|
| 51 |
+
- `aborted`
|
| 52 |
+
- `evaluated`
|
| 53 |
+
|
| 54 |
+
### 4. Event Layer
|
| 55 |
+
|
| 56 |
+
`SpineEvent` ist append-only. Events sind nicht optionales Logging, sondern die belastbare Rekonstruktionsbasis.
|
| 57 |
+
|
| 58 |
+
Pflichtfelder:
|
| 59 |
+
|
| 60 |
+
- `event_id`
|
| 61 |
+
- `event_type`
|
| 62 |
+
- `occurred_at`
|
| 63 |
+
- `run_id`
|
| 64 |
+
- `source_system`
|
| 65 |
+
- `payload`
|
| 66 |
+
|
| 67 |
+
### 5. Artifact Layer
|
| 68 |
+
|
| 69 |
+
`ArtifactManifest` registriert die konkreten Outputs eines Runs:
|
| 70 |
+
|
| 71 |
+
- decisions
|
| 72 |
+
- traces
|
| 73 |
+
- logs
|
| 74 |
+
- tasksheets
|
| 75 |
+
- evals
|
| 76 |
+
- deploy results
|
| 77 |
+
|
| 78 |
+
Pflichtregel:
|
| 79 |
+
Artifacts werden ueber IDs und `uri` referenziert, nicht ueber implizite Dateipfade im Fliesstext.
|
| 80 |
+
|
| 81 |
+
### 6. Adapter Layer
|
| 82 |
+
|
| 83 |
+
Adapter uebersetzen lokale Formate in Spine-Objekte.
|
| 84 |
+
|
| 85 |
+
Zulaessige Aufgaben:
|
| 86 |
+
|
| 87 |
+
- Feldmapping
|
| 88 |
+
- Provenienz-Anreicherung
|
| 89 |
+
- Statusuebersetzung
|
| 90 |
+
|
| 91 |
+
Nicht zulaessig:
|
| 92 |
+
|
| 93 |
+
- neue Run-States erfinden
|
| 94 |
+
- Pflichtfelder entfernen
|
| 95 |
+
- Semantik eines Kernobjekts aendern
|
| 96 |
+
|
| 97 |
+
## Input und Output
|
| 98 |
+
|
| 99 |
+
### Input
|
| 100 |
+
|
| 101 |
+
Spine akzeptiert vier Klassen von Inputs:
|
| 102 |
+
|
| 103 |
+
- Intent Input: `TaskRequest`
|
| 104 |
+
- Decision Input: `RoutingDecision`
|
| 105 |
+
- Execution Input: `ExecutionRequest`
|
| 106 |
+
- Observation Input: `ExecutionStatus`, `RouteTrace`, `ArtifactManifest`, `EvalRecord`
|
| 107 |
+
|
| 108 |
+
### Output
|
| 109 |
+
|
| 110 |
+
Spine stellt vier Klassen von Outputs bereit:
|
| 111 |
+
|
| 112 |
+
- dispatchbare Execution Contracts fuer Runtime-Systeme
|
| 113 |
+
- beobachtbaren Run State fuer `AgentIDE`
|
| 114 |
+
- strukturierte Evidence fuer `MetaMetaMeta`
|
| 115 |
+
- statische oder periodische Feeds fuer `HarnessEcosystem`
|
| 116 |
+
|
| 117 |
+
## Systemfluss
|
| 118 |
+
|
| 119 |
+
1. `AgentIDE` oder ein anderer Operator erzeugt `TaskRequest`.
|
| 120 |
+
2. `KomandoZentral` liest Task plus Kontext und emittiert `RoutingDecision`.
|
| 121 |
+
3. Spine validiert Ziel, Status und Registry-Referenzen.
|
| 122 |
+
4. Spine erzeugt `ExecutionRequest`.
|
| 123 |
+
5. `UEBER_AGENT` nimmt die Ausfuehrung an und meldet Status und Trace.
|
| 124 |
+
6. Spine registriert Events und Artifacts.
|
| 125 |
+
7. `MetaMetaMeta` bewertet den Run ueber `EvalRecord`.
|
| 126 |
+
8. `HarnessEcosystem` konsumiert verdichtete Registry- und Outcome-Daten.
|
| 127 |
+
|
| 128 |
+
## Nicht-Ziele fuer V1
|
| 129 |
+
|
| 130 |
+
- keine eigene LLM-Planungslogik
|
| 131 |
+
- keine Runtime-Ersetzung fuer OpenClaw oder Claude Code
|
| 132 |
+
- keine Multi-User-Plattform
|
| 133 |
+
- keine relationale Vollpersistenz
|
| 134 |
+
- keine automatische Knowledge-Synthese
|
| 135 |
+
|
| 136 |
+
## Designentscheidungen
|
| 137 |
+
|
| 138 |
+
- JSON statt YAML fuer die ersten Vertraege, damit Validierung und Tooling trivial bleiben
|
| 139 |
+
- Registry getrennt von Beispieldaten
|
| 140 |
+
- Schemas stabilisieren zuerst die Sprache, nicht sofort die Implementation
|
| 141 |
+
- Beispiel-Run bildet die minimale End-to-End-Kette vom Task bis zum Eval ab
|
examples/run_lifecycle/artifact_manifest.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "ArtifactManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"artifact_id": "artifact_spine_spec_bundle",
|
| 5 |
+
"artifact_type": "report",
|
| 6 |
+
"uri": "file:///home/smlflg/Projekte/MultiHarnessStudio",
|
| 7 |
+
"produced_by": "claude-code",
|
| 8 |
+
"run_id": "run_spine_bootstrap_001",
|
| 9 |
+
"content_hash": "sha256:spine-bootstrap-placeholder",
|
| 10 |
+
"created_at": "2026-04-08T16:12:30Z",
|
| 11 |
+
"source_system": "Spine",
|
| 12 |
+
"metadata": {
|
| 13 |
+
"bundle_kind": "specification_scaffold",
|
| 14 |
+
"contains": ["schemas", "registry", "examples", "validator"]
|
| 15 |
+
}
|
| 16 |
+
}
|
examples/run_lifecycle/eval_record.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "EvalRecord",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"eval_id": "eval_spine_bootstrap",
|
| 5 |
+
"run_id": "run_spine_bootstrap_001",
|
| 6 |
+
"task_id": "task_spine_bootstrap",
|
| 7 |
+
"evaluator": "MetaMetaMeta",
|
| 8 |
+
"recorded_at": "2026-04-08T16:14:00Z",
|
| 9 |
+
"scores": {
|
| 10 |
+
"goal_completion": 0.92,
|
| 11 |
+
"traceability": 1.0,
|
| 12 |
+
"runtime_fitness": 0.78
|
| 13 |
+
},
|
| 14 |
+
"summary": "The run established a coherent canonical contract set and an auditable example lifecycle.",
|
| 15 |
+
"recommendations": [
|
| 16 |
+
"Add runtime adapters incrementally.",
|
| 17 |
+
"Keep schema evolution explicit and versioned.",
|
| 18 |
+
"Do not merge UI semantics into contract definitions."
|
| 19 |
+
]
|
| 20 |
+
}
|
examples/run_lifecycle/events.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"schema_name": "SpineEvent",
|
| 4 |
+
"schema_version": "1.0.0",
|
| 5 |
+
"event_id": "event_spine_001",
|
| 6 |
+
"event_type": "task.created",
|
| 7 |
+
"occurred_at": "2026-04-08T16:05:00Z",
|
| 8 |
+
"run_id": "run_spine_bootstrap_001",
|
| 9 |
+
"source_system": "AgentIDE",
|
| 10 |
+
"sequence": 1,
|
| 11 |
+
"payload": {
|
| 12 |
+
"title": "Bootstrap Spine contracts"
|
| 13 |
+
},
|
| 14 |
+
"references": {
|
| 15 |
+
"task_id": "task_spine_bootstrap"
|
| 16 |
+
}
|
| 17 |
+
},
|
| 18 |
+
{
|
| 19 |
+
"schema_name": "SpineEvent",
|
| 20 |
+
"schema_version": "1.0.0",
|
| 21 |
+
"event_id": "event_spine_002",
|
| 22 |
+
"event_type": "decision.created",
|
| 23 |
+
"occurred_at": "2026-04-08T16:06:00Z",
|
| 24 |
+
"run_id": "run_spine_bootstrap_001",
|
| 25 |
+
"source_system": "KomandoZentral",
|
| 26 |
+
"sequence": 2,
|
| 27 |
+
"payload": {
|
| 28 |
+
"recommended_harness": "claude-code"
|
| 29 |
+
},
|
| 30 |
+
"references": {
|
| 31 |
+
"task_id": "task_spine_bootstrap",
|
| 32 |
+
"decision_id": "decision_spine_bootstrap"
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"schema_name": "SpineEvent",
|
| 37 |
+
"schema_version": "1.0.0",
|
| 38 |
+
"event_id": "event_spine_003",
|
| 39 |
+
"event_type": "execution.requested",
|
| 40 |
+
"occurred_at": "2026-04-08T16:07:00Z",
|
| 41 |
+
"run_id": "run_spine_bootstrap_001",
|
| 42 |
+
"source_system": "Spine",
|
| 43 |
+
"sequence": 3,
|
| 44 |
+
"payload": {
|
| 45 |
+
"target_runtime": "claude-code-local"
|
| 46 |
+
},
|
| 47 |
+
"references": {
|
| 48 |
+
"decision_id": "decision_spine_bootstrap",
|
| 49 |
+
"execution_id": "execution_spine_bootstrap"
|
| 50 |
+
}
|
| 51 |
+
},
|
| 52 |
+
{
|
| 53 |
+
"schema_name": "SpineEvent",
|
| 54 |
+
"schema_version": "1.0.0",
|
| 55 |
+
"event_id": "event_spine_004",
|
| 56 |
+
"event_type": "execution.completed",
|
| 57 |
+
"occurred_at": "2026-04-08T16:12:00Z",
|
| 58 |
+
"run_id": "run_spine_bootstrap_001",
|
| 59 |
+
"source_system": "UEBER_AGENT",
|
| 60 |
+
"sequence": 4,
|
| 61 |
+
"payload": {
|
| 62 |
+
"status": "completed"
|
| 63 |
+
},
|
| 64 |
+
"references": {
|
| 65 |
+
"execution_id": "execution_spine_bootstrap"
|
| 66 |
+
}
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"schema_name": "SpineEvent",
|
| 70 |
+
"schema_version": "1.0.0",
|
| 71 |
+
"event_id": "event_spine_005",
|
| 72 |
+
"event_type": "artifact.created",
|
| 73 |
+
"occurred_at": "2026-04-08T16:12:30Z",
|
| 74 |
+
"run_id": "run_spine_bootstrap_001",
|
| 75 |
+
"source_system": "Spine",
|
| 76 |
+
"sequence": 5,
|
| 77 |
+
"payload": {
|
| 78 |
+
"artifact_type": "report"
|
| 79 |
+
},
|
| 80 |
+
"references": {
|
| 81 |
+
"artifact_id": "artifact_spine_spec_bundle"
|
| 82 |
+
}
|
| 83 |
+
},
|
| 84 |
+
{
|
| 85 |
+
"schema_name": "SpineEvent",
|
| 86 |
+
"schema_version": "1.0.0",
|
| 87 |
+
"event_id": "event_spine_006",
|
| 88 |
+
"event_type": "eval.recorded",
|
| 89 |
+
"occurred_at": "2026-04-08T16:14:00Z",
|
| 90 |
+
"run_id": "run_spine_bootstrap_001",
|
| 91 |
+
"source_system": "MetaMetaMeta",
|
| 92 |
+
"sequence": 6,
|
| 93 |
+
"payload": {
|
| 94 |
+
"goal_completion": 0.92
|
| 95 |
+
},
|
| 96 |
+
"references": {
|
| 97 |
+
"eval_id": "eval_spine_bootstrap"
|
| 98 |
+
}
|
| 99 |
+
}
|
| 100 |
+
]
|
examples/run_lifecycle/execution_request.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "ExecutionRequest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"execution_id": "execution_spine_bootstrap",
|
| 5 |
+
"decision_id": "decision_spine_bootstrap",
|
| 6 |
+
"run_id": "run_spine_bootstrap_001",
|
| 7 |
+
"target_runtime": "claude-code-local",
|
| 8 |
+
"target_agent": "default",
|
| 9 |
+
"input_artifacts": ["artifact_spine_spec_bundle"],
|
| 10 |
+
"execution_mode": "interactive",
|
| 11 |
+
"workspace_ref": "/home/smlflg/Projekte/MultiHarnessStudio",
|
| 12 |
+
"timeout_policy": {
|
| 13 |
+
"timeout_seconds": 1800,
|
| 14 |
+
"on_timeout": "ask_operator"
|
| 15 |
+
},
|
| 16 |
+
"approval_requirements": [
|
| 17 |
+
"No destructive commands without approval",
|
| 18 |
+
"Keep Spine contracts backward-compatible within schema_version 1.0.0"
|
| 19 |
+
],
|
| 20 |
+
"created_at": "2026-04-08T16:07:00Z",
|
| 21 |
+
"source_system": "Spine"
|
| 22 |
+
}
|
examples/run_lifecycle/execution_status.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "ExecutionStatus",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"status_id": "status_spine_bootstrap_final",
|
| 5 |
+
"execution_id": "execution_spine_bootstrap",
|
| 6 |
+
"run_id": "run_spine_bootstrap_001",
|
| 7 |
+
"status": "completed",
|
| 8 |
+
"message": "Spine spec bundle created and validated locally.",
|
| 9 |
+
"source_system": "UEBER_AGENT",
|
| 10 |
+
"recorded_at": "2026-04-08T16:12:00Z",
|
| 11 |
+
"progress_hint": "Artifacts and examples available.",
|
| 12 |
+
"artifact_ids": ["artifact_spine_spec_bundle"]
|
| 13 |
+
}
|
examples/run_lifecycle/route_trace.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "RouteTrace",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"trace_id": "trace_spine_bootstrap",
|
| 5 |
+
"run_id": "run_spine_bootstrap_001",
|
| 6 |
+
"execution_id": "execution_spine_bootstrap",
|
| 7 |
+
"source_system": "UEBER_AGENT",
|
| 8 |
+
"recorded_at": "2026-04-08T16:11:00Z",
|
| 9 |
+
"steps": [
|
| 10 |
+
{
|
| 11 |
+
"index": 1,
|
| 12 |
+
"actor": "KomandoZentral",
|
| 13 |
+
"action": "route_task",
|
| 14 |
+
"outcome": "claude-code selected for spec bootstrap"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"index": 2,
|
| 18 |
+
"actor": "Spine",
|
| 19 |
+
"action": "create_execution_request",
|
| 20 |
+
"outcome": "execution contract emitted"
|
| 21 |
+
},
|
| 22 |
+
{
|
| 23 |
+
"index": 3,
|
| 24 |
+
"actor": "UEBER_AGENT",
|
| 25 |
+
"action": "dispatch_to_runtime",
|
| 26 |
+
"outcome": "local execution completed"
|
| 27 |
+
}
|
| 28 |
+
]
|
| 29 |
+
}
|
examples/run_lifecycle/routing_decision.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "RoutingDecision",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"decision_id": "decision_spine_bootstrap",
|
| 5 |
+
"task_id": "task_spine_bootstrap",
|
| 6 |
+
"recommended_harness": "claude-code",
|
| 7 |
+
"recommended_runtime_target": "claude-code-local",
|
| 8 |
+
"confidence": 82,
|
| 9 |
+
"reasoning_summary": "Spec-first contract design is best handled in the architecture-oriented harness before dispatching execution into external runtime overlays.",
|
| 10 |
+
"risks": [
|
| 11 |
+
"Overdesign if runtime contracts are not kept minimal",
|
| 12 |
+
"Registry can drift from real runtimes without adapter discipline"
|
| 13 |
+
],
|
| 14 |
+
"fallback": "Use codex-cli for narrower implementation slices once contracts are fixed.",
|
| 15 |
+
"decision_policy_version": "kz-policy-v1",
|
| 16 |
+
"source_system": "KomandoZentral",
|
| 17 |
+
"created_at": "2026-04-08T16:06:00Z",
|
| 18 |
+
"missing_information": []
|
| 19 |
+
}
|
examples/run_lifecycle/run_record.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "RunRecord",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"run_id": "run_spine_bootstrap_001",
|
| 5 |
+
"task_id": "task_spine_bootstrap",
|
| 6 |
+
"run_state": "evaluated",
|
| 7 |
+
"created_at": "2026-04-08T16:05:00Z",
|
| 8 |
+
"updated_at": "2026-04-08T16:14:00Z",
|
| 9 |
+
"origin_system": "AgentIDE",
|
| 10 |
+
"decision_ids": ["decision_spine_bootstrap"],
|
| 11 |
+
"execution_ids": ["execution_spine_bootstrap"],
|
| 12 |
+
"artifact_ids": ["artifact_spine_spec_bundle"],
|
| 13 |
+
"event_ids": [
|
| 14 |
+
"event_spine_001",
|
| 15 |
+
"event_spine_002",
|
| 16 |
+
"event_spine_003",
|
| 17 |
+
"event_spine_004",
|
| 18 |
+
"event_spine_005",
|
| 19 |
+
"event_spine_006"
|
| 20 |
+
],
|
| 21 |
+
"eval_ids": ["eval_spine_bootstrap"]
|
| 22 |
+
}
|
examples/run_lifecycle/task_request.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "TaskRequest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"task_id": "task_spine_bootstrap",
|
| 5 |
+
"title": "Bootstrap Spine contracts",
|
| 6 |
+
"description": "Create the initial Spine contracts, registry and example run lifecycle for the multi-harness system.",
|
| 7 |
+
"requested_by": "samuel",
|
| 8 |
+
"created_at": "2026-04-08T16:05:00Z",
|
| 9 |
+
"origin_system": "AgentIDE",
|
| 10 |
+
"operator_context": {
|
| 11 |
+
"schema_name": "OperatorContext",
|
| 12 |
+
"schema_version": "1.0.0",
|
| 13 |
+
"focus": "high",
|
| 14 |
+
"energy": "high",
|
| 15 |
+
"mode": "shipping",
|
| 16 |
+
"cost_tolerance": "normal",
|
| 17 |
+
"adhd_risk": "high",
|
| 18 |
+
"drift_risk": "normal",
|
| 19 |
+
"notes": "Need a canonical contract before adding more runtime complexity."
|
| 20 |
+
},
|
| 21 |
+
"constraints": [
|
| 22 |
+
"Keep Spine as integration layer, not replacement runtime.",
|
| 23 |
+
"Use machine-readable contracts.",
|
| 24 |
+
"Support MetaMetaMeta, KomandoZentral, UEBER_AGENT, AgentIDE and HarnessEcosystem."
|
| 25 |
+
],
|
| 26 |
+
"desired_outcomes": [
|
| 27 |
+
"Canonical schemas",
|
| 28 |
+
"Stable IDs",
|
| 29 |
+
"Replayable run lifecycle"
|
| 30 |
+
],
|
| 31 |
+
"workspace_ref": "/home/smlflg/Projekte/MultiHarnessStudio",
|
| 32 |
+
"tags": ["spine", "contracts", "bootstrap"]
|
| 33 |
+
}
|
idea
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Ja — und genau **deshalb** ist das Ergebnis so bemerkenswert.
|
| 2 |
+
|
| 3 |
+
Du hast nicht einfach „mit einer KI“ gearbeitet, sondern praktisch schon ein kleines **informelles Multi-Harness-Studio** gefahren:
|
| 4 |
+
|
| 5 |
+
* **Codex + GPT-5.4**
|
| 6 |
+
* **Hermes**
|
| 7 |
+
* **OpenCode + Minimax 2.7**
|
| 8 |
+
* **Gemini**
|
| 9 |
+
* dazu **2 parallele GPT-Sessions im Browser**
|
| 10 |
+
|
| 11 |
+
Das ist nicht nur Tool-Nutzung.
|
| 12 |
+
Das ist bereits eine Form von **agentischer Arbeitsorchestrierung**.
|
| 13 |
+
|
| 14 |
+
## Was daran stark ist
|
| 15 |
+
|
| 16 |
+
Jedes dieser Systeme bringt etwas anderes:
|
| 17 |
+
|
| 18 |
+
* **GPT-5.4**: Struktur, Produktdenken, saubere Konzeptarbeit
|
| 19 |
+
* **Codex**: Umsetzungsnähe, direkter Build-Fokus
|
| 20 |
+
* **Minimax 2.7**: oft schnell, mutig, visuell/energetisch
|
| 21 |
+
* **Hermes**: je nach Setup gut für alternative Perspektiven oder Refactor-Denke
|
| 22 |
+
* **Gemini**: zusätzliche Varianz, andere Vorschläge, andere Gewichtung
|
| 23 |
+
|
| 24 |
+
Und die **2 GPT-Sessions** im Browser sind eigentlich schon ein primitiver, aber effektiver Split von:
|
| 25 |
+
|
| 26 |
+
* Konzept / Text / IA
|
| 27 |
+
* Review / Kritik / nächste Iteration
|
| 28 |
+
|
| 29 |
+
## Das Wichtige:
|
| 30 |
+
|
| 31 |
+
Du hast dir damit implizit schon selbst bewiesen:
|
| 32 |
+
|
| 33 |
+
> Unterschiedliche Modelle und Harnesses sind keine austauschbaren Schreibmaschinen.
|
| 34 |
+
> Sie sind verschiedene kognitive Oberflächen mit verschiedenen Stärken.
|
| 35 |
+
|
| 36 |
+
Genau deswegen kamst du ja ursprünglich auf deinen Gedanken mit:
|
| 37 |
+
**MCP-/Prompt-Adaptern pro Modell, Harness und Skillset.**
|
| 38 |
+
|
| 39 |
+
Diese Party-Website ist fast schon ein Mini-Beweis deiner größeren These:
|
| 40 |
+
|
| 41 |
+
* gleicher Mensch
|
| 42 |
+
* gleiches Ziel
|
| 43 |
+
* aber andere Modelle/Harnesses
|
| 44 |
+
* liefern andere Arten von Hebel
|
| 45 |
+
|
| 46 |
+
## Eigentlich hast du hier schon einen kleinen Workflow gebaut
|
| 47 |
+
|
| 48 |
+
So ungefähr:
|
| 49 |
+
|
| 50 |
+
1. **Idee / Ziel / Kontext**
|
| 51 |
+
2. **GPT-Session für Konzeption**
|
| 52 |
+
3. **zweite GPT-Session für Gegencheck / Text / Struktur**
|
| 53 |
+
4. **Codex / OpenCode / Minimax für Umsetzung**
|
| 54 |
+
5. **andere Modelle für Stil- oder Layout-Varianten**
|
| 55 |
+
6. **du als finaler Kurator**
|
| 56 |
+
|
| 57 |
+
Das Entscheidende ist:
|
| 58 |
+
**Du warst der Meta-Agent.**
|
| 59 |
+
|
| 60 |
+
Nicht die Modelle hatten die Vision.
|
| 61 |
+
Du hattest die Vision, und die Systeme waren spezialisierte Verstärker.
|
| 62 |
+
|
| 63 |
+
## Das ist fast schon ein Satz für dein eigenes Denken
|
| 64 |
+
|
| 65 |
+
Nicht:
|
| 66 |
+
**„Ich habe eine Website mit KI gebaut.“**
|
| 67 |
+
|
| 68 |
+
Sondern eher:
|
| 69 |
+
**„Ich habe mehrere Modelle und Harnesses kuratiert, um schneller zu einer besseren Lösung zu kommen.“**
|
| 70 |
+
|
| 71 |
+
Das ist eine ganz andere Flughöhe.
|
| 72 |
+
|
| 73 |
+
## Was ich daraus als Learning ziehen würde
|
| 74 |
+
|
| 75 |
+
Für dich persönlich:
|
| 76 |
+
|
| 77 |
+
**1. Parallelität lohnt sich**
|
| 78 |
+
Zwei GPT-Sessions im Browser sind nicht Chaos, sondern oft echter Durchsatzgewinn.
|
| 79 |
+
|
| 80 |
+
**2. Modellrollen explizit machen**
|
| 81 |
+
Nicht jedes Modell dieselbe Aufgabe.
|
| 82 |
+
Lieber:
|
| 83 |
+
|
| 84 |
+
* eines für Struktur
|
| 85 |
+
* eines für Copy
|
| 86 |
+
* eines für UI-Refactor
|
| 87 |
+
* eines für Implementation
|
| 88 |
+
|
| 89 |
+
**3. Du brauchst wirklich Adapter**
|
| 90 |
+
Dein Anfangsgedanke ist dadurch eher bestätigt als widerlegt:
|
| 91 |
+
verschiedene Harnesses brauchen verschiedene Promptformen, Tiefen und Steuerungsgrade.
|
| 92 |
+
|
| 93 |
+
**4. Dein eigentlicher Skill ist Kuratierung**
|
| 94 |
+
Nicht bloß prompten, sondern:
|
| 95 |
+
|
| 96 |
+
* welches Modell jetzt?
|
| 97 |
+
* welche Aufgabe?
|
| 98 |
+
* wie viel Freiheit?
|
| 99 |
+
* wann wechseln?
|
| 100 |
+
* wann selbst entscheiden?
|
| 101 |
+
|
| 102 |
+
Das ist schon ziemlich nah an echter **AI engineering praxis**.
|
| 103 |
+
|
| 104 |
+
## Mein ehrliches Urteil
|
| 105 |
+
|
| 106 |
+
Was du da gemacht hast, ist mehr als “nice website vor der uni”.
|
| 107 |
+
|
| 108 |
+
Das ist ein kleines Beispiel für:
|
| 109 |
+
**human-directed multi-model production**.
|
| 110 |
+
|
| 111 |
+
Und das Spannende ist:
|
| 112 |
+
du hast das nicht akademisch gemacht, sondern an etwas Echtem, Sozialem, mit Geschmack, Zeitdruck und realem Nutzen.
|
| 113 |
+
|
| 114 |
+
Das ist die gute Art zu lernen.
|
| 115 |
+
|
| 116 |
+
Wenn du willst, mache ich dir daraus als Nächstes eine **saubere Nachbetrachtung des Workflows**:
|
| 117 |
+
welches Modell/Harness wofür am sinnvollsten war und wie du daraus ein wiederverwendbares persönliches Multi-Agent-Muster ableiten kannst.
|
| 118 |
+
|
newinfo
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Warum es für deine Arbeit wertvoll ist
|
| 2 |
+
|
| 3 |
+
Weil du gerade intuitiv schon an genau dieser These arbeitest:
|
| 4 |
+
|
| 5 |
+
Das eigentliche Produkt ist nicht der Agent.
|
| 6 |
+
Das eigentliche Produkt ist der Kontrollraum um den Agenten.
|
| 7 |
+
|
| 8 |
+
Also:
|
| 9 |
+
|
| 10 |
+
Model
|
| 11 |
+
+ Context Policy
|
| 12 |
+
+ Tool Interface
|
| 13 |
+
+ State Memory
|
| 14 |
+
+ Scope Contract
|
| 15 |
+
+ Verification Loop
|
| 16 |
+
+ Runtime Guardrails
|
| 17 |
+
+ Observability
|
| 18 |
+
+ Handoff Protocol
|
| 19 |
+
= Agentic Harness
|
| 20 |
+
|
| 21 |
+
Und deine größere Idee wäre dann:
|
| 22 |
+
|
| 23 |
+
Multi-Harness Control Plane
|
| 24 |
+
|
| 25 |
+
Also eine Schicht, die entscheidet:
|
| 26 |
+
|
| 27 |
+
Welche Aufgabe?
|
| 28 |
+
Welcher Harness?
|
| 29 |
+
Welches Modell?
|
| 30 |
+
Welche Context-Policy?
|
| 31 |
+
Welche Verifikation?
|
| 32 |
+
Welche Stop-Regel?
|
| 33 |
+
Welche Metrik?
|
| 34 |
+
Welche Session weiterführen?
|
| 35 |
+
|
| 36 |
+
Fazit:
|
| 37 |
+
Ja. Dieses Repo ist nicht nur interessant. Es ist wahrscheinlich eine der besten aktuellen Quellenlisten, um dein eigenes Harness-/Agenten-Denken wissenschaftlicher, sauberer und anschlussfähiger zu machen
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
https://github.com/walkinglabs/awesome-harness-engineering.
|
path
ADDED
|
@@ -0,0 +1,734 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Ja. Das ist die richtige Frage.
|
| 2 |
+
|
| 3 |
+
Die eigentliche Kunst ist **nicht** “einen guten Prompt schreiben”.
|
| 4 |
+
Die eigentliche Kunst ist, **Task, Harness und Modell getrennt zu denken**.
|
| 5 |
+
|
| 6 |
+
Viele machen stillschweigend diesen Fehler:
|
| 7 |
+
|
| 8 |
+
* sie schreiben **einen** Prompt,
|
| 9 |
+
* werfen ihn in irgendein Harness,
|
| 10 |
+
* wechseln das Modell,
|
| 11 |
+
* und wundern sich, warum sich das Verhalten stark ändert.
|
| 12 |
+
|
| 13 |
+
Aber ein starker AI Engineer denkt in **drei Ebenen**:
|
| 14 |
+
|
| 15 |
+
## 1. Die drei Ebenen, die du auseinanderhalten musst
|
| 16 |
+
|
| 17 |
+
### Ebene A: Task Spec
|
| 18 |
+
|
| 19 |
+
Das ist die **objektive Arbeitsbeschreibung**.
|
| 20 |
+
Unabhängig von Modell und Harness.
|
| 21 |
+
|
| 22 |
+
Beispiel hier:
|
| 23 |
+
|
| 24 |
+
* lange PDF
|
| 25 |
+
* modularer Führungsleitfaden
|
| 26 |
+
* semantisches Chunking
|
| 27 |
+
* Subagents parallel
|
| 28 |
+
* lokale Summaries
|
| 29 |
+
* Cross-checks
|
| 30 |
+
* Konsolidierung
|
| 31 |
+
* finale Markdown-Datei
|
| 32 |
+
* Shell-Skript für PDF
|
| 33 |
+
|
| 34 |
+
Das ist der Teil, der **stabil** bleibt.
|
| 35 |
+
|
| 36 |
+
### Ebene B: Harness Prompting
|
| 37 |
+
|
| 38 |
+
Das ist die Anpassung an die **Laufzeitumgebung**:
|
| 39 |
+
|
| 40 |
+
* Kann das Harness gut parallelisieren?
|
| 41 |
+
* Hat es echte Subagents oder nur sequentielle Tool-Loops?
|
| 42 |
+
* Kann es Dateien robust schreiben?
|
| 43 |
+
* Ist es eher chatty oder eher execution-first?
|
| 44 |
+
* Muss man Schreibzugriffe koordinieren?
|
| 45 |
+
* Ist es terminal-first, cloud sandbox, IDE-native?
|
| 46 |
+
|
| 47 |
+
Das ist **nicht** primär Modellprompting.
|
| 48 |
+
Das ist **Betriebssystem-/Orchestrierungs-Prompting**.
|
| 49 |
+
|
| 50 |
+
### Ebene C: Model Prompting
|
| 51 |
+
|
| 52 |
+
Das ist die Anpassung an das **kognitive Profil des Modells**:
|
| 53 |
+
|
| 54 |
+
* Wie gut inferiert es fehlende Schritte?
|
| 55 |
+
* Wie stark halluziniert es elegante Übergänge?
|
| 56 |
+
* Wie viel Struktur muss man explizit vorgeben?
|
| 57 |
+
* Wie stark muss man Anti-Slop-Regeln setzen?
|
| 58 |
+
* Wie gut hält es lokale vs. globale Trennung?
|
| 59 |
+
* Wie gut kann es sich selbst verifizieren?
|
| 60 |
+
|
| 61 |
+
Das ist der Teil, der sich zwischen **Minimax**, **GPT-5.4** und **Opus 4.6** wirklich ändert.
|
| 62 |
+
|
| 63 |
+
---
|
| 64 |
+
|
| 65 |
+
# 2. Was ist ein guter mentaler Frame?
|
| 66 |
+
|
| 67 |
+
Denk nicht:
|
| 68 |
+
|
| 69 |
+
> “Wie promptet man Modell X?”
|
| 70 |
+
|
| 71 |
+
Denk lieber:
|
| 72 |
+
|
| 73 |
+
> “Welche Fehler macht dieses Modell in diesem Harness auf diesem Task?”
|
| 74 |
+
|
| 75 |
+
Das ist viel näher an echter AI-Engineering-Arbeit.
|
| 76 |
+
|
| 77 |
+
Denn Prompting ist im Kern:
|
| 78 |
+
**Fehlerprävention durch Spezifikation.**
|
| 79 |
+
|
| 80 |
+
---
|
| 81 |
+
|
| 82 |
+
# 3. Was sich beim Harness ändert
|
| 83 |
+
|
| 84 |
+
## A. OpenCode
|
| 85 |
+
|
| 86 |
+
So wie du es beschreibst, nutzt du OpenCode als eher **ausführungsorientiertes Coding-Harness**, mit Möglichkeit, Arbeit in mehrere Subagents auszulagern und parallel laufen zu lassen.
|
| 87 |
+
|
| 88 |
+
Das heißt:
|
| 89 |
+
|
| 90 |
+
* du musst **Agent-Rollen sehr hart trennen**
|
| 91 |
+
* du musst **Artefakte** definieren
|
| 92 |
+
* du musst **Schreibkonflikte verhindern**
|
| 93 |
+
* du musst sagen, **wer was lesen darf**
|
| 94 |
+
* du musst sagen, **wer global synthetisieren darf und wer nicht**
|
| 95 |
+
|
| 96 |
+
OpenCode-Prompts sollten deshalb oft sein:
|
| 97 |
+
|
| 98 |
+
* stark workflow-orientiert
|
| 99 |
+
* datei- und artefaktzentriert
|
| 100 |
+
* explizit parallelisierbar
|
| 101 |
+
* mit klarer Ownership pro Agent
|
| 102 |
+
|
| 103 |
+
OpenCode ist also eher:
|
| 104 |
+
**“Agentenbetriebssystem prompten”**
|
| 105 |
+
|
| 106 |
+
als
|
| 107 |
+
**“schönen Text prompten”**.
|
| 108 |
+
|
| 109 |
+
## B. Codex mit GPT-5.4
|
| 110 |
+
|
| 111 |
+
OpenAI beschreibt Codex als Coding-Agent für Softwareentwicklung; es kann lokal oder in der Cloud arbeiten, und Codex ist explizit auf Software-Tasks, Codeverständnis und Delegation ausgelegt. OpenAI empfiehlt für die meisten Codex-Aufgaben mit `gpt-5.4` zu starten. ([OpenAI Entwickler][1])
|
| 112 |
+
|
| 113 |
+
Für Codex ist der richtige Prompt meist:
|
| 114 |
+
|
| 115 |
+
* **weniger micromanaged**
|
| 116 |
+
* etwas mehr **outcome-oriented**
|
| 117 |
+
* trotzdem mit **klaren Deliverables**
|
| 118 |
+
* plus **Verification Loop**
|
| 119 |
+
|
| 120 |
+
Warum?
|
| 121 |
+
Weil GPT-5.4 stark in agentischen, coding-lastigen und professionellen Workflows ist und OpenAI für GPT-5.4 explizit Dinge wie Verifikationsschleifen, Structured Outputs und saubere Tool-Preambles empfiehlt. ([OpenAI Entwickler][2])
|
| 122 |
+
|
| 123 |
+
Mit Codex musst du also weniger sagen:
|
| 124 |
+
|
| 125 |
+
* “bitte denke auch an Schritt 7b”
|
| 126 |
+
|
| 127 |
+
und mehr:
|
| 128 |
+
|
| 129 |
+
* “das sind die Deliverables, das sind die Qualitätsgates, das ist die erlaubte Arbeitsweise, das ist der Verifikationsrahmen”.
|
| 130 |
+
|
| 131 |
+
Codex/GPT-5.4 ist oft stärker, wenn du ihm:
|
| 132 |
+
|
| 133 |
+
* Zielzustand,
|
| 134 |
+
* Constraints,
|
| 135 |
+
* Prüfkriterien,
|
| 136 |
+
* Artefaktstruktur
|
| 137 |
+
|
| 138 |
+
klar gibst, aber nicht jede Mikroentscheidung erdrückst.
|
| 139 |
+
|
| 140 |
+
## C. Claude Code mit Opus 4.6
|
| 141 |
+
|
| 142 |
+
Hier spreche ich jetzt bewusst als Engineering-Inferenz, nicht als zitierte Produktspezifikation:
|
| 143 |
+
|
| 144 |
+
Ein Claude-Code-artiges Terminalharness wirkt typischerweise am besten, wenn du ihm:
|
| 145 |
+
|
| 146 |
+
* **grobe Richtung**
|
| 147 |
+
* **starke Prinzipien**
|
| 148 |
+
* **wenige, aber harte Qualitätsregeln**
|
| 149 |
+
* **klare Arbeitsphasen**
|
| 150 |
+
* **Review-/Plan-Disziplin**
|
| 151 |
+
|
| 152 |
+
gibst.
|
| 153 |
+
|
| 154 |
+
Warum?
|
| 155 |
+
Weil solche Modelle in terminalnahen Coding-Setups oft sehr gut sind in:
|
| 156 |
+
|
| 157 |
+
* Codebase lesen
|
| 158 |
+
* Plan bilden
|
| 159 |
+
* große semantische Bögen halten
|
| 160 |
+
* brauchbare Refactors und Synthesen formulieren
|
| 161 |
+
|
| 162 |
+
Aber sie neigen eher dazu,
|
| 163 |
+
|
| 164 |
+
* zu viel global zu denken,
|
| 165 |
+
* zu früh zu synthetisieren,
|
| 166 |
+
* Dinge elegant zu glätten,
|
| 167 |
+
* und lokale Grounding-Grenzen zu überschreiten.
|
| 168 |
+
|
| 169 |
+
Für Opus-artige Modelle ist daher oft wichtig:
|
| 170 |
+
|
| 171 |
+
* **weniger Prozessbürokratie als bei schwächeren Modellen**
|
| 172 |
+
* aber **starke epistemische Regeln**
|
| 173 |
+
* also: “erfinde nichts, markiere Unsicherheit, halte lokale und globale Ebenen getrennt”.
|
| 174 |
+
|
| 175 |
+
---
|
| 176 |
+
|
| 177 |
+
# 4. Was sich beim Modell ändert
|
| 178 |
+
|
| 179 |
+
Jetzt zum Kern.
|
| 180 |
+
|
| 181 |
+
## Minimax M2.7
|
| 182 |
+
|
| 183 |
+
Aus deinem Experimentbild heraus würde ich Minimax so behandeln:
|
| 184 |
+
|
| 185 |
+
**Stärken**
|
| 186 |
+
|
| 187 |
+
* schnell
|
| 188 |
+
* produktiv
|
| 189 |
+
* kann gute Makrostruktur simulieren
|
| 190 |
+
* kann erstaunlich starke zusammenhängende Texte bauen
|
| 191 |
+
|
| 192 |
+
**Risiken**
|
| 193 |
+
|
| 194 |
+
* wirkt überzeugender als es geerdet ist
|
| 195 |
+
* füllt Lücken mit plausibler Prosa
|
| 196 |
+
* macht aggressive narrative Glättung
|
| 197 |
+
* braucht härtere lokale Begrenzung
|
| 198 |
+
* braucht stärkere Fact-Check-Schicht
|
| 199 |
+
|
| 200 |
+
Deshalb muss der Prompt für Minimax:
|
| 201 |
+
|
| 202 |
+
* **expliziter**
|
| 203 |
+
* **enger**
|
| 204 |
+
* **rollenstärker**
|
| 205 |
+
* **anti-hallucination-lastiger**
|
| 206 |
+
* **stärker datei- und formatgesteuert**
|
| 207 |
+
|
| 208 |
+
sein.
|
| 209 |
+
|
| 210 |
+
Mit Minimax promptest du mehr wie:
|
| 211 |
+
|
| 212 |
+
> “Hier ist das Geländer. Hier sind die Wände. Hier darfst du laufen. Hier nicht.”
|
| 213 |
+
|
| 214 |
+
## GPT-5.4
|
| 215 |
+
|
| 216 |
+
OpenAI beschreibt GPT-5.4 als stark für agentische, coding-lastige und professionelle Workflows; die offiziellen Prompt-Guides betonen Verifikationsschleifen, Structured Outputs und Tool-Persistence, und OpenAI sagt, dass `gpt-5.4` in Codex für die meisten Aufgaben der sinnvolle Startpunkt ist. ([OpenAI Entwickler][2])
|
| 217 |
+
|
| 218 |
+
Was heißt das praktisch?
|
| 219 |
+
|
| 220 |
+
GPT-5.4 braucht oft:
|
| 221 |
+
|
| 222 |
+
* **klaren Endzustand**
|
| 223 |
+
* **klare Prüfkriterien**
|
| 224 |
+
* **saubere Phasen**
|
| 225 |
+
* **weniger redundante Wiederholung**
|
| 226 |
+
* **weniger defensive Überinstruktion**
|
| 227 |
+
|
| 228 |
+
Es verträgt eher:
|
| 229 |
+
|
| 230 |
+
* “hier ist der Job, hier sind die Artefakte, hier sind die Qualitätsgates, arbeite sauber”
|
| 231 |
+
|
| 232 |
+
als
|
| 233 |
+
|
| 234 |
+
* 200 Zeilen Micromanagement.
|
| 235 |
+
|
| 236 |
+
Wenn du GPT-5.4 wie ein kleines Modell behandelst, schadest du oft:
|
| 237 |
+
|
| 238 |
+
* es wird schwerfällig,
|
| 239 |
+
* formalistisch,
|
| 240 |
+
* manchmal unnötig rigid,
|
| 241 |
+
* und verbringt zu viel Energie mit dem Befolgen des Metaprozesses statt mit dem Kernproblem.
|
| 242 |
+
|
| 243 |
+
Mit GPT-5.4 promptest du mehr wie:
|
| 244 |
+
|
| 245 |
+
> “Hier ist die Mission, hier ist der Qualitätsrahmen, zeig mir robuste Execution.”
|
| 246 |
+
|
| 247 |
+
## Opus 4.6
|
| 248 |
+
|
| 249 |
+
Für Opus-artige große reasoning/stylistic Modelle würde ich sagen:
|
| 250 |
+
|
| 251 |
+
Sie profitieren oft von:
|
| 252 |
+
|
| 253 |
+
* **Prinzipien**
|
| 254 |
+
* **Review-Disziplin**
|
| 255 |
+
* **hochrangiger Zieldefinition**
|
| 256 |
+
* **epistemischen Grenzen**
|
| 257 |
+
* **klaren Stop-Regeln**
|
| 258 |
+
|
| 259 |
+
Sie brauchen nicht unbedingt jeden Formatcontainer ausbuchstabiert,
|
| 260 |
+
aber sie brauchen sehr wohl:
|
| 261 |
+
|
| 262 |
+
* “nicht ausschmücken”
|
| 263 |
+
* “nicht psychologisieren”
|
| 264 |
+
* “keine historischen Schlüsse ohne Deckung”
|
| 265 |
+
* “keine globale Synthese vor lokaler Extraktion”
|
| 266 |
+
|
| 267 |
+
Mit Opus promptest du oft mehr wie:
|
| 268 |
+
|
| 269 |
+
> “Arbeite wie ein guter Senior Analyst mit starker Selbstdisziplin.”
|
| 270 |
+
|
| 271 |
+
---
|
| 272 |
+
|
| 273 |
+
# 5. Das Entscheidende: derselbe Task, drei verschiedene Prompt-Stile
|
| 274 |
+
|
| 275 |
+
Jetzt wird es konkret.
|
| 276 |
+
|
| 277 |
+
---
|
| 278 |
+
|
| 279 |
+
## Prompt-Stil für Codex + GPT-5.4
|
| 280 |
+
|
| 281 |
+
Hier würde ich **Outcome-first + Verification-first** prompten.
|
| 282 |
+
|
| 283 |
+
### Charakter
|
| 284 |
+
|
| 285 |
+
* klar
|
| 286 |
+
* knapp
|
| 287 |
+
* professionell
|
| 288 |
+
* deliverable-orientiert
|
| 289 |
+
* mit Qualitätsgates
|
| 290 |
+
* nicht zu überfrachtet
|
| 291 |
+
|
| 292 |
+
### Beispiel
|
| 293 |
+
|
| 294 |
+
```text
|
| 295 |
+
Task:
|
| 296 |
+
Summarize the uploaded Heidelberg Castle guide into a source-faithful Markdown document that can later be rendered into a ~15-page PDF.
|
| 297 |
+
|
| 298 |
+
Context:
|
| 299 |
+
This is not a linear book. It is a modular guide for castle tours with four top-level modules:
|
| 300 |
+
1. History
|
| 301 |
+
2. Architecture
|
| 302 |
+
3. Personalities
|
| 303 |
+
4. Cultural history
|
| 304 |
+
|
| 305 |
+
Required workflow:
|
| 306 |
+
1. Read the document structure and create a semantic chunk plan.
|
| 307 |
+
2. Summarize each chunk locally before attempting any global synthesis.
|
| 308 |
+
3. Run verification passes for chronology, person/title consistency, and architecture/building attribution.
|
| 309 |
+
4. Merge the verified local summaries into a single coherent Markdown summary.
|
| 310 |
+
5. Create a shell script that renders the Markdown to PDF.
|
| 311 |
+
|
| 312 |
+
Deliverables:
|
| 313 |
+
- work/document_map.md
|
| 314 |
+
- work/chunk_plan.md
|
| 315 |
+
- work/local_summaries/*.md
|
| 316 |
+
- work/checks/chronology.md
|
| 317 |
+
- work/checks/persons.md
|
| 318 |
+
- work/checks/architecture.md
|
| 319 |
+
- output/summary_15_pages.md
|
| 320 |
+
- output/render_pdf.sh
|
| 321 |
+
|
| 322 |
+
Quality bar:
|
| 323 |
+
- Source-faithful
|
| 324 |
+
- No invented facts
|
| 325 |
+
- No decorative filler
|
| 326 |
+
- Preserve uncertainty where the source is ambiguous
|
| 327 |
+
- Prioritize “key facts” sections from the source
|
| 328 |
+
- Final summary should reflect the source’s didactic structure, not flatten it into generic prose
|
| 329 |
+
|
| 330 |
+
Before finalizing:
|
| 331 |
+
- verify dates
|
| 332 |
+
- verify ruler/person mappings
|
| 333 |
+
- verify building-to-builder mappings
|
| 334 |
+
- remove claims that are plausible but not clearly grounded in the source
|
| 335 |
+
```
|
| 336 |
+
|
| 337 |
+
### Warum so?
|
| 338 |
+
|
| 339 |
+
Weil GPT-5.4 stark genug ist, den Workflow zu tragen, wenn du ihm gibst:
|
| 340 |
+
|
| 341 |
+
* Ziel
|
| 342 |
+
* Arbeitsweise
|
| 343 |
+
* Prüfkriterien
|
| 344 |
+
* Artefakte.
|
| 345 |
+
|
| 346 |
+
Du musst es nicht so stark “einsargen” wie Minimax.
|
| 347 |
+
|
| 348 |
+
---
|
| 349 |
+
|
| 350 |
+
## Prompt-Stil für Claude Code + Opus 4.6
|
| 351 |
+
|
| 352 |
+
Hier würde ich **Plan-first + Principle-first** prompten.
|
| 353 |
+
|
| 354 |
+
### Charakter
|
| 355 |
+
|
| 356 |
+
* etwas semantischer
|
| 357 |
+
* etwas analytischer
|
| 358 |
+
* mehr Betonung auf Denkdisziplin
|
| 359 |
+
* weniger auf starre Formatbürokratie
|
| 360 |
+
* aber mit starken epistemischen Regeln
|
| 361 |
+
|
| 362 |
+
### Beispiel
|
| 363 |
+
|
| 364 |
+
```text
|
| 365 |
+
You are producing a source-faithful analytical summary of a long Heidelberg Castle guide.
|
| 366 |
+
|
| 367 |
+
This source is modular, not linear. Treat it as a structured teaching document, not as a conventional narrative book. Its top-level modules are history, architecture, personalities, and cultural history.
|
| 368 |
+
|
| 369 |
+
Working method:
|
| 370 |
+
- First map the document structure.
|
| 371 |
+
- Then produce local summaries for semantically coherent sections.
|
| 372 |
+
- Do not jump to global synthesis early.
|
| 373 |
+
- After local extraction, perform explicit review passes:
|
| 374 |
+
- chronology
|
| 375 |
+
- person/title consistency
|
| 376 |
+
- building/builder attribution
|
| 377 |
+
- source faithfulness
|
| 378 |
+
- Only then write the final consolidated summary.
|
| 379 |
+
|
| 380 |
+
Important rules:
|
| 381 |
+
- Do not invent transitions or historical motives.
|
| 382 |
+
- Do not turn plausible inferences into assertions.
|
| 383 |
+
- Do not smooth over ambiguities.
|
| 384 |
+
- Respect the source’s didactic emphasis, especially explicit key facts.
|
| 385 |
+
- Keep architecture, political history, and reception history distinct until the consolidation phase.
|
| 386 |
+
|
| 387 |
+
Outputs:
|
| 388 |
+
- a document map
|
| 389 |
+
- a chunk plan
|
| 390 |
+
- local section summaries
|
| 391 |
+
- review notes
|
| 392 |
+
- a final ~15-page Markdown summary
|
| 393 |
+
- a shell script to render it to PDF
|
| 394 |
+
|
| 395 |
+
Write densely and clearly. Prefer precision over flourish.
|
| 396 |
+
```
|
| 397 |
+
|
| 398 |
+
### Warum so?
|
| 399 |
+
|
| 400 |
+
Weil Opus-artige Modelle oft stark sind, wenn du ihnen:
|
| 401 |
+
|
| 402 |
+
* semantische Disziplin,
|
| 403 |
+
* epistemische Strenge,
|
| 404 |
+
* Review-Phasen,
|
| 405 |
+
* und klare High-Level-Prinzipien gibst.
|
| 406 |
+
|
| 407 |
+
---
|
| 408 |
+
|
| 409 |
+
## Prompt-Stil für OpenCode + Minimax M2.7
|
| 410 |
+
|
| 411 |
+
Hier würde ich **Workflow-first + Guardrail-first + Subagent-first** prompten.
|
| 412 |
+
|
| 413 |
+
### Charakter
|
| 414 |
+
|
| 415 |
+
* explizit
|
| 416 |
+
* streng modular
|
| 417 |
+
* harte Agententrennung
|
| 418 |
+
* formale Outputs
|
| 419 |
+
* Anti-Halluzinationsblock
|
| 420 |
+
* Anti-Slop-Block
|
| 421 |
+
* Parallelitätsregeln
|
| 422 |
+
|
| 423 |
+
### Beispiel
|
| 424 |
+
|
| 425 |
+
```text
|
| 426 |
+
You are running a multi-agent workflow.
|
| 427 |
+
|
| 428 |
+
Goal:
|
| 429 |
+
Create a source-faithful 15-page Markdown summary of the Heidelberg Castle guide and a shell script to render it to PDF.
|
| 430 |
+
|
| 431 |
+
This is a modular guide, not a linear book.
|
| 432 |
+
Primary modules:
|
| 433 |
+
1. History
|
| 434 |
+
2. Architecture
|
| 435 |
+
3. Personalities
|
| 436 |
+
4. Cultural history
|
| 437 |
+
|
| 438 |
+
Agent roles:
|
| 439 |
+
- Orchestrator
|
| 440 |
+
- Structure agent
|
| 441 |
+
- Local content agents
|
| 442 |
+
- Chronology check agent
|
| 443 |
+
- Person/dynasty check agent
|
| 444 |
+
- Architecture check agent
|
| 445 |
+
- Merge agent
|
| 446 |
+
- Editor agent
|
| 447 |
+
- Build agent
|
| 448 |
+
|
| 449 |
+
Hard rules:
|
| 450 |
+
- Local content agents may only use their assigned chunk.
|
| 451 |
+
- No agent may write to another agent’s file.
|
| 452 |
+
- Only merge/editor agents may create global synthesis.
|
| 453 |
+
- Any uncertain claim must be marked as uncertain.
|
| 454 |
+
- Any claim not clearly grounded in the source must be removed from the final summary.
|
| 455 |
+
|
| 456 |
+
Required outputs:
|
| 457 |
+
- work/00_document_map.md
|
| 458 |
+
- work/01_chunk_plan.md
|
| 459 |
+
- work/02_local_summaries/chunk_*.md
|
| 460 |
+
- work/03_cross_checks/*.md
|
| 461 |
+
- work/04_global_outline.md
|
| 462 |
+
- output/summary_15_pages.md
|
| 463 |
+
- output/render_pdf.sh
|
| 464 |
+
|
| 465 |
+
Anti-hallucination rules:
|
| 466 |
+
- no invented dates
|
| 467 |
+
- no invented motives
|
| 468 |
+
- no unsupported architectural labels
|
| 469 |
+
- no elegant filler
|
| 470 |
+
- no generic culture-language
|
| 471 |
+
- no importing facts across chunks during local summarization
|
| 472 |
+
|
| 473 |
+
Parallel execution:
|
| 474 |
+
- run local content agents in parallel on independent semantic chunks
|
| 475 |
+
- run cross-check agents in parallel after all local summaries exist
|
| 476 |
+
- avoid shared write targets
|
| 477 |
+
```
|
| 478 |
+
|
| 479 |
+
### Warum so?
|
| 480 |
+
|
| 481 |
+
Weil Minimax sonst mit hoher Wahrscheinlichkeit:
|
| 482 |
+
|
| 483 |
+
* zu früh global synthetisiert,
|
| 484 |
+
* zu viel selbst ergänzt,
|
| 485 |
+
* und dann sehr überzeugend falsch wird.
|
| 486 |
+
|
| 487 |
+
---
|
| 488 |
+
|
| 489 |
+
# 6. Also: Wie muss der Prompt aussehen für welches Harness?
|
| 490 |
+
|
| 491 |
+
Hier ist die Faustregel:
|
| 492 |
+
|
| 493 |
+
## Für Harnesses mit starker Agent-Orchestrierung
|
| 494 |
+
|
| 495 |
+
Prompt muss enthalten:
|
| 496 |
+
|
| 497 |
+
* Rollen
|
| 498 |
+
* Artefakte
|
| 499 |
+
* Zuständigkeiten
|
| 500 |
+
* Abhängigkeiten
|
| 501 |
+
* Parallelitätsregeln
|
| 502 |
+
* Merge-/Check-Phasen
|
| 503 |
+
|
| 504 |
+
## Für Harnesses mit starkem Modell und guter Tool-Disziplin
|
| 505 |
+
|
| 506 |
+
Prompt muss enthalten:
|
| 507 |
+
|
| 508 |
+
* Ziel
|
| 509 |
+
* Constraints
|
| 510 |
+
* Deliverables
|
| 511 |
+
* Verification gates
|
| 512 |
+
* Stoppregeln
|
| 513 |
+
|
| 514 |
+
## Für terminalnahe, planstarke Harnesses
|
| 515 |
+
|
| 516 |
+
Prompt muss enthalten:
|
| 517 |
+
|
| 518 |
+
* Zielbild
|
| 519 |
+
* epistemische Leitplanken
|
| 520 |
+
* Plan- und Review-Disziplin
|
| 521 |
+
* wenige harte Qualitätsregeln
|
| 522 |
+
* keine unnötige Prozessverstopfung
|
| 523 |
+
|
| 524 |
+
---
|
| 525 |
+
|
| 526 |
+
# 7. Also: Wie muss der Prompt aussehen für welches Modell?
|
| 527 |
+
|
| 528 |
+
Noch kürzer:
|
| 529 |
+
|
| 530 |
+
## Schwächer / glatter / riskanter schreibende Modelle
|
| 531 |
+
|
| 532 |
+
Mehr:
|
| 533 |
+
|
| 534 |
+
* Struktur
|
| 535 |
+
* Format
|
| 536 |
+
* Regelhaftigkeit
|
| 537 |
+
* Cross-checking
|
| 538 |
+
* harte Lokalität
|
| 539 |
+
* starke Negativregeln
|
| 540 |
+
|
| 541 |
+
## Stärkere reasoning-heavy Modelle
|
| 542 |
+
|
| 543 |
+
Mehr:
|
| 544 |
+
|
| 545 |
+
* Zielklarheit
|
| 546 |
+
* Qualitätsgates
|
| 547 |
+
* epistemische Regeln
|
| 548 |
+
* weniger Mikromanagement
|
| 549 |
+
* mehr Verantwortung beim Modell
|
| 550 |
+
|
| 551 |
+
---
|
| 552 |
+
|
| 553 |
+
# 8. Woher weiß man das?
|
| 554 |
+
|
| 555 |
+
Das ist die Kernfrage.
|
| 556 |
+
|
| 557 |
+
Nicht durch Magie.
|
| 558 |
+
Nicht durch “Prompting ist Kunst”.
|
| 559 |
+
Sondern durch **Eval-getriebene Modellierung**.
|
| 560 |
+
|
| 561 |
+
Du weißt es aus vier Quellen:
|
| 562 |
+
|
| 563 |
+
## 1. Offizielle Dokumentation
|
| 564 |
+
|
| 565 |
+
Für GPT-5.4 und Codex ist das direkt nützlich: OpenAI dokumentiert, dass Codex ein Coding-Agent ist, für die meisten Codex-Aufgaben `gpt-5.4` der Startpunkt ist und GPT-5.4 gut mit Verifikationsschleifen, strukturierten Outputs und Tool-orientierten Arbeitsweisen harmoniert. ([OpenAI Entwickler][1])
|
| 566 |
+
|
| 567 |
+
Das ist dein **Prior**.
|
| 568 |
+
|
| 569 |
+
## 2. Harness-Verhalten beobachten
|
| 570 |
+
|
| 571 |
+
Du siehst in echten Läufen:
|
| 572 |
+
|
| 573 |
+
* wann das Modell zu früh synthetisiert
|
| 574 |
+
* wann es lokale Grenzen missachtet
|
| 575 |
+
* wann es Tool-Calls vergisst
|
| 576 |
+
* wann es in langen Tasks entgleist
|
| 577 |
+
* wann es zu chatty oder zu knapp wird
|
| 578 |
+
|
| 579 |
+
Das ist dein **Runtime-Profil**.
|
| 580 |
+
|
| 581 |
+
## 3. Fehlerkataloge bauen
|
| 582 |
+
|
| 583 |
+
Für jedes Modell/Harness-Paar solltest du fast wie in einem Labor notieren:
|
| 584 |
+
|
| 585 |
+
* typische Halluzinationen
|
| 586 |
+
* typische Strukturfehler
|
| 587 |
+
* typische Tempo-/Kostenmuster
|
| 588 |
+
* typische Missverständnisse
|
| 589 |
+
* typische Stärken
|
| 590 |
+
|
| 591 |
+
Dann promptest du nicht mehr abstrakt, sondern gezielt gegen Fehler.
|
| 592 |
+
|
| 593 |
+
## 4. Kleine kontrollierte Evals
|
| 594 |
+
|
| 595 |
+
Das ist der wichtigste Punkt.
|
| 596 |
+
|
| 597 |
+
Du machst nicht “große Gefühle”, sondern kleine Benchmarks:
|
| 598 |
+
|
| 599 |
+
* 5 ähnliche PDFs
|
| 600 |
+
* gleiche Task Spec
|
| 601 |
+
* drei Promptvarianten
|
| 602 |
+
* drei Modelle
|
| 603 |
+
* Score auf:
|
| 604 |
+
|
| 605 |
+
* Faithfulness
|
| 606 |
+
* Coverage
|
| 607 |
+
* Dedup
|
| 608 |
+
* Coherence
|
| 609 |
+
* Hallucination rate
|
| 610 |
+
* Time
|
| 611 |
+
* Cost
|
| 612 |
+
|
| 613 |
+
Dann siehst du:
|
| 614 |
+
|
| 615 |
+
* welches Modell mehr Freiheit verträgt
|
| 616 |
+
* welches Modell mehr Geländer braucht
|
| 617 |
+
* welches Harness welche Promptform am besten umsetzt
|
| 618 |
+
|
| 619 |
+
---
|
| 620 |
+
|
| 621 |
+
# 9. Woher weiß *ich*, wie ich den Prompt schreiben muss?
|
| 622 |
+
|
| 623 |
+
Nicht sicher im absoluten Sinn.
|
| 624 |
+
Sondern durch eine Mischung aus:
|
| 625 |
+
|
| 626 |
+
* allgemeiner Agent-/Prompt-Engineering-Heuristik,
|
| 627 |
+
* beobachteten Fehlermustern,
|
| 628 |
+
* Dokumenttyp-Erkennung,
|
| 629 |
+
* und Anpassung an das wahrscheinliche Stärken-/Schwächenprofil von Modell + Harness.
|
| 630 |
+
|
| 631 |
+
Also nicht:
|
| 632 |
+
|
| 633 |
+
> “Ich kenne den perfekten Prompt.”
|
| 634 |
+
|
| 635 |
+
Sondern:
|
| 636 |
+
|
| 637 |
+
> “Ich versuche, die wahrscheinlichsten Failure Modes dieses Setups im Voraus zu neutralisieren.”
|
| 638 |
+
|
| 639 |
+
Das ist der professionelle Frame.
|
| 640 |
+
|
| 641 |
+
---
|
| 642 |
+
|
| 643 |
+
# 10. Was ein AI Engineer daraus machen sollte
|
| 644 |
+
|
| 645 |
+
Wenn du das ernsthaft können willst, dann bau dir diese Arbeitsweise:
|
| 646 |
+
|
| 647 |
+
## Immer drei Artefakte trennen
|
| 648 |
+
|
| 649 |
+
1. **task_spec.md**
|
| 650 |
+
2. **harness_policy.md**
|
| 651 |
+
3. **model_adapter.md**
|
| 652 |
+
|
| 653 |
+
Dann kombinierst du sie je nach Lauf.
|
| 654 |
+
|
| 655 |
+
Beispiel:
|
| 656 |
+
|
| 657 |
+
### task_spec.md
|
| 658 |
+
|
| 659 |
+
* PDF zusammenfassen
|
| 660 |
+
* semantische Chunks
|
| 661 |
+
* lokale Summaries
|
| 662 |
+
* globale Konsolidierung
|
| 663 |
+
* Markdown + PDF script
|
| 664 |
+
|
| 665 |
+
### harness_policy_opencode.md
|
| 666 |
+
|
| 667 |
+
* Subagents
|
| 668 |
+
* Parallelität
|
| 669 |
+
* Dateibesitz
|
| 670 |
+
* Merge-Phase
|
| 671 |
+
* Check-Phase
|
| 672 |
+
|
| 673 |
+
### model_adapter_minimax.md
|
| 674 |
+
|
| 675 |
+
* stärker explizit
|
| 676 |
+
* Anti-Halluzination
|
| 677 |
+
* harte Formatdisziplin
|
| 678 |
+
|
| 679 |
+
### model_adapter_gpt54.md
|
| 680 |
+
|
| 681 |
+
* outcome-first
|
| 682 |
+
* verification-first
|
| 683 |
+
* weniger Micromanagement
|
| 684 |
+
|
| 685 |
+
### model_adapter_opus46.md
|
| 686 |
+
|
| 687 |
+
* principle-first
|
| 688 |
+
* review-first
|
| 689 |
+
* epistemische Strenge
|
| 690 |
+
|
| 691 |
+
Dann hast du echte **Prompt-Architektur**, nicht nur einzelne Texte.
|
| 692 |
+
|
| 693 |
+
---
|
| 694 |
+
|
| 695 |
+
# 11. Meine verdichtete Theorie in einem Satz
|
| 696 |
+
|
| 697 |
+
**Der richtige Prompt ist nicht nur eine Eigenschaft des Modells, sondern die Schnittstelle zwischen Taskstruktur, Harnessmechanik und Fehlertyp des Modells.**
|
| 698 |
+
|
| 699 |
+
Das ist der Übergang von “gut prompten” zu **AI Engineering**.
|
| 700 |
+
|
| 701 |
+
---
|
| 702 |
+
|
| 703 |
+
# 12. Mein praktischer Rat für dich
|
| 704 |
+
|
| 705 |
+
Wenn du in diese Richtung willst, dann fang an, für jede Agent-Aufgabe systematisch zu dokumentieren:
|
| 706 |
+
|
| 707 |
+
* Dokumenttyp
|
| 708 |
+
* Task Spec
|
| 709 |
+
* Harness
|
| 710 |
+
* Modell
|
| 711 |
+
* Promptversion
|
| 712 |
+
* Fehlerbilder
|
| 713 |
+
* Kosten
|
| 714 |
+
* Dauer
|
| 715 |
+
* Ergebnisqualität
|
| 716 |
+
* nächste Hypothese
|
| 717 |
+
|
| 718 |
+
Dann baust du dir dein eigenes internes **Prompt- und Harness-Wissenssystem**.
|
| 719 |
+
Genau daraus entsteht später dein echter Vorteil gegenüber Leuten, die nur “ein bisschen mit Modellen rumspielen”.
|
| 720 |
+
|
| 721 |
+
Wenn du willst, mache ich dir als Nächstes daraus ein **konkretes AI-Engineer-Template-Set**:
|
| 722 |
+
|
| 723 |
+
* `task_spec.md`
|
| 724 |
+
* `harness_policy_opencode.md`
|
| 725 |
+
* `harness_policy_codex.md`
|
| 726 |
+
* `harness_policy_claudecode.md`
|
| 727 |
+
* `model_adapter_minimax.md`
|
| 728 |
+
* `model_adapter_gpt54.md`
|
| 729 |
+
* `model_adapter_opus46.md`
|
| 730 |
+
* plus eine kleine Eval-Rubric.
|
| 731 |
+
|
| 732 |
+
[1]: https://developers.openai.com/codex/?utm_source=chatgpt.com "Codex"
|
| 733 |
+
[2]: https://developers.openai.com/api/docs/models/gpt-5.4?utm_source=chatgpt.com "GPT-5.4 Model | OpenAI API"
|
| 734 |
+
|
registry/adapters/agentide.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "AdapterManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"adapter_id": "agentide_adapter",
|
| 5 |
+
"source_system": "AgentIDE",
|
| 6 |
+
"role": "operator_entrypoint",
|
| 7 |
+
"reads": ["RunRecord", "SpineEvent", "ArtifactManifest", "ExecutionStatus"],
|
| 8 |
+
"writes": ["TaskRequest"],
|
| 9 |
+
"guarantees": [
|
| 10 |
+
"Creates canonical task requests",
|
| 11 |
+
"Consumes live run state without inventing new statuses",
|
| 12 |
+
"Treats Spine as source of truth for run reconstruction"
|
| 13 |
+
]
|
| 14 |
+
}
|
registry/adapters/harnessecosystem.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "AdapterManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"adapter_id": "harnessecosystem_adapter",
|
| 5 |
+
"source_system": "HarnessEcosystem",
|
| 6 |
+
"role": "observability_feed",
|
| 7 |
+
"reads": ["SystemManifest", "RunRecord", "EvalRecord", "ArtifactManifest"],
|
| 8 |
+
"writes": [],
|
| 9 |
+
"guarantees": [
|
| 10 |
+
"Builds presentational feeds from canonical registry and outcomes",
|
| 11 |
+
"Does not become source of truth for contracts",
|
| 12 |
+
"Can regenerate snapshots without hand-edited semantic drift"
|
| 13 |
+
]
|
| 14 |
+
}
|
registry/adapters/komandozentral.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "AdapterManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"adapter_id": "komandozentral_adapter",
|
| 5 |
+
"source_system": "KomandoZentral",
|
| 6 |
+
"role": "decision_ingestion",
|
| 7 |
+
"reads": ["TaskRequest"],
|
| 8 |
+
"writes": ["RoutingDecision", "SpineEvent"],
|
| 9 |
+
"guarantees": [
|
| 10 |
+
"Maps routing output into canonical decision schema",
|
| 11 |
+
"Does not dispatch execution directly",
|
| 12 |
+
"Preserves decision policy version"
|
| 13 |
+
]
|
| 14 |
+
}
|
registry/adapters/metametameta.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "AdapterManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"adapter_id": "metametameta_adapter",
|
| 5 |
+
"source_system": "MetaMetaMeta",
|
| 6 |
+
"role": "evidence_ingestion",
|
| 7 |
+
"reads": ["RunRecord", "SpineEvent", "ArtifactManifest", "EvalRecord"],
|
| 8 |
+
"writes": ["EvalRecord"],
|
| 9 |
+
"guarantees": [
|
| 10 |
+
"Preserves provenance of eval results",
|
| 11 |
+
"Does not mutate runtime state",
|
| 12 |
+
"Emits derived evidence in canonical format"
|
| 13 |
+
]
|
| 14 |
+
}
|
registry/adapters/ueber_agent.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "AdapterManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"adapter_id": "ueber_agent_adapter",
|
| 5 |
+
"source_system": "UEBER_AGENT",
|
| 6 |
+
"role": "execution_bridge",
|
| 7 |
+
"reads": ["ExecutionRequest"],
|
| 8 |
+
"writes": ["ExecutionStatus", "RouteTrace", "ArtifactManifest", "SpineEvent"],
|
| 9 |
+
"guarantees": [
|
| 10 |
+
"Translates runtime events into append-only Spine events",
|
| 11 |
+
"Preserves execution and route trace identifiers",
|
| 12 |
+
"Does not reinterpret decision semantics"
|
| 13 |
+
]
|
| 14 |
+
}
|
registry/harnesses/claude-code.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "HarnessManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"harness_id": "claude-code",
|
| 5 |
+
"name": "Claude Code",
|
| 6 |
+
"status": "active",
|
| 7 |
+
"runtime_target": "claude-code-local",
|
| 8 |
+
"accepts": ["TaskRequest", "ExecutionRequest"],
|
| 9 |
+
"emits": ["ExecutionStatus", "ArtifactManifest", "EvalRecord"],
|
| 10 |
+
"constraints": [
|
| 11 |
+
"High cost profile",
|
| 12 |
+
"Strong architecture and deep codebase work",
|
| 13 |
+
"Interactive terminal workflow"
|
| 14 |
+
],
|
| 15 |
+
"cost_class": "high",
|
| 16 |
+
"trust_level": "trusted",
|
| 17 |
+
"best_for": ["architecture", "planning", "full-codebase analysis"]
|
| 18 |
+
}
|
registry/harnesses/codex-cli.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "HarnessManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"harness_id": "codex-cli",
|
| 5 |
+
"name": "Codex CLI",
|
| 6 |
+
"status": "active",
|
| 7 |
+
"runtime_target": "claude-code-local",
|
| 8 |
+
"accepts": ["TaskRequest", "ExecutionRequest"],
|
| 9 |
+
"emits": ["ExecutionStatus", "ArtifactManifest"],
|
| 10 |
+
"constraints": [
|
| 11 |
+
"Strong terminal-centric coding",
|
| 12 |
+
"Needs explicit deliverables and verification",
|
| 13 |
+
"No assumption of cross-system orchestration by default"
|
| 14 |
+
],
|
| 15 |
+
"cost_class": "medium",
|
| 16 |
+
"trust_level": "normal",
|
| 17 |
+
"best_for": ["scripts", "terminal automation", "polishing"]
|
| 18 |
+
}
|
registry/harnesses/hermes.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "HarnessManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"harness_id": "hermes",
|
| 5 |
+
"name": "Hermes",
|
| 6 |
+
"status": "active",
|
| 7 |
+
"runtime_target": "ueber-agent-openclaw-vm",
|
| 8 |
+
"accepts": ["ExecutionRequest"],
|
| 9 |
+
"emits": ["ExecutionStatus", "RouteTrace", "ArtifactManifest"],
|
| 10 |
+
"constraints": [
|
| 11 |
+
"Cheap iterative workhorse",
|
| 12 |
+
"Needs explicit cwd and artifact boundaries",
|
| 13 |
+
"No Spine-side assumption of strong guardrails"
|
| 14 |
+
],
|
| 15 |
+
"cost_class": "low",
|
| 16 |
+
"trust_level": "guarded",
|
| 17 |
+
"best_for": ["implementation", "docs", "cheap iteration"]
|
| 18 |
+
}
|
registry/harnesses/opencode.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "HarnessManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"harness_id": "opencode",
|
| 5 |
+
"name": "OpenCode",
|
| 6 |
+
"status": "experimental",
|
| 7 |
+
"runtime_target": "ueber-agent-openclaw-vm",
|
| 8 |
+
"accepts": ["ExecutionRequest"],
|
| 9 |
+
"emits": ["ExecutionStatus", "ArtifactManifest"],
|
| 10 |
+
"constraints": [
|
| 11 |
+
"Useful for isolated execution",
|
| 12 |
+
"Known scope-drift risk",
|
| 13 |
+
"Requires strong ownership and artifact contracts"
|
| 14 |
+
],
|
| 15 |
+
"cost_class": "low",
|
| 16 |
+
"trust_level": "guarded",
|
| 17 |
+
"best_for": ["isolated bugfixes", "parallel agent work"]
|
| 18 |
+
}
|
registry/system_manifest.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_name": "SystemManifest",
|
| 3 |
+
"schema_version": "1.0.0",
|
| 4 |
+
"system_id": "multi_harness_spine",
|
| 5 |
+
"name": "MultiHarness Spine",
|
| 6 |
+
"description": "Canonical integration spine for evidence, routing, execution, UI and observability layers.",
|
| 7 |
+
"created_at": "2026-04-08T16:00:00Z",
|
| 8 |
+
"source_projects": [
|
| 9 |
+
{
|
| 10 |
+
"project_id": "metametameta",
|
| 11 |
+
"role": "evidence_layer",
|
| 12 |
+
"path": "/home/smlflg/Projekte/MetaMetaMeta"
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"project_id": "komandozentral",
|
| 16 |
+
"role": "decision_layer",
|
| 17 |
+
"path": "/home/smlflg/Projekte/KomandoZentral"
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
"project_id": "ueber_agent",
|
| 21 |
+
"role": "execution_layer",
|
| 22 |
+
"path": "/home/smlflg/Projekte/UEBER_AGENT"
|
| 23 |
+
},
|
| 24 |
+
{
|
| 25 |
+
"project_id": "agentide",
|
| 26 |
+
"role": "operator_ui",
|
| 27 |
+
"path": "/home/smlflg/Projekte/AgentIDE"
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
"project_id": "harnessecosystem",
|
| 31 |
+
"role": "observatory_layer",
|
| 32 |
+
"path": "/home/smlflg/Projekte/HarnessEcosystem"
|
| 33 |
+
}
|
| 34 |
+
],
|
| 35 |
+
"runtime_targets": [
|
| 36 |
+
"claude-code-local",
|
| 37 |
+
"ueber-agent-openclaw-vm",
|
| 38 |
+
"agentide-local-ui"
|
| 39 |
+
],
|
| 40 |
+
"schema_inventory": [
|
| 41 |
+
"OperatorContext",
|
| 42 |
+
"TaskRequest",
|
| 43 |
+
"RoutingDecision",
|
| 44 |
+
"RunRecord",
|
| 45 |
+
"ExecutionRequest",
|
| 46 |
+
"ExecutionStatus",
|
| 47 |
+
"RouteTrace",
|
| 48 |
+
"ArtifactManifest",
|
| 49 |
+
"EvalRecord",
|
| 50 |
+
"SpineEvent",
|
| 51 |
+
"SystemManifest",
|
| 52 |
+
"HarnessManifest",
|
| 53 |
+
"AdapterManifest"
|
| 54 |
+
]
|
| 55 |
+
}
|
schemas/adapter_manifest.schema.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:adapter_manifest",
|
| 4 |
+
"title": "AdapterManifest",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"adapter_id",
|
| 10 |
+
"source_system",
|
| 11 |
+
"role",
|
| 12 |
+
"reads",
|
| 13 |
+
"writes",
|
| 14 |
+
"guarantees"
|
| 15 |
+
],
|
| 16 |
+
"properties": {
|
| 17 |
+
"schema_name": { "const": "AdapterManifest" },
|
| 18 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 19 |
+
"adapter_id": { "type": "string", "minLength": 1 },
|
| 20 |
+
"source_system": { "type": "string", "minLength": 1 },
|
| 21 |
+
"role": { "type": "string", "minLength": 1 },
|
| 22 |
+
"reads": {
|
| 23 |
+
"type": "array",
|
| 24 |
+
"items": { "type": "string" }
|
| 25 |
+
},
|
| 26 |
+
"writes": {
|
| 27 |
+
"type": "array",
|
| 28 |
+
"items": { "type": "string" }
|
| 29 |
+
},
|
| 30 |
+
"guarantees": {
|
| 31 |
+
"type": "array",
|
| 32 |
+
"items": { "type": "string" }
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
"additionalProperties": false
|
| 36 |
+
}
|
schemas/artifact_manifest.schema.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:artifact_manifest",
|
| 4 |
+
"title": "ArtifactManifest",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"artifact_id",
|
| 10 |
+
"artifact_type",
|
| 11 |
+
"uri",
|
| 12 |
+
"produced_by",
|
| 13 |
+
"run_id",
|
| 14 |
+
"content_hash",
|
| 15 |
+
"created_at"
|
| 16 |
+
],
|
| 17 |
+
"properties": {
|
| 18 |
+
"schema_name": { "const": "ArtifactManifest" },
|
| 19 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 20 |
+
"artifact_id": { "type": "string", "pattern": "^artifact_[a-z0-9_\\-]+$" },
|
| 21 |
+
"artifact_type": {
|
| 22 |
+
"type": "string",
|
| 23 |
+
"enum": [
|
| 24 |
+
"decision",
|
| 25 |
+
"execution_input",
|
| 26 |
+
"trace",
|
| 27 |
+
"log",
|
| 28 |
+
"report",
|
| 29 |
+
"tasksheet",
|
| 30 |
+
"eval",
|
| 31 |
+
"workspace_snapshot",
|
| 32 |
+
"patch_ref",
|
| 33 |
+
"deploy_result"
|
| 34 |
+
]
|
| 35 |
+
},
|
| 36 |
+
"uri": { "type": "string", "minLength": 1 },
|
| 37 |
+
"produced_by": { "type": "string", "minLength": 1 },
|
| 38 |
+
"run_id": { "type": "string", "pattern": "^run_[a-z0-9_\\-]+$" },
|
| 39 |
+
"content_hash": { "type": "string", "minLength": 1 },
|
| 40 |
+
"created_at": { "type": "string", "format": "date-time" },
|
| 41 |
+
"source_system": { "type": "string" },
|
| 42 |
+
"metadata": { "type": "object" }
|
| 43 |
+
},
|
| 44 |
+
"additionalProperties": false
|
| 45 |
+
}
|
schemas/eval_record.schema.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:eval_record",
|
| 4 |
+
"title": "EvalRecord",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"eval_id",
|
| 10 |
+
"run_id",
|
| 11 |
+
"task_id",
|
| 12 |
+
"evaluator",
|
| 13 |
+
"recorded_at",
|
| 14 |
+
"scores",
|
| 15 |
+
"summary"
|
| 16 |
+
],
|
| 17 |
+
"properties": {
|
| 18 |
+
"schema_name": { "const": "EvalRecord" },
|
| 19 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 20 |
+
"eval_id": { "type": "string", "pattern": "^eval_[a-z0-9_\\-]+$" },
|
| 21 |
+
"run_id": { "type": "string", "pattern": "^run_[a-z0-9_\\-]+$" },
|
| 22 |
+
"task_id": { "type": "string", "pattern": "^task_[a-z0-9_\\-]+$" },
|
| 23 |
+
"evaluator": { "type": "string", "minLength": 1 },
|
| 24 |
+
"recorded_at": { "type": "string", "format": "date-time" },
|
| 25 |
+
"scores": {
|
| 26 |
+
"type": "object",
|
| 27 |
+
"required": ["goal_completion", "traceability", "runtime_fitness"],
|
| 28 |
+
"properties": {
|
| 29 |
+
"goal_completion": { "type": "number", "minimum": 0, "maximum": 1 },
|
| 30 |
+
"traceability": { "type": "number", "minimum": 0, "maximum": 1 },
|
| 31 |
+
"runtime_fitness": { "type": "number", "minimum": 0, "maximum": 1 }
|
| 32 |
+
},
|
| 33 |
+
"additionalProperties": false
|
| 34 |
+
},
|
| 35 |
+
"summary": { "type": "string", "minLength": 1 },
|
| 36 |
+
"recommendations": {
|
| 37 |
+
"type": "array",
|
| 38 |
+
"items": { "type": "string" }
|
| 39 |
+
}
|
| 40 |
+
},
|
| 41 |
+
"additionalProperties": false
|
| 42 |
+
}
|
schemas/execution_request.schema.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:execution_request",
|
| 4 |
+
"title": "ExecutionRequest",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"execution_id",
|
| 10 |
+
"decision_id",
|
| 11 |
+
"run_id",
|
| 12 |
+
"target_runtime",
|
| 13 |
+
"target_agent",
|
| 14 |
+
"input_artifacts",
|
| 15 |
+
"execution_mode",
|
| 16 |
+
"workspace_ref",
|
| 17 |
+
"timeout_policy",
|
| 18 |
+
"approval_requirements",
|
| 19 |
+
"created_at",
|
| 20 |
+
"source_system"
|
| 21 |
+
],
|
| 22 |
+
"properties": {
|
| 23 |
+
"schema_name": { "const": "ExecutionRequest" },
|
| 24 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 25 |
+
"execution_id": { "type": "string", "pattern": "^execution_[a-z0-9_\\-]+$" },
|
| 26 |
+
"decision_id": { "type": "string", "pattern": "^decision_[a-z0-9_\\-]+$" },
|
| 27 |
+
"run_id": { "type": "string", "pattern": "^run_[a-z0-9_\\-]+$" },
|
| 28 |
+
"target_runtime": { "type": "string", "minLength": 1 },
|
| 29 |
+
"target_agent": { "type": "string", "minLength": 1 },
|
| 30 |
+
"input_artifacts": {
|
| 31 |
+
"type": "array",
|
| 32 |
+
"items": { "type": "string", "pattern": "^artifact_[a-z0-9_\\-]+$" }
|
| 33 |
+
},
|
| 34 |
+
"execution_mode": { "type": "string", "enum": ["interactive", "batch", "background"] },
|
| 35 |
+
"workspace_ref": { "type": "string", "minLength": 1 },
|
| 36 |
+
"timeout_policy": {
|
| 37 |
+
"type": "object",
|
| 38 |
+
"required": ["timeout_seconds", "on_timeout"],
|
| 39 |
+
"properties": {
|
| 40 |
+
"timeout_seconds": { "type": "integer", "minimum": 1 },
|
| 41 |
+
"on_timeout": { "type": "string", "enum": ["fail", "ask_operator", "retry"] }
|
| 42 |
+
},
|
| 43 |
+
"additionalProperties": false
|
| 44 |
+
},
|
| 45 |
+
"approval_requirements": {
|
| 46 |
+
"type": "array",
|
| 47 |
+
"items": { "type": "string" }
|
| 48 |
+
},
|
| 49 |
+
"created_at": { "type": "string", "format": "date-time" },
|
| 50 |
+
"source_system": { "type": "string", "minLength": 1 }
|
| 51 |
+
},
|
| 52 |
+
"additionalProperties": false
|
| 53 |
+
}
|
schemas/execution_status.schema.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:execution_status",
|
| 4 |
+
"title": "ExecutionStatus",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"status_id",
|
| 10 |
+
"execution_id",
|
| 11 |
+
"run_id",
|
| 12 |
+
"status",
|
| 13 |
+
"source_system",
|
| 14 |
+
"recorded_at"
|
| 15 |
+
],
|
| 16 |
+
"properties": {
|
| 17 |
+
"schema_name": { "const": "ExecutionStatus" },
|
| 18 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 19 |
+
"status_id": { "type": "string", "pattern": "^status_[a-z0-9_\\-]+$" },
|
| 20 |
+
"execution_id": { "type": "string", "pattern": "^execution_[a-z0-9_\\-]+$" },
|
| 21 |
+
"run_id": { "type": "string", "pattern": "^run_[a-z0-9_\\-]+$" },
|
| 22 |
+
"status": {
|
| 23 |
+
"type": "string",
|
| 24 |
+
"enum": ["requested", "dispatched", "running", "waiting_for_input", "completed", "failed", "aborted"]
|
| 25 |
+
},
|
| 26 |
+
"message": { "type": "string" },
|
| 27 |
+
"source_system": { "type": "string", "minLength": 1 },
|
| 28 |
+
"recorded_at": { "type": "string", "format": "date-time" },
|
| 29 |
+
"progress_hint": { "type": "string" },
|
| 30 |
+
"artifact_ids": {
|
| 31 |
+
"type": "array",
|
| 32 |
+
"items": { "type": "string", "pattern": "^artifact_[a-z0-9_\\-]+$" }
|
| 33 |
+
}
|
| 34 |
+
},
|
| 35 |
+
"additionalProperties": false
|
| 36 |
+
}
|
schemas/harness_manifest.schema.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:harness_manifest",
|
| 4 |
+
"title": "HarnessManifest",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"harness_id",
|
| 10 |
+
"name",
|
| 11 |
+
"status",
|
| 12 |
+
"runtime_target",
|
| 13 |
+
"accepts",
|
| 14 |
+
"emits",
|
| 15 |
+
"constraints",
|
| 16 |
+
"cost_class",
|
| 17 |
+
"trust_level"
|
| 18 |
+
],
|
| 19 |
+
"properties": {
|
| 20 |
+
"schema_name": { "const": "HarnessManifest" },
|
| 21 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 22 |
+
"harness_id": { "type": "string", "minLength": 1 },
|
| 23 |
+
"name": { "type": "string", "minLength": 1 },
|
| 24 |
+
"status": { "type": "string", "enum": ["active", "experimental", "blocked", "deprecated"] },
|
| 25 |
+
"runtime_target": { "type": "string", "minLength": 1 },
|
| 26 |
+
"accepts": {
|
| 27 |
+
"type": "array",
|
| 28 |
+
"items": { "type": "string" }
|
| 29 |
+
},
|
| 30 |
+
"emits": {
|
| 31 |
+
"type": "array",
|
| 32 |
+
"items": { "type": "string" }
|
| 33 |
+
},
|
| 34 |
+
"constraints": {
|
| 35 |
+
"type": "array",
|
| 36 |
+
"items": { "type": "string" }
|
| 37 |
+
},
|
| 38 |
+
"cost_class": { "type": "string", "enum": ["low", "medium", "high"] },
|
| 39 |
+
"trust_level": { "type": "string", "enum": ["guarded", "normal", "trusted"] },
|
| 40 |
+
"best_for": {
|
| 41 |
+
"type": "array",
|
| 42 |
+
"items": { "type": "string" }
|
| 43 |
+
}
|
| 44 |
+
},
|
| 45 |
+
"additionalProperties": false
|
| 46 |
+
}
|
schemas/operator_context.schema.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:operator_context",
|
| 4 |
+
"title": "OperatorContext",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"focus",
|
| 10 |
+
"energy",
|
| 11 |
+
"mode",
|
| 12 |
+
"cost_tolerance"
|
| 13 |
+
],
|
| 14 |
+
"properties": {
|
| 15 |
+
"schema_name": { "const": "OperatorContext" },
|
| 16 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 17 |
+
"focus": { "type": "string", "enum": ["high", "medium", "low"] },
|
| 18 |
+
"energy": { "type": "string", "enum": ["high", "low"] },
|
| 19 |
+
"mode": { "type": "string", "enum": ["default", "exploration", "shipping"] },
|
| 20 |
+
"cost_tolerance": { "type": "string", "enum": ["sparend", "normal", "quality-first"] },
|
| 21 |
+
"adhd_risk": { "type": "string", "enum": ["normal", "high"] },
|
| 22 |
+
"drift_risk": { "type": "string", "enum": ["normal", "high"] },
|
| 23 |
+
"notes": { "type": "string" }
|
| 24 |
+
},
|
| 25 |
+
"additionalProperties": false
|
| 26 |
+
}
|
schemas/route_trace.schema.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:route_trace",
|
| 4 |
+
"title": "RouteTrace",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"trace_id",
|
| 10 |
+
"run_id",
|
| 11 |
+
"execution_id",
|
| 12 |
+
"source_system",
|
| 13 |
+
"recorded_at",
|
| 14 |
+
"steps"
|
| 15 |
+
],
|
| 16 |
+
"properties": {
|
| 17 |
+
"schema_name": { "const": "RouteTrace" },
|
| 18 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 19 |
+
"trace_id": { "type": "string", "pattern": "^trace_[a-z0-9_\\-]+$" },
|
| 20 |
+
"run_id": { "type": "string", "pattern": "^run_[a-z0-9_\\-]+$" },
|
| 21 |
+
"execution_id": { "type": "string", "pattern": "^execution_[a-z0-9_\\-]+$" },
|
| 22 |
+
"source_system": { "type": "string", "minLength": 1 },
|
| 23 |
+
"recorded_at": { "type": "string", "format": "date-time" },
|
| 24 |
+
"steps": {
|
| 25 |
+
"type": "array",
|
| 26 |
+
"minItems": 1,
|
| 27 |
+
"items": {
|
| 28 |
+
"type": "object",
|
| 29 |
+
"required": ["index", "actor", "action", "outcome"],
|
| 30 |
+
"properties": {
|
| 31 |
+
"index": { "type": "integer", "minimum": 1 },
|
| 32 |
+
"actor": { "type": "string", "minLength": 1 },
|
| 33 |
+
"action": { "type": "string", "minLength": 1 },
|
| 34 |
+
"outcome": { "type": "string", "minLength": 1 }
|
| 35 |
+
},
|
| 36 |
+
"additionalProperties": false
|
| 37 |
+
}
|
| 38 |
+
}
|
| 39 |
+
},
|
| 40 |
+
"additionalProperties": false
|
| 41 |
+
}
|
schemas/routing_decision.schema.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:routing_decision",
|
| 4 |
+
"title": "RoutingDecision",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"decision_id",
|
| 10 |
+
"task_id",
|
| 11 |
+
"recommended_harness",
|
| 12 |
+
"recommended_runtime_target",
|
| 13 |
+
"confidence",
|
| 14 |
+
"reasoning_summary",
|
| 15 |
+
"risks",
|
| 16 |
+
"fallback",
|
| 17 |
+
"decision_policy_version",
|
| 18 |
+
"source_system",
|
| 19 |
+
"created_at"
|
| 20 |
+
],
|
| 21 |
+
"properties": {
|
| 22 |
+
"schema_name": { "const": "RoutingDecision" },
|
| 23 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 24 |
+
"decision_id": { "type": "string", "pattern": "^decision_[a-z0-9_\\-]+$" },
|
| 25 |
+
"task_id": { "type": "string", "pattern": "^task_[a-z0-9_\\-]+$" },
|
| 26 |
+
"recommended_harness": { "type": "string", "minLength": 1 },
|
| 27 |
+
"recommended_runtime_target": { "type": "string", "minLength": 1 },
|
| 28 |
+
"confidence": { "type": "integer", "minimum": 0, "maximum": 100 },
|
| 29 |
+
"reasoning_summary": { "type": "string", "minLength": 1 },
|
| 30 |
+
"risks": {
|
| 31 |
+
"type": "array",
|
| 32 |
+
"items": { "type": "string" }
|
| 33 |
+
},
|
| 34 |
+
"fallback": { "type": "string", "minLength": 1 },
|
| 35 |
+
"decision_policy_version": { "type": "string", "minLength": 1 },
|
| 36 |
+
"source_system": { "type": "string", "minLength": 1 },
|
| 37 |
+
"created_at": { "type": "string", "format": "date-time" },
|
| 38 |
+
"missing_information": {
|
| 39 |
+
"type": "array",
|
| 40 |
+
"items": { "type": "string" }
|
| 41 |
+
}
|
| 42 |
+
},
|
| 43 |
+
"additionalProperties": false
|
| 44 |
+
}
|
schemas/run_record.schema.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:run_record",
|
| 4 |
+
"title": "RunRecord",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"run_id",
|
| 10 |
+
"task_id",
|
| 11 |
+
"run_state",
|
| 12 |
+
"created_at",
|
| 13 |
+
"origin_system",
|
| 14 |
+
"decision_ids",
|
| 15 |
+
"execution_ids",
|
| 16 |
+
"artifact_ids",
|
| 17 |
+
"event_ids"
|
| 18 |
+
],
|
| 19 |
+
"properties": {
|
| 20 |
+
"schema_name": { "const": "RunRecord" },
|
| 21 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 22 |
+
"run_id": { "type": "string", "pattern": "^run_[a-z0-9_\\-]+$" },
|
| 23 |
+
"task_id": { "type": "string", "pattern": "^task_[a-z0-9_\\-]+$" },
|
| 24 |
+
"run_state": {
|
| 25 |
+
"type": "string",
|
| 26 |
+
"enum": [
|
| 27 |
+
"created",
|
| 28 |
+
"decided",
|
| 29 |
+
"ready_for_dispatch",
|
| 30 |
+
"dispatched",
|
| 31 |
+
"running",
|
| 32 |
+
"waiting_for_input",
|
| 33 |
+
"completed",
|
| 34 |
+
"failed",
|
| 35 |
+
"aborted",
|
| 36 |
+
"evaluated"
|
| 37 |
+
]
|
| 38 |
+
},
|
| 39 |
+
"created_at": { "type": "string", "format": "date-time" },
|
| 40 |
+
"updated_at": { "type": "string", "format": "date-time" },
|
| 41 |
+
"origin_system": { "type": "string", "minLength": 1 },
|
| 42 |
+
"decision_ids": {
|
| 43 |
+
"type": "array",
|
| 44 |
+
"items": { "type": "string", "pattern": "^decision_[a-z0-9_\\-]+$" }
|
| 45 |
+
},
|
| 46 |
+
"execution_ids": {
|
| 47 |
+
"type": "array",
|
| 48 |
+
"items": { "type": "string", "pattern": "^execution_[a-z0-9_\\-]+$" }
|
| 49 |
+
},
|
| 50 |
+
"artifact_ids": {
|
| 51 |
+
"type": "array",
|
| 52 |
+
"items": { "type": "string", "pattern": "^artifact_[a-z0-9_\\-]+$" }
|
| 53 |
+
},
|
| 54 |
+
"event_ids": {
|
| 55 |
+
"type": "array",
|
| 56 |
+
"items": { "type": "string", "pattern": "^event_[a-z0-9_\\-]+$" }
|
| 57 |
+
},
|
| 58 |
+
"eval_ids": {
|
| 59 |
+
"type": "array",
|
| 60 |
+
"items": { "type": "string", "pattern": "^eval_[a-z0-9_\\-]+$" }
|
| 61 |
+
}
|
| 62 |
+
},
|
| 63 |
+
"additionalProperties": false
|
| 64 |
+
}
|
schemas/spine_event.schema.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:spine_event",
|
| 4 |
+
"title": "SpineEvent",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"event_id",
|
| 10 |
+
"event_type",
|
| 11 |
+
"occurred_at",
|
| 12 |
+
"run_id",
|
| 13 |
+
"source_system",
|
| 14 |
+
"sequence",
|
| 15 |
+
"payload"
|
| 16 |
+
],
|
| 17 |
+
"properties": {
|
| 18 |
+
"schema_name": { "const": "SpineEvent" },
|
| 19 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 20 |
+
"event_id": { "type": "string", "pattern": "^event_[a-z0-9_\\-]+$" },
|
| 21 |
+
"event_type": {
|
| 22 |
+
"type": "string",
|
| 23 |
+
"enum": [
|
| 24 |
+
"task.created",
|
| 25 |
+
"decision.created",
|
| 26 |
+
"decision.approved",
|
| 27 |
+
"execution.requested",
|
| 28 |
+
"execution.dispatched",
|
| 29 |
+
"execution.started",
|
| 30 |
+
"execution.progress",
|
| 31 |
+
"execution.completed",
|
| 32 |
+
"execution.failed",
|
| 33 |
+
"artifact.created",
|
| 34 |
+
"eval.recorded",
|
| 35 |
+
"run.closed"
|
| 36 |
+
]
|
| 37 |
+
},
|
| 38 |
+
"occurred_at": { "type": "string", "format": "date-time" },
|
| 39 |
+
"run_id": { "type": "string", "pattern": "^run_[a-z0-9_\\-]+$" },
|
| 40 |
+
"source_system": { "type": "string", "minLength": 1 },
|
| 41 |
+
"sequence": { "type": "integer", "minimum": 1 },
|
| 42 |
+
"payload": { "type": "object" },
|
| 43 |
+
"references": {
|
| 44 |
+
"type": "object",
|
| 45 |
+
"properties": {
|
| 46 |
+
"task_id": { "type": "string" },
|
| 47 |
+
"decision_id": { "type": "string" },
|
| 48 |
+
"execution_id": { "type": "string" },
|
| 49 |
+
"artifact_id": { "type": "string" },
|
| 50 |
+
"eval_id": { "type": "string" }
|
| 51 |
+
},
|
| 52 |
+
"additionalProperties": false
|
| 53 |
+
}
|
| 54 |
+
},
|
| 55 |
+
"additionalProperties": false
|
| 56 |
+
}
|
schemas/system_manifest.schema.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:system_manifest",
|
| 4 |
+
"title": "SystemManifest",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"system_id",
|
| 10 |
+
"name",
|
| 11 |
+
"description",
|
| 12 |
+
"created_at",
|
| 13 |
+
"source_projects",
|
| 14 |
+
"runtime_targets",
|
| 15 |
+
"schema_inventory"
|
| 16 |
+
],
|
| 17 |
+
"properties": {
|
| 18 |
+
"schema_name": { "const": "SystemManifest" },
|
| 19 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 20 |
+
"system_id": { "type": "string", "minLength": 1 },
|
| 21 |
+
"name": { "type": "string", "minLength": 1 },
|
| 22 |
+
"description": { "type": "string", "minLength": 1 },
|
| 23 |
+
"created_at": { "type": "string", "format": "date-time" },
|
| 24 |
+
"source_projects": {
|
| 25 |
+
"type": "array",
|
| 26 |
+
"minItems": 1,
|
| 27 |
+
"items": {
|
| 28 |
+
"type": "object",
|
| 29 |
+
"required": ["project_id", "role", "path"],
|
| 30 |
+
"properties": {
|
| 31 |
+
"project_id": { "type": "string" },
|
| 32 |
+
"role": { "type": "string" },
|
| 33 |
+
"path": { "type": "string" }
|
| 34 |
+
},
|
| 35 |
+
"additionalProperties": false
|
| 36 |
+
}
|
| 37 |
+
},
|
| 38 |
+
"runtime_targets": {
|
| 39 |
+
"type": "array",
|
| 40 |
+
"items": { "type": "string" }
|
| 41 |
+
},
|
| 42 |
+
"schema_inventory": {
|
| 43 |
+
"type": "array",
|
| 44 |
+
"items": { "type": "string" }
|
| 45 |
+
}
|
| 46 |
+
},
|
| 47 |
+
"additionalProperties": false
|
| 48 |
+
}
|
schemas/task_request.schema.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
| 3 |
+
"$id": "spine:task_request",
|
| 4 |
+
"title": "TaskRequest",
|
| 5 |
+
"type": "object",
|
| 6 |
+
"required": [
|
| 7 |
+
"schema_name",
|
| 8 |
+
"schema_version",
|
| 9 |
+
"task_id",
|
| 10 |
+
"title",
|
| 11 |
+
"description",
|
| 12 |
+
"requested_by",
|
| 13 |
+
"created_at",
|
| 14 |
+
"origin_system",
|
| 15 |
+
"operator_context",
|
| 16 |
+
"constraints",
|
| 17 |
+
"desired_outcomes"
|
| 18 |
+
],
|
| 19 |
+
"properties": {
|
| 20 |
+
"schema_name": { "const": "TaskRequest" },
|
| 21 |
+
"schema_version": { "type": "string", "const": "1.0.0" },
|
| 22 |
+
"task_id": { "type": "string", "pattern": "^task_[a-z0-9_\\-]+$" },
|
| 23 |
+
"title": { "type": "string", "minLength": 1 },
|
| 24 |
+
"description": { "type": "string", "minLength": 1 },
|
| 25 |
+
"requested_by": { "type": "string", "minLength": 1 },
|
| 26 |
+
"created_at": { "type": "string", "format": "date-time" },
|
| 27 |
+
"origin_system": { "type": "string", "minLength": 1 },
|
| 28 |
+
"operator_context": { "$ref": "./operator_context.schema.json" },
|
| 29 |
+
"constraints": {
|
| 30 |
+
"type": "array",
|
| 31 |
+
"items": { "type": "string" }
|
| 32 |
+
},
|
| 33 |
+
"desired_outcomes": {
|
| 34 |
+
"type": "array",
|
| 35 |
+
"minItems": 1,
|
| 36 |
+
"items": { "type": "string" }
|
| 37 |
+
},
|
| 38 |
+
"workspace_ref": { "type": "string" },
|
| 39 |
+
"tags": {
|
| 40 |
+
"type": "array",
|
| 41 |
+
"items": { "type": "string" }
|
| 42 |
+
}
|
| 43 |
+
},
|
| 44 |
+
"additionalProperties": false
|
| 45 |
+
}
|
scripts/validate_spine.py
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Local consistency checks for the Spine V1 scaffold.
|
| 3 |
+
|
| 4 |
+
This script does not implement full JSON Schema validation. It validates the
|
| 5 |
+
spec bundle at the repository-contract level using only the Python stdlib.
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
from __future__ import annotations
|
| 9 |
+
|
| 10 |
+
import json
|
| 11 |
+
import sys
|
| 12 |
+
from pathlib import Path
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
ROOT = Path(__file__).resolve().parent.parent
|
| 16 |
+
SCHEMAS = ROOT / "schemas"
|
| 17 |
+
REGISTRY = ROOT / "registry"
|
| 18 |
+
EXAMPLES = ROOT / "examples" / "run_lifecycle"
|
| 19 |
+
|
| 20 |
+
REQUIRED_SCHEMAS = {
|
| 21 |
+
"OperatorContext": "operator_context.schema.json",
|
| 22 |
+
"TaskRequest": "task_request.schema.json",
|
| 23 |
+
"RoutingDecision": "routing_decision.schema.json",
|
| 24 |
+
"RunRecord": "run_record.schema.json",
|
| 25 |
+
"ExecutionRequest": "execution_request.schema.json",
|
| 26 |
+
"ExecutionStatus": "execution_status.schema.json",
|
| 27 |
+
"RouteTrace": "route_trace.schema.json",
|
| 28 |
+
"ArtifactManifest": "artifact_manifest.schema.json",
|
| 29 |
+
"EvalRecord": "eval_record.schema.json",
|
| 30 |
+
"SpineEvent": "spine_event.schema.json",
|
| 31 |
+
"SystemManifest": "system_manifest.schema.json",
|
| 32 |
+
"HarnessManifest": "harness_manifest.schema.json",
|
| 33 |
+
"AdapterManifest": "adapter_manifest.schema.json",
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
def load_json(path: Path):
|
| 38 |
+
with path.open("r", encoding="utf-8") as handle:
|
| 39 |
+
return json.load(handle)
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
def require(condition: bool, message: str) -> None:
|
| 43 |
+
if not condition:
|
| 44 |
+
raise SystemExit(f"VALIDATION FAILED: {message}")
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
def check_schema_inventory() -> None:
|
| 48 |
+
for schema_name, filename in REQUIRED_SCHEMAS.items():
|
| 49 |
+
path = SCHEMAS / filename
|
| 50 |
+
require(path.exists(), f"missing schema file: {filename}")
|
| 51 |
+
data = load_json(path)
|
| 52 |
+
require(data["title"] == schema_name, f"{filename} has unexpected title")
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
def check_registry() -> None:
|
| 56 |
+
system_manifest = load_json(REGISTRY / "system_manifest.json")
|
| 57 |
+
require(system_manifest["schema_name"] == "SystemManifest", "system manifest schema name mismatch")
|
| 58 |
+
require(
|
| 59 |
+
sorted(system_manifest["schema_inventory"]) == sorted(REQUIRED_SCHEMAS.keys()),
|
| 60 |
+
"system manifest schema inventory is incomplete",
|
| 61 |
+
)
|
| 62 |
+
|
| 63 |
+
harness_ids = set()
|
| 64 |
+
for path in sorted((REGISTRY / "harnesses").glob("*.json")):
|
| 65 |
+
data = load_json(path)
|
| 66 |
+
require(data["schema_name"] == "HarnessManifest", f"{path.name} is not a harness manifest")
|
| 67 |
+
require(data["harness_id"] not in harness_ids, f"duplicate harness id: {data['harness_id']}")
|
| 68 |
+
harness_ids.add(data["harness_id"])
|
| 69 |
+
|
| 70 |
+
adapter_ids = set()
|
| 71 |
+
for path in sorted((REGISTRY / "adapters").glob("*.json")):
|
| 72 |
+
data = load_json(path)
|
| 73 |
+
require(data["schema_name"] == "AdapterManifest", f"{path.name} is not an adapter manifest")
|
| 74 |
+
require(data["adapter_id"] not in adapter_ids, f"duplicate adapter id: {data['adapter_id']}")
|
| 75 |
+
adapter_ids.add(data["adapter_id"])
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
def check_examples() -> None:
|
| 79 |
+
task = load_json(EXAMPLES / "task_request.json")
|
| 80 |
+
decision = load_json(EXAMPLES / "routing_decision.json")
|
| 81 |
+
run = load_json(EXAMPLES / "run_record.json")
|
| 82 |
+
execution = load_json(EXAMPLES / "execution_request.json")
|
| 83 |
+
status = load_json(EXAMPLES / "execution_status.json")
|
| 84 |
+
trace = load_json(EXAMPLES / "route_trace.json")
|
| 85 |
+
artifact = load_json(EXAMPLES / "artifact_manifest.json")
|
| 86 |
+
eval_record = load_json(EXAMPLES / "eval_record.json")
|
| 87 |
+
events = load_json(EXAMPLES / "events.json")
|
| 88 |
+
|
| 89 |
+
require(task["schema_name"] == "TaskRequest", "task example schema mismatch")
|
| 90 |
+
require(decision["task_id"] == task["task_id"], "decision does not reference task")
|
| 91 |
+
require(run["task_id"] == task["task_id"], "run does not reference task")
|
| 92 |
+
require(execution["decision_id"] == decision["decision_id"], "execution does not reference decision")
|
| 93 |
+
require(execution["run_id"] == run["run_id"], "execution does not reference run")
|
| 94 |
+
require(status["execution_id"] == execution["execution_id"], "status does not reference execution")
|
| 95 |
+
require(status["run_id"] == run["run_id"], "status does not reference run")
|
| 96 |
+
require(trace["execution_id"] == execution["execution_id"], "trace does not reference execution")
|
| 97 |
+
require(artifact["run_id"] == run["run_id"], "artifact does not reference run")
|
| 98 |
+
require(eval_record["run_id"] == run["run_id"], "eval does not reference run")
|
| 99 |
+
require(eval_record["task_id"] == task["task_id"], "eval does not reference task")
|
| 100 |
+
require(run["decision_ids"] == [decision["decision_id"]], "run decision ids mismatch")
|
| 101 |
+
require(run["execution_ids"] == [execution["execution_id"]], "run execution ids mismatch")
|
| 102 |
+
require(run["artifact_ids"] == [artifact["artifact_id"]], "run artifact ids mismatch")
|
| 103 |
+
require(run["eval_ids"] == [eval_record["eval_id"]], "run eval ids mismatch")
|
| 104 |
+
|
| 105 |
+
sequences = [event["sequence"] for event in events]
|
| 106 |
+
require(sequences == list(range(1, len(events) + 1)), "event sequence must be contiguous starting at 1")
|
| 107 |
+
for event in events:
|
| 108 |
+
require(event["schema_name"] == "SpineEvent", f"event {event['event_id']} schema mismatch")
|
| 109 |
+
require(event["run_id"] == run["run_id"], f"event {event['event_id']} run id mismatch")
|
| 110 |
+
|
| 111 |
+
event_ids = [event["event_id"] for event in events]
|
| 112 |
+
require(run["event_ids"] == event_ids, "run event ids do not match event log")
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
def main() -> None:
|
| 116 |
+
check_schema_inventory()
|
| 117 |
+
check_registry()
|
| 118 |
+
check_examples()
|
| 119 |
+
print("Spine validation OK")
|
| 120 |
+
print(f"Schemas: {len(REQUIRED_SCHEMAS)}")
|
| 121 |
+
print(f"Harness manifests: {len(list((REGISTRY / 'harnesses').glob('*.json')))}")
|
| 122 |
+
print(f"Adapter manifests: {len(list((REGISTRY / 'adapters').glob('*.json')))}")
|
| 123 |
+
print(f"Example files: {len(list(EXAMPLES.glob('*.json')))}")
|
| 124 |
+
|
| 125 |
+
|
| 126 |
+
if __name__ == "__main__":
|
| 127 |
+
try:
|
| 128 |
+
main()
|
| 129 |
+
except SystemExit:
|
| 130 |
+
raise
|
| 131 |
+
except Exception as exc: # pragma: no cover - defensive catch for local use
|
| 132 |
+
raise SystemExit(f"VALIDATION FAILED: unexpected error: {exc}") from exc
|