Erste Etappe des v3-Umbaus. Bewusst ohne jede Architektur-Aenderung: nur Entruempeln, damit der Rest des Umbaus auf einem messbar leichten Stand aufsetzt. Gemessen (vorher -> nachher): dist gesamt 27 375 720 B -> 1 477 852 B (-94,6 %) Dateien in dist 135 -> 35 Start-Chunk gzip 220 278 B -> 110 571 B (-49,8 %) CSS gzip 31 577 B -> 15 121 B (-52,1 %) Schrift-Dateien 112 -> 11 (WOFF 1: 0) Vier Eingriffe: 1) avatar.vrm (24,5 MB) entfernt. Lag in public/ und dist/, wurde von KEINER Zeile des Repos referenziert — der Renderer Avatar3D.tsx war schon vorher verschwunden. War 89,5 % der Nutzlast, die auf die Box ging. Damit fallen auch die .gitignore-Sonderregel und der Direkt-Deploy-Schritt weg. DISASTER_RECOVERY.md §3·D ehrlich auf "ausgebaut" gesetzt (7 Stellen). 2) Schriften: die 11 @fontsource-Sammelimporte zogen ALLE Subsets (latin-ext, griechisch, kyrillisch) und je eine WOFF-1-Fassung mit — 112 Dateien, 1,58 MB, davon 902 kB WOFF 1, das kein Browser dieser App je abruft. Jetzt stehen die @font-face-Regeln direkt in index.css: nur latin, nur WOFF 2, nur die Schnitte, die per grep ueber die font-*-Klassen wirklich belegt sind. Nebenbei behoben: JetBrains Mono 600/700 fehlten komplett — die 19 Stellen mit `font-mono font-bold/semibold` wurden vom Browser synthetisch fettgerechnet. Jetzt echte Schnitte; bei Monospace ist die Laufweite gleich, kein Layout-Versatz. 3) Recharts aus dem Startbuendel. Das Cockpit ist die Startseite und laedt daher NICHT lazy; ueber SystemStatusCard/TokenPerformanceCard zog es Recharts samt d3 in index-*.js. LiveAreaChart ist jetzt eine Lazy-Huelle (Suspense mit hoehengleichem Platzhalter, damit nichts springt), die Recharts-Umsetzung liegt in LiveAreaChartImpl.tsx und kommt als eigener Chunk nach (105 kB gzip). 4) index.css: height 100dvh mit 100% als Rueckfall. Auf Mobilbrowsern mit einfahrender Adressleiste ist 100 % nicht die sichtbare Hoehe. Dazu ein Buendel-Budget in beiden Ampel-Dateien (.gitea/ = MC2-Fassung, deploy/ = universelle Vorlage): Start-Chunk und dist-Gesamtgroesse werden am FRISCHEN Build im Runner gemessen. Bewusst kein Vergleich mit dem committeten dist — der waere ueber Node-Versionen hinweg flatterhaft und wuerde dauerhaft rot leuchten, was das Signal zerstoert. Verifiziert gegen die Box (Frontend-Dev mit MC_API_TARGET=192.168.178.151:9001): Cockpit rendert mit Live-Daten, keine Konsolenfehler, alle 11 Schriftschnitte registriert, LiveAreaChartImpl + recharts laden nachweislich als Nachlade-Chunk. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5.1 KiB
5.1 KiB
AGENTS.md — Mission Control 2.0
Projekt-Geschmack für Coding-Agenten (Kilo Code, Claude Code lesen diese Datei).
Kurz gehalten, nur die Wahrheiten, die man sonst schmerzhaft lernt. Details: README.md, docs/.
Was das ist
Lokaler Local-AI-Stack für die Box (Bosgame M5, Strix Halo, Vulkan/RADV). Schichten:
Engine (llama-swap) · Builtin-Routing-Gateway (model: auto) · MC2 (FastAPI + React/shadcn) ·
Hermes-Agent (das autonome Gehirn "Lucy"). Backend Python (Box läuft Python 3.14), Frontend Vite/React/shadcn/Tailwind.
Hardware-Spezifikationen der Box (WICHTIG für alle Agenten):
- System: Bosgame M5 (AMD Strix Halo APU)
- Arbeitsspeicher (RAM/VRAM): 128 GB Shared Memory (ca. 122.7 GB nutzbar).
- Inference-Limit: Modelle im GGUF-Format dürfen maximal ca. 100-110 GB groß sein (entspricht ca. 150B Parametern bei Q4_K_M). Größere Modelle (wie 200B+ oder 2T Parameter) können lokal nicht ausgeführt werden und sind auszuschließen, es sei denn, es handelt sich um stark quantisierte MoEs.
Gedächtnis & Dienste: Hermes ist das autonome Agenten-Gehirn („Lucy") und die alleinige Gedächtnis-Wahrheit — es führt sein Gedächtnis selbst. Der frühere Sidecar auf
:8765samt Memory-MCP-Server und MC2-Memory-Plugin wurde am 07.08.2026 abgelöst und am 27.08.2026 restlos ausgebaut (docs/wissen/VERDIKTE.md): MC2 hat keine/api/memory-Routen mehr, nichts darf mehr dorthin greifen. Governor, Zed-Workflows und alte Mittelschichten sind komplett gelöscht.
Sprache (nicht verhandelbar)
- Alles User-Sichtbare ist Deutsch: UI-Texte, Fehlermeldungen, Update-/Radar-Meldungen, Skills, LLM-Summaries, Commit-Messages, Code-Kommentare.
- Hermes' INTERNE System-Prompts bleiben Englisch (fremde Software, wir forken sie nicht). Antwort-Sprache ≠ Prompt-Sprache — Deutsch kommt aus SOUL.md, nicht aus den Tool-Prompts.
Build & Deploy (die häufigste Falle)
frontend/distWIRD committet. Auf der Box läuft KEIN Node-Build; das Backend liefert die gebauten Assets direkt aus. Nach jeder Frontend-Änderung:cd frontend && npm run build, dann das neuefrontend/distmit-committen. Vergessen = Box zeigt alten Stand.- Deploy macht
git reset --hard origin/main(deploy/deploy.sh). Heißt:mainmuss vor dem Deploy auf Gitea liegen, und uncommittete Box-Änderungen gehen verloren (Absicht). - Nie direkt auf
mainarbeiten. Immer Branch (wartung/...), Gate grün, dann Merge/Deploy.
Agentic IDE & Vibe Coding
- Zero Middle-Layers: Coding passiert zu 100% lokal auf dem Dev-PC in der OpenCode Desktop IDE.
- Es gibt keinen Zed-Workflow, keine OpenCode-CLI-Mittelschicht und keinen Governor mehr.
- Der Agent in OpenCode Desktop nutzt via MCP (
.agents/mcp_config.json) die API der Box (:9001/v1), um autonom Projekte zu bauen. - Mix-Ansatz beim Testen: Der Agent testet lokal. Vor dem Push muss er prüfen, ob das Gitea-
VERIFY-Skript fehlerfrei durchläuft.
Zeit & Umgebung
- Box = Ubuntu, läuft in
Europe/Berlin(seit 03.07.2026; vorher UTC). Dev-PC = Windows. Naive/lokale Zeiten immer überMC_LOCAL_TZ(=Europe/Berlin) auflösen, niedatetime.now()ohne TZ annehmen (siehebackend/services/reminders.py).
Backend-Konventionen
- Router unter
backend/routers/(APIRouter(prefix="/api")), Logik inbackend/services/(Single Source of Truth — Router bleiben dünn). Beispiel-Lehre: Restart-Allowlist lebt NUR inservices.maintenance(System-Dienste viasudo -n, User-Dienste viasystemctl --user); keine zweite Allowlist in einem Router duplizieren. - Gate vor Commit:
python -m py_compile <geänderte .py>muss durchlaufen. - Wartung ist sudo-frei gedacht (systemctl --user). Wo doch sudo nötig ist (llama-swap =
System-Dienst), sauber über die NOPASSWD-Whitelist /
password_required-Rückgabe, nie hart failen. - ‼️ Die feingranularen sudoers.d-Regeln sind faktisch wirkungslos. In
/etc/sudoersstehthitonabi ALL=(ALL) NOPASSWD: ALL— der Nutzer, unter dem alle MC2-Dienste laufen, darf ohnehin alles passwortlos.sudoers.d/mc2-autonomieundsudoers.d/mission-controldokumentieren also, was gebraucht würde, schränken aber nichts ein. Das ist eine bewusste Entscheidung für die Single-User-Appliance; verlasse dich beim Bauen nicht darauf, dass eine Whitelist dich bremst. Wer das wirklich härten will, kommt um einen eigenen Service-User nicht herum — die Pauschalzeile einfach zu ziehen, bricht OS-Update, Config-Sync und den wöchentlichen Auto-Neustart still. (Geprüft 27.08.2026; die doppelte Zeile wurde damals entfernt, Sicherung/root/sudoers.bak-*.) - Lokal (Windows) müssen Box-Shell-Befehle harmlos fehlschlagen statt zu crashen.
Grenzen (Verdikt, eingehalten)
- Hermes-Quellcode nie selbst patchen (Fork verboten). Config/Deps ja, Code-Umbau nein.
- Security-Config (approvals, Tokens, ufw, command_allowlist) nie ohne explizites User-Ja.
- Alles reversibel halten: Branch + Backup + Pin.
Gitea
Remote = Hitonabi/mission-control-v2. Auth ist flatterhaft → Push mit Retry, nur über
PowerShell/GCM. Neue Repos per API anlegen. Kein GitHub.