- Knöpfe in normaler Schreibung, Hauptknopf mit Verlauf und Schein, Rest Glas.
- Lagebild des Homelab-Cockpits: Statusblock mit Schein, Geräte als Kacheln
mit Logo, Zustandspunkt und Version; Klick führt zu den Updates bzw. zur
Zeile in der Geräte-Tabelle. Lage-Texte in normaler Schreibung.
- Geräte-, Update- und Snapshot-Liste mit Logos; Balken in Bereichsfarbe.
- Snapshots: je Gerät „Rückweg testen“ (Rückfrage vom Homelab-Teil) und oben
„Alle Update-Rückwege löschen“ — nur Snapshots mit Herkunft „update“ und
Sicherungen des Orchestrators, nacheinander, eine Meldung am Ende (nur per
Klick des Users; per Knopf/von Hand angelegte bleiben).
- Test gegen Variablen namens „Symbol“ (React Compiler braucht Symbol.for).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
181 gängige Homelab-Dienste als SVG unter /logos (440 KB), geladen mit
frontend/scripts/logos_laden.py (User-Ja 25.09.2026). 33 davon in der hellen
Variante, weil das Standard-Logo auf dem dunklen Grund verschwände (gemessen:
jedes Logo auf den Kachelgrund gezeichnet). Das Gerätesymbol zeigt das Logo,
wo es eines gibt (Name, feste Zuordnung für NPMplus, PBS, PVE Scripts), sonst
das gezeichnete Symbol; mit Logo wird die Kachel neutral, nur der Rand trägt
den Bereich. KI-Box: Ubuntu, llama.cpp, Hermes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Hermes-Dashboard: festes Session-Token der früheren Desktop-Anbindung wird
nicht mehr gesichert oder zurückgespielt (liegt im Archiv auf der Box).
Es bindet weiter an 0.0.0.0, weil Hermes seine Anmeldung auf 127.0.0.1
abschaltet; ufw hält 9119 zu (Kommentar in config.py nachgezogen).
- Selbstreparatur und PC-Pfad-Skill nutzen das System-Python (hat PyYAML)
statt der alten Hermes-venv; die steht jetzt samt Sicherung als Altrest
im Aufräumen-Panel (Löschen per Klick, empfohlen nach dem Sonntagslauf).
- deploy/nur-box/: Kopien der Units, die nur auf der Box leben
(Hermes-Dashboard, llama-swap samt Drop-ins) — werden nicht ausgespielt.
- Offene Fäden nachgezogen: Discard VM 106, Rückweg-Probe, AdGuard,
Ausbauplan-Entscheide der Klärungsrunde.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Neuer Baustein „probe“ (POST /api/homelab/ziele/{id}/rueckweg-probe): legt den
Rückweg an wie vor einem Update, wertet die Prüfung absichtlich als rot, geht
zurück und prüft danach, ob das Gerät läuft und antwortet. Kein Update dabei;
Meldung grün bzw. dringend rot. Die Probe steht im Protokoll, nicht im
Update-Verlauf und nicht unter „Zuletzt eingespielt“. Der Snapshot bleibt
liegen (wie nach einem echten Rückweg).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tiefblauer Grund mit Lichtflecken in den Bereichsfarben, Glasflächen mit
Lichtkante (flaeche), ruhigere Schrift (Überschriften normal geschrieben,
Großbuchstaben nur als kleines Etikett) und dezente Bewegung.
- Startseite neu: Geräte-Ring mit Gesamtlage, drei Eckwerte, Instrumente
(8 Messringe), Bereichskarten mit Kacheln je Modell, Baustein und Gerät
(Symbol, Zustandspunkt, Update direkt an der Kachel), Speicher/NAS,
Zeitleisten „Als Nächstes“ und „Zuletzt eingespielt“.
- Panel, Schildchen, Kennzahl, Verlaufslinie, Seitenleiste und Kopf im
neuen Look — wirkt schon auf allen Seiten.
- Symbole je Gerät (lib/geraetebild): Farbe des Bereichs, Zustände nur als
Punkt. Vorbilder: Heimdall, Dashy, Homepage, umbrelOS, Pulse.
Noch nicht ausgerollt (kein dist): erst nach dem Ja des Users.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die Seite /homelab/snapshots (in der Seitenleiste nach „Updates“: Snapshots sind der Rückweg der Updates) zeigt je
Gerät die Snapshots mit Zeitpunkt, Alter, Herkunft (vor Update / per Knopf / von Hand) und Beschreibung, beim PBS die
Sicherungen des Orchestrators mit Größe. Knöpfe „Snapshot anlegen“, „Zurücksetzen“ und „Löschen“ gibt es nur für
freigegebene Geräte und nur für mc2-Snapshots bzw. eigene Sicherungen; von Hand angelegte bleiben reine Ansicht. Die
Rückfragen kommen vom Homelab-Teil (wie im Ziel-Modell); Zurücksetzen sagt vorher, was verloren geht und dass das
Gerät neu startet. Am Handy (320–400 px) untereinander, ab md Knöpfe rechts, ab xl fünf Spalten.
Entscheide:
- Ausführer: kein neuer Befehl. Der Bericht bringt zusätzlich snapshot_details (snaptime, Beschreibung, eigen) und
sicherung_details (ctime, Größe); snapshots und sicherungen bleiben unverändert. Keine Belegung je Snapshot — die
kennt Proxmox bei LVM-Thin nicht, die Seite sagt das so. „snapshot“ nimmt einen Anlass (update oder knopf) und
wählt damit eine feste Beschreibung, damit ein Snapshot auf Knopfdruck nicht „Vor einem Update“ heißt. Bis der neue
Ausführer eingespielt ist, liest der Homelab-Teil den Zeitpunkt aus dem Namen.
- Aktionen sind Läufe in homelab-laeufe.json (Mechanik aus updates.py): gleiche Sperren (START_SPERRE, je Gerät einer,
SAMMELLAUF_SPERRE), Protokoll-Art „snapshot“ mit eigenen Titeln, der Wächter lässt ein Gerät im Zurücksetzen in
Ruhe. Zusätzlich keine Aktion, solange irgendwo ein Update läuft: Der Ausführer arbeitet einen Auftrag nach dem
anderen ab — hinter einem Update liefe die Aktion in ihr Zeitlimit und käme danach unbeobachtet doch noch dran.
- Zurücksetzen prüft danach wie ein Update und meldet immer ([Homelab-Snapshot], bei Rot als Alarm); anlegen und
löschen melden nur ihr Scheitern, das Ergebnis steht beim Gerät. Nicht im Update-Verlauf, nicht unter „Zuletzt
eingespielt“.
- Per Knopf angelegte Snapshots räumt kein grünes Update weg (updates._aufraeumen fragt snapshots.knopf_namen).
- speicher.py: alle Snapshots in einem Vorschlag mit Verweis auf die Seite statt einer je Snapshot.
- Nebenbei: Der Update-Verlauf stürzte bei einem Ergebnis ohne Eintrag ab (etwa „offen“ nach einem Docker-Probelauf);
die Protokoll-Seite stürzte im Entwicklungsmodus ab (Konstante „Symbol“ gegen das Symbol.for des React Compilers);
Auftragstitel „Alter Snapshot gelöscht“ heißt jetzt „Snapshot gelöscht“ (gelöscht wird auch von Hand).
Tests: pytest test_homelab_snapshots.py (Ausführer-Details, Liste, Läufe mit nachgespieltem Ausführer, Sperren,
Aufräumen, Schnittstelle), test_homelab_speicher.py; Vitest SnapshotListe, lib/snapshots, Speicher. Prüftor grün.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die Schublade „Dienste und Protokolle" war eine schlichte Liste (Punkt, Name, „läuft",
zwei Knöpfe). Jetzt eine Seite im Bereich KI-Box, gebaut wie die Geräte-Tabelle im
Homelab-Cockpit: je Dienst Zustand in Worten (läuft, schläft, gestoppt, gescheitert,
antwortet nicht), CPU, Speicher, „Läuft seit" und Neustarts; Probleme oben. „Protokoll"
klappt unter der Zeile auf (das Neueste unten im Blick), Neu starten / Starten / Wecken
fragen vorher nach.
Entscheidungen:
- Seite statt Schublade: die Tabelle braucht die Breite, und der Eintrag steht jetzt wie
die anderen Seiten in der Seitenleiste. Schublade samt onDienste-Weg entfernt.
- Speicher = MemoryCurrent als Zahl mit Einheit; der Balken zeigt den echten Anteil am
Arbeitsspeicher der Box, keine erfundenen Prozente. Bei der Engine zählt der
Grafikspeicher (GTT) mit — dort liegen die Modelle, und systemd rechnet ihn keinem
Dienst zu (25.09.: 4,3 GB laut systemd, 27,6 GB Modelle).
- CPU = Anteil an allen Kernen aus CPUUsageNSec zwischen zwei Abfragen (die Seite fragt
alle 10 s). Fehlt eine brauchbare Probe, misst die Box einmal 0,5 s nach. Ruhiges Blau
ohne Warnfarben: ein Dienst hat keine Grenze, was zählt, zeigt der Zustand.
- Neustarts = NRestarts (automatische Neustarts nach Absturz), am Handy nur, wenn es
welche gab; mehr als 0 rückt den Dienst nach oben.
- Backend: Liste und Kennzahlen in services/dienste.py (ein systemctl show je Bereich,
auf Windows harmlos leer), Router dünn. Die Felder der MCP-Werkzeuge bleiben;
waechter.dienst_zustand war nur für die alte Liste da und ist weg.
- Tabelle ab xl, Knöpfe ab 1400 px nebeneinander, darunter Karten mit zwei bzw. vier
Spalten; bis 320 px keine waagrechte Scrollleiste.
Tests: backend/tests/test_dienste.py (echte systemctl-show-Ausgabe der Box),
frontend lib/dienste.test.ts und views/Dienste.test.tsx.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User 25.09.: „Lucy ist hier der komplette Systemadmin + Helfer“ – „ja, bau das
mit Lucy und dem Orchestrator“. Lucy bekommt die Knöpfe der Oberfläche als
MCP-Werkzeuge: lesen (lage, updates, speicher, protokoll, radar) und handeln
(update_starten, alle_aktualisieren, nach_updates_suchen, dienst_neustarten,
kernel_aufraeumen, host_neustarten, radar_testen, radar_suchen) – über dieselben
MC2-Routen mit Snapshot, Prüfung, Rückweg und Sperren. Jede Aktion braucht einen
Grund (die Bitte des Commanders) und wird protokolliert; die Beschreibungen
verbieten Aktionen auf eigene Initiative (Reparatur-Neustart ausgenommen).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der User: „Viel zu dünn. Und den Graphen kann ja kein Mensch lesen.“ Vorher drei Balken und ein winziges
Stunden-Histogramm ohne lesbare Achsen, halb so breit neben dem Radar.
- Eigene Ansicht views/ModellNutzung.tsx in voller Breite (Radar darunter, ebenfalls volle Breite).
- Kennzahlen: Anfragen mit Schnitt je vollem Tag, heute/gestern, typische Antwort mit „9 von 10 bis“, Fehler
(ab 1 % bernstein, ab 5 % rot, immer mit Wort dazu, nie nur Farbe).
- Tabelle je Absender: Anfragen mit Anteil-Balken, Antwortzeiten, Rechenzeit mit Anteil (NerdQuiz stellt
92 % der Anfragen, aber nur 75 % der Rechenzeit), Fehler in Worten („Modell nicht erreichbar (502)“),
letzte Anfrage. Schmal als Karten mit Beschriftung.
- Neuer Baustein components/diagramme/Saeulen.tsx für „je Tag (7 Tage)“ und „je Stunde (24 h)“: gestapelt je
Absender, glatte y-Achse, Wochentag/Datum bzw. Uhrzeit an der x-Achse (Stunden ausgedünnt auf 3 bzw. 6 h),
Legende, Summen auf den Tagessäulen (bei den Stunden nur die höchste), Anzeige per Zeiger, Finger und
Pfeiltasten, darunter „Werte als Tabelle“. Auf dem Handy steht die Anzeige unter dem Diagramm, sonst
verdeckte sie das halbe Bild. Säulen höchstens 24 px, 2 px Luft zwischen den Stücken statt Rändern.
- Farben: neue Tokens --reihe-3 (Gelb) und --reihe-weitere (Grau; ab der vierten Farbe fasst „Weitere“
zusammen). Mit dem Paletten-Prüfer gegen #15181b gemessen: jedes Paar auch bei Rot-Grün-Schwäche getrennt.
Türkis fiel durch (neben Magenta bei Grünschwäche ΔE 1,6), Violett gleicht der KI-Box-Farbe.
Die Farbe folgt dem Absender (feste Reihe der Box), nicht dem Rang.
- „Wann welches Modell geladen wurde“ eingeklappt darunter: Anzahl, zuletzt, davor — mit Rolle (Hirn, Coder,
Bild-Zwilling) statt nur Dateiname.
- useBreite aus Verlauf.tsx nach lib/breite.ts, damit beide Diagramme ihn teilen.
- Ältere Stände der Box ohne die neuen Felder zeigen weiter Anzahlen und Verläufe, Zeiten als „–“ — die
Homelab-Instanz fragt über den Partner und kann einen anderen Stand haben.
frontend/dist ist bewusst nicht gebaut (kommt beim Zusammenführen).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
„Wer nutzt die Modelle“ war zu dünn (nur Anzahl je Absender). Das Journal gibt je Anfrage auch Status und
Dauer her — daraus rechnet die Box jetzt mehr, alles nur ergänzt; die alten Felder bleiben für den Flugplan
(letzte_24h) und für ältere Oberflächen.
- Je Absender: typische Antwortzeit (Median — einzelne 30-s-Wartezeiten bei Neustarts verziehen sonst den
Schnitt), „9 von 10 bis“ (90-%-Wert als nächster Rang, also eine echte Antwortzeit), Rechenzeit (Summe aller
Antwortzeiten), Fehler (Status nicht 2xx, je Code) und die letzte Anfrage. Go-Dauern werden samt ms/µs/ns
und „1m2.3s“ gelesen.
- Fenster = die letzten 7 Kalendertage bis jetzt statt 7×24 h rollend: je_tag hat genau 7 Tage, heute als
letzten, auch leere — alle Zahlen beziehen sich auf dasselbe Fenster.
- „stunden“: die letzten 24 h chronologisch mit Beginn (in UTC gerechnet, damit die Zeitumstellung keine
Stunde verschluckt). letzte_24h bleibt Stunde des Tages wie bisher.
- „ladevorgaenge“: je Modell Anzahl und die letzten Zeitpunkte („Health check passed“).
- „reihe“: feste Reihenfolge aus der Namensliste, damit die Farbe dem Absender folgt und nicht dem Rang.
NerdQuiz als größter Verbraucher zuerst (ruhiges Blau).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User 25.09.: „Warum kann ich Modell-Tests nicht selbst anstoßen, sondern muss
immer auf die Box warten?“ Nachts testet das Radar weiter selbst. Tagsüber jetzt
auch per Knopf – aber nur, wenn Kandidat, Warm-Set UND der heutige Coder
zusammen unter die 115-GB-Grenze passen (der Test-Wächter stoppt den Kandidaten
erst bis zu 10 s, nachdem der Coder zu laden beginnt), und nicht 00:00–03:30.
Sonst steht der Grund beim Kandidaten. Test als Auftrag (radar_lauf.py --test),
höchstens 2 h, dieselben Leitplanken wie nachts; jedes Ergebnis kommt als Meldung.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User 25.09.: „Hermes' Persona ist Lucy – das muss sich in all ihren Meldungen
widerspiegeln“; das angehängte „(Diese Meldung kam auch an Lucy.)“ tat so, als
wäre sie jemand anderes als der Absender.
- notify.sh: Kopfzeile aus dem Betreff in Lucys Ton (SOUL.md: „Commander“, knapp,
sachlich), bei Dringendem „Commander, das ist dringend.“; keine zweite Anrede,
wenn der Text schon mit ihr beginnt. Morgenmeldung mit kurzen Marken statt
Betreffen in Klammern; die des Homelabs sagt, woher sie kommt.
- Wächter: Zusatz „kam auch an Lucy“ entfernt (der Briefkasten bekommt die
Meldung weiter).
- Melde-Log und Auswertungen unverändert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User 25.09.: 5 Pakete, die Ubuntu gestaffelt verteilt (phasing), standen als
Update da, obwohl apt-get upgrade sie gar nicht einspielt – das Betriebssystem
wurde nie grün. Gezählt wird jetzt, was die Simulation von apt-get upgrade
wirklich einspielen würde; Zurückgehaltenes steht nur noch als Hinweis da.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User 25.09.: Die Karten waren „immer da“ und ließen sich weder bestätigen noch
wegklicken. Beendete Aufträge der KI-Box und das letzte „Alle aktualisieren“
im Homelab haben jetzt einen Knopf „Ausblenden“ (quittiert wird auf dem Server,
gilt also auf allen Geräten; das Protokoll behält alles).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der erste Bericht nach dem Neustart vom 25.09. kam 34 s nach dem Hochfahren –
Proxmox kannte die Gäste noch nicht („unknown“), und zehn Minuten lang zeigte die
Oberfläche jeden Gast als unbekannt. Enthält ein Bericht solche Gäste, folgt der
nächste nach 60 s. Der Grund steht jetzt auf Deutsch da.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User-Wunsch 25.09.: Auf dem Host lagen 25 Kernel (~23 GB), 20 davon hält apt für
entbehrlich (19,7 GB).
- Ausführer: host.kernel_alt/kernel_bleiben aus apt-get -s autoremove (nur
Kernel, nie laufender, nächster oder festgepinnter), host.systemplatte;
neue Aktion kernel_aufraeumen bestimmt die Liste selbst und purgt.
- Homelab-Teil: Lauf „kernel“ (Ergebnis aufgeraeumt), POST
/api/homelab/ziele/pve/kernel-aufraeumen, Vorschlag mit Knopf, Wächter für die
Systemplatte (80/90 %).
- Oberfläche: Kachel Systemplatte, Knopf „Alte Kernel entfernen“ mit Rückfrage.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Das Hermes-Update vom 25.09. scheiterte halb: neuer Code geholt, dann baute
python-olm (Matrix-Extra) nicht – CMake 4 und kein clang auf der Box. MC2 startete
das Gateway ohne daemon-reload neu, es lief weiter aus dem alten venv (neuer Code,
alte Pakete), und die Übersicht zeigte „v0.0.0 · Aktuell“.
- Update über Hermes' eigenen Starter (.hermes/bin/hermes), gebaut mit
CC=gcc CXX=g++ CMAKE_POLICY_VERSION_MINIMUM=3.5, doctor-Hinweise nicht fatal,
daemon-reload vor dem Neustart.
- deploy/hermes-plugin-deps.sh legt trafilatura (mc2-web-lesen) in Hermes'
aktive Umgebung.
- Version: bei „0.0.0“ in der pyproject das Commit-Datum im Stil der neuen Tags.
- Ehrliche Meldung „UNVOLLSTÄNDIG“, wenn der Code schon neu ist.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nach dem ersten echten „Alle aktualisieren“ (25.09., 8 Schritte grün):
- 9 veraltete Images, die kein Container benutzt (Basis-Images für Builds/CI),
blieben für immer „neu“ – Arcanes Updater tauscht nur Container. Sie zählen
jetzt nicht mehr, der Grund nennt sie als Aufräum-Hinweis.
- Proxmox legt bei Kernel-Updates kein /var/run/reboot-required an: 7.0.14-19
war installiert, 7.0.14-12 lief, kein Neustart-Knopf. Der Ausführer vergleicht
jetzt den neuesten installierten (oder festgepinnten) Kernel mit dem laufenden.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User-Wunsch 25.09.: Speicherpool im Wächter (gelb ab 80 %, rot bei 10 % frei)
samt Empfehlungen, dazu das NAS (Backup-Ziel, per NFS auf dem Proxmox-Host).
- Ausführer: Thin-Pools mit echter Belegung je Volume (lvs), ungenutzte und
verwaiste Platten, VM-Belegung über den Gast-Agenten, Discard je VM,
Netzlaufwerke (df mit Zeitlimit, hängender harter NFS-Mount hält nichts auf),
Sicherungsaufträge und jüngste Sicherung je Gast.
- Homelab-Teil: services/homelab/speicher.py (Auswertung, Empfehlungen,
Wächter pruefe_speicher, NAS-Erreichbarkeit per TCP), GET /api/homelab/speicher;
Gast-Plattenwächter nennt jetzt auch VMs richtig.
- Oberfläche: Karte „Speicher und Sicherungen“ im Homelab-Cockpit.
- deploy.sh und ausfuehrer-einrichten.sh warten, solange im Homelab ein Update
oder „Alle aktualisieren“ läuft (der Neustart bräche den Lauf ab).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die VM schreibt laufend (Docker, Rippy; Thin-Platte zu 99,9 % belegt) – ein
stehender Snapshot wüchse im Thin-Pool bis zum nächsten Update mit. Bei den
Containern bleibt der letzte Snapshot wie bisher als Rückweg stehen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die Update-Liste zeigte bei Arcane „Snapshot vorher, bei Rot zurück“, obwohl das
Docker-Update keinen Snapshot anlegte (und der Ausführer VM 106 ohne Etikett gar
nicht anfassen darf). Jetzt:
- Gäste ohne Freigabe haben Rückweg „keiner“, Rückfrage und Plan sagen es.
- Echte Docker-Updates legen vorher einen Snapshot der VM an, wenn sie freigegeben
ist, prüfen danach (Fehler-Container, Arcane antwortet binnen 3 min) und gehen
bei Rot zurück – wie bei den Containern.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nur die eigenen Abschnitte: neue Punkte im Homelab-Teil vor „Arcane und Docker“ bzw. vor „Wöchentliches
Suchen“, der Arcane-Punkt, eine Zeile in der Betreff-Tabelle und der offene Punkt Arcane-Schlüssel (jetzt in
der Oberfläche eintragbar).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sammellauf (services/homelab/sammellauf.py): alle Updates mit Knopf nacheinander über updates.starten,
Gäste nach VMID, dann NPMplus und AdGuard, zuletzt die Host-Pakete (nie der Neustart). Rot stoppt den Rest
(übersprungen, abgebrochen, dringende Meldung); grün gibt eine Sammelmeldung, die Erfolgsmeldungen der
Schritte bleiben so lange aus. Nur einer gleichzeitig, der einzelne Knopf lehnt solange ab (START_SPERRE).
Ein Neustart mitten im Lauf macht ihn beim Start zu „abgebrochen“, „unterbrochen (Neustart)“.
- Protokoll (services/homelab/protokoll.py): Aufträge, Läufe, Sammelläufe, Wächter-Verlauf, Melde-Log und
wöchentliches Suchen, neueste zuerst, ohne Geheimnisse. Der Kanal hebt 500 erledigte Aufträge auf und
vermerkt eingehende Berichte; die Pflege führt eine kurze Ereignisliste, der Wächter-Verlauf die Stufe.
- Einstellungen (services/homelab/einstellungen.py): Arcane-Schlüssel erst gegen Arcane prüfen, dann in
arcane.key (0600) speichern, nie zurückgeben; echte Docker-Updates per Schalter. Die Umgebung geht vor.
- Schnittstellen als eigener Block in routers/homelab.py vor den Ausführer-Endpunkten.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Aufbau (Speicher, Taktgeber, Ausfuehrer-Faden, Schnittstellen, Waechter),
Ablage und Groesse der Dateien, Aufbewahrung, Handgriffe zum Nachsehen und
der Hinweis, dass der Ausfuehrer mit ausfuehrer-einrichten.sh kommt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- kern/messreihen.py: Minutenwerte als JSON-Zeilen je Quelle und Tag unter
<Datenordner>/mc2-messwerte/, Anhaengen unter flock, Aufraeumen nach 8 Tagen,
Lesen fuer 1h/24h/7d (60 s, 5-min- und 30-min-Mittel), Luecken bleiben null,
kaputte Zeilen werden uebersprungen, Zaehler-Raten ohne Spruenge
- KI-Box: Taktgeber im Steward (services/messwerte.py) schreibt jede Minute
cpu, ram, gpu, Temperaturen, platte, Netz in Bytes/s und Tokens pro Minute;
GET /api/messwerte (nur Rolle box)
- Homelab: Der Ausfuehrer schickt jede Minute in einem eigenen Faden Host-Werte
aus /proc und die Gaeste aus einem pvesh-Aufruf an
POST /api/homelab/ausfuehrer/messwerte; services/homelab/messwerte.py rechnet
die Zaehler in Bytes/s um (Neustarts und Spruenge ergeben null),
GET /api/homelab/messwerte liefert Host und Gaeste wie im Inventar
- Waechter (homelab): gelb, wenn der Host 10 Minuten ueber 95 % RAM oder 90 °C liegt
- Aufraeumen der Modell-Platte bietet mc2-messwerte nie zum Loeschen an
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Startseite "Alles auf einen Blick": Gesamtlage, je Bereich Messwerte mit Verlauf, wer welche Updates hat
(Kurzform, Klick fuehrt in den Bereich), Hinweise, als Naechstes und zuletzt eingespielt
- Menue: Uebersicht, KI-Box (Cockpit, Updates, Modelle, Monitoring), Homelab (Cockpit, Updates, Monitoring,
Protokoll), Einstellungen; Bereichsfarben Indigo und Violett; alte Adressen /updates und /modelle leiten weiter
- Homelab-Updates je Geraet: App-Version laeuft -> neu (mit Grund, wenn sie wartet), Pakete, Rueckweg, Knoepfe;
Alle aktualisieren mit Plan in der Rueckfrage und Fortschritt; Cockpit zeigt die Gesundheit der Geraete
- Einstellungen als Seite: KI-Box, Homelab (Arcane-Schluessel, Docker echt/Probelauf, Ausfuehrer), Meldungen,
Software-Stand
- Diagramme: Verlauf mit Fadenkreuz, Legende und Tabellenansicht, Kennzahlen mit Linie; Farben geprueft
- Tab-Symbol: favicon.ico/.svg, apple-touch-icon, Manifest-Icons
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der Ausfuehrer schickt die Belegung der rootfs laufender Container mit; ab 85 % gelb, ab 95 % rot, in der
Geraeteliste als eigene Spalte und auf der Lampe des Geraets. Anlass: AdGuard (2 GB) war voll, das
Abfrageprotokoll schrieb nicht mehr und die Paketsuche scheiterte, ohne dass es eine Anzeige sagte.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ohne systemd (Entwicklung am PC) meldete die Schublade „Der Timer läuft noch
nach einem anderen Plan“, obwohl dort niemand weiß, wonach er läuft. Die
Hinweise zu Zeitfenster und Radar erscheinen jetzt nur, wenn die Box schalten
kann. Gesehen in der Vorschau gegen ein lokales Backend.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- BETRIEB.md: PBS-Sicherung (was, wohin, warum seit 21.08. aus, Zugang nur auf der Box) mit
Anleitung zum Einschalten samt Probelauf; neuer Abschnitt Probe-Wiederherstellung (Takt,
Pruefungen, Ergebnisdatei, Meldung); Waechter-Tabelle und Hirn-Pruefung; Betreff [Sicherung].
- OFFENE-FAEDEN.md: erledigt und raus: ungepinnte Abhaengigkeiten, Hirn-Pruefung, synchrone
Radar-Suche und Laden ohne Ergebnis, Kleinkram im Code. Neu offen: PBS einschalten (Lead).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- mcp/mcp_mc.py: Werkzeug set_route entfernt. Es rief PUT /api/routing/route, eine Route, die
es nie gab; die Routing-Policy hat seit dem Box-Wart-Umbau keine Schreib-Route mehr (lesen
bleibt: routing_overview). Die Datei bleibt, weil die Hermes-Config auf der Box den Server
mission-control-stack noch eingetragen hat (enabled: false).
- deploy/hermes-postcheck.sh: Block fuer den Patch-Traeger (deploy/hermes-patches/apply.py)
entfernt; der Traeger ist seit 1e68f62 weg, die Pruefung warnte nur noch bei jedem Lauf.
- voice_service/app.py: Kopftext nennt Parakeet-TDT (onnx-asr) als Standard und faster-whisper
als Rueckfall, wie der Code es tut; den Verweis auf den abgebauten Mem0-Sidecar gestrichen.
- .aiexclude entfernt (galt nur dem abgeloesten Antigravity).
- requirements: gepinnt auf pip freeze der Box (Python 3.14) und des Containers 107
(Python 3.13): gleiche Version "==", sonst ein Bereich ueber beide. Ausnahme mcp==1.28.1:
mcp 2.x hat FastMCP entfernt (from mcp.server.fastmcp scheitert), der Container hat 2.2.0,
nutzt mcp aber nicht. Auf der Box aendert pip damit nichts; im Container zieht einrichten.sh
mcp beim naechsten Ausrollen auf 1.28.1 zurueck. pytest==9.1.1 (nur Box).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- PBS: deploy/pbs-backup.sh, pbs-backup.service und .timer (User-Units, 03:50) aus der Box
uebernommen. Die Sicherung lief vom 09.07. bis 20.08. taeglich gruen und brach am 21.08. ab,
weil ihr erster Quellordner /srv/models/mem0 (altes Gedaechtnis) fehlte; danach im
KISS-Umbau abgeschaltet. Das neue Skript sichert ~/.hermes und /etc/llama-swap (Pflicht)
und ~/wissens-vault (optional), prueft Zugangsdatei und Client, und liest den Zugang erst
direkt vor dem Aufruf ein. deploy.sh spielt die Units aus, schaltet sie aber nicht ein
(Einschalten von Hand, docs/BETRIEB.md). Der Waechter zeigt einen gescheiterten Lauf gelb.
- Probe-Wiederherstellung: services/probe_wiederherstellung.py packt die juengste Sicherung
in /var/tmp/mc2-probe-* aus (ohne Geheimnisse und Verknuepfungen), prueft Alter (<= 48 h),
Lesbarkeit und Pflichtinhalte (Gedaechtnis und SOUL.md auch gegen den lebenden Stand,
Skills, Cron-Skripte und -Jobs, Hermes-Config, .env, llama-swap-Config, Box-Wart-Zustand,
Units) und loescht den Ordner wieder. Ergebnis in /srv/models/mc2-probe-wiederherstellung.json,
bei Rot Meldung "[Sicherung]" ueber notify.sh in normaler Dringlichkeit.
Timer mc2-probe-wiederherstellung.timer: erster Montag im Monat 05:15 (nie sonntags, lange
nach 03:30), Persistent=true; deploy.sh aktiviert ihn.
- Waechter: gelb, wenn die letzte Probe rot war, aelter als 40 Tage ist oder (mit Timer) noch
nie lief; Knoepfe "Jetzt pruefen" und "Protokoll" (Allowlist in services.maintenance).
- Tests: Probe gruen/rot je Pflichtinhalt, Abgleich, kaputte und alte Sicherung, Meldung,
Waechter-Hinweis, Unit-Listen in deploy.sh, Takt, LF, pbs-backup.sh mit Client-Attrappe.
Trockenlauf gegen die echte Sicherung der Box (nur in /tmp): alle Pflichtinhalte gruen, 0,4 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Waechter (pruefe_kern): prueft jetzt gezielt das Modell mit der Rolle hermes und seinen
Zustand in llama-swap (/running, v257 listet auch ladende Modelle), statt das Hirn fuer
bereit zu halten, sobald irgendein Modell laeuft. Ein Ladevorgang ist kein Ausfall, aber
nur bis 10 Minuten (MC_WAECHTER_HIRN_LADEN_S), sonst bliebe ein immer neu startendes Hirn
unbemerkt. Sonst die ueblichen Takte (FAIL_AFTER); Knopf "Protokoll des Motors".
- llamaswap: modell_zustaende() und hirn_zustand(); lade_modell() meldet ok false mit
deutschem Grund und der Meldung der Engine, "laedt noch" nach der Wartezeit ist kein Fehler,
ein geladenes Modell ohne Chat (embed) zaehlt als geladen. POST /api/models/{id}/load
reicht das Ergebnis durch (Router duenn).
- Radar "Jetzt suchen": startet die Suche als Auftrag (Job-Engine, Gruppe radar, hoechstens
einer, radar_lauf.py --nur-suche) und antwortet sofort mit der Auftrags-ID. Die Ansicht
zeigt "Sucht ..." bis der Auftrag fertig ist, liest danach das Radar neu und nennt eine
gescheiterte Suche; die Auftragskarte zeigt den Stand.
- Tests: Hirn-Zustaende und Frist, Laden gegen eine llama-swap-Attrappe, Radar-Auftrag.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- BEDIENUNG.md: Meldungen mit Telegram-Test, Update-Zeitfenster, Modell-Radar,
Software-Stand, Altreste im Aufräumen, Telegram-Tabelle.
- BETRIEB.md: Einstellungsdatei, Drop-in und Stempel gegen das Nachholen,
Neustart-Fenster, Radar-Schalter im Deploy, Stand-Datei, FALLBACK mit Grund.
- OFFENE-FAEDEN.md: Altreste stehen jetzt im Aufräumen; was bewusst nicht in
der Liste steht; tote crontab-Zeile (curator-idle-watchdog.sh).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Einstellungen, die etwas einstellen (services/einstellungen.py, /api/einstellungen):
- Update-Zeitfenster: Wochentag und Uhrzeit des Update-Laufs als Drop-in
mc2-autoupdate.timer.d/zeitfenster.conf. Gegen die Nachhol-Falle von
Persistent=true (24.09.): Timer vor dem daemon-reload stoppen, Stempel auf
jetzt, dann starten. Bei Fehler zurück auf das alte Drop-in. Während eines
Update-Laufs abgelehnt.
- Neustart nur im eingestellten Fenster (deploy/wartungsfenster.sh, drei
Stunden ab der vollen Stunde des Beginns; Standard So 04:00-06:59).
- Radar an/aus: disable --now bzw. enable + Stempel + start (kein Nachholen).
deploy.sh respektiert den Schalter und startet den Radar-Timer nur mit
Stempel; das Zeitfenster-Drop-in fasst er nie an.
- Wächter: schläft der Timer eines Timer-Dienstes, ist ein alter Fehlschlag
kein Befund mehr (der Dienst selbst ist static und schläft nie).
- Telegram-Test je Instanz (/api/einstellungen/telegram-test und
/api/homelab/einstellungen/telegram-test) über notify.sh -d; Ergebnis und
Grund aus dem Melde-Log. notify.sh schreibt jetzt auch den Grund des
gescheiterten Zweitwegs in den FALLBACK-Eintrag.
- Einstellungsdatei mc2-einstellungen.json im Datenordner.
Software-Stand: deploy.sh und homelab/ausrollen.sh schreiben nach dem
Umschalten mc2-stand.json (deploy/stand-schreiben.py); /api/instanz liefert
den Stand, die Einstellungen zeigen beide Instanzen und warnen bei Abweichung.
Ohne Datei aus git, sonst unbekannt.
Aufräumen: Altreste neben dem Betrieb aus einer festen, auf der Box geprüften
Liste (Größe, Hinweis, nur was da und nicht in Gebrauch ist). Löschen nur per
Kennung und Klick mit Rückfrage; Worktrees mit git worktree prune, Alt-Units
mit daemon-reload, /opt/llamacpp notfalls mit sudo -n.
Tests: pytest mit einem systemd-Abbild samt Nachhol-Regel, echtem notify.sh
(Ersatz-Hermes, Tmp-Zugang, lokale Bot-API), Shell-Funktionen des
Wartungsfensters und von deploy.sh; vitest für die Rückfragen der Schublade.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Statt der flachen Leiste oben (Start, Updates, Modelle, Homelab) steht links die Menuefuehrung: je Bereich ein
Block mit eigener Verbindungsanzeige und seinen Seiten, Updates mit Zahl. Das Homelab bekommt wie die KI-Box
ein Cockpit (Lage, Hinweise, Geraete) und eine Updates-Seite (/homelab/updates, offene Updates und Verlauf);
der Hinweis auf Box-Updates im Homelab faellt weg. Am Handy dieselbe Leiste als Schublade hinter dem
Menue-Knopf, oben Bereich und Seitentitel; die Leiste unten und das Mehr-Menue entfallen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- karenz.py: ct/<app>.sh juenger als MC_HOMELAB_KARENZ_H (Standard 48 h) -> Baustein "neu" ohne Knopf,
updates.starten lehnt mit demselben Satz ab (Berliner Zeit). GitHub stumm -> nicht blockieren, die
Rueckfrage sagt es.
- Ausfuehrer: neue Aktionen sichern, sicherung_zurueck, sicherung_loeschen. vzdump auf den ersten lokalen
Speicher mit Inhalt backup (oder sicherung_speicher aus /etc/mc2-ausfuehrer.json), nie auf pbs; vorher
Platz pruefen (frei > belegt x 1,2); Notiz mc2-sicherung, nur solche werden zurueckgespielt/geloescht;
Rueckweg: stoppen, pct restore --force auf den bisherigen rootfs-Speicher, starten. Bericht mit
host.sicherung, sicherung_moeglich/_grund, eigenen Sicherungen und nur_lesen. Unerwartete Fehler werden
beantwortet statt verschluckt; vzdump/restore beim Zeitlimit erst SIGTERM.
- updates.py: Sicherung, wo kein Snapshot geht; bei Rot zurueckspielen, nach Gruen aeltere Sicherungen
weg. Scheitert Snapshot oder Sicherung, beginnt das Update nicht (nicht dringend gemeldet).
- pflege.py: "suchen" fuer Gaeste mit Paketlisten aelter als 7 Tage, nachts 02-05 Uhr (sonst nachholen),
einmal je Gast und Tag, nie neben einem Update oder offenen Auftrag; gelber Waechter-Hinweis, wenn es
zweimal hintereinander scheitert. Eine Registrierungszeile in waechter.py.
- kanal.py: Auftragsliste unter flock, weil jetzt auch der Steward Auftraege anlegt.
- inventar.py: Rueckweg und Rueckfrage fuer die Sicherung; Gaeste mitten im Update-Lauf nicht in der
Webpruefung des Waechters (sonst zweiter Alarm beim Zurueckspielen).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vorher stand alles auf Geraetekarten durcheinander (KI-Box zwischen den Containern, Paketstand, App-Version,
Knoepfe und Rueckweg je Karte). Jetzt: oben die Lage wie das Warnpanel der Startseite (grosse Leuchte + eine
Lampe je Geraet), darunter nur die offenen Updates als Tabelle mit Rueckweg und Knopf, dann die Geraeteliste
(App, Pakete, Netz) und der Verlauf. Die KI-Box steht nur noch als Hinweis auf ihre eigene Updates-Seite.
Solange der Homelab-Teil laedt, sagt die Seite nicht mehr voreilig "aktuell".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nach dem ersten echten Update (Gitea 1.27.2 -> 1.27.3) stand Gitea nur noch als "gitea" ohne App-Baustein da.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nachgelesen in ct/<app>.sh: AdGuard und PVE Scripts Local verweisen auf ihren eingebauten Updater,
Gitea/NetBird/NPMplus aktualisieren wirklich, PBS ueber die Pakete. /root/.proxmoxve-local stand noch
auf 0.5.8, die App selbst schon auf der neuesten Veroeffentlichung (v1.2.1, untagged).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- deploy/homelab/ausfuehrer.py: laeuft als root auf dem Proxmox-Host, holt Auftraege beim Homelab-Teil
ab (Pull, kein offener Port), feste Aktionsliste, prueft Etiketten selbst; Bericht gegen den echten
Host erprobt (nur lesend). Kein Proxmox-Schluessel im Container noetig.
- services/homelab: Kanal mit gemeinsamem Geheimnis, App-Katalog, Inventar -> Ziele im gemeinsamen
Modell (GitHub-Versionen, Webpruefung, alte Paketlisten = unklar), Jetzt updaten: Snapshot ->
Update -> Pruefung -> bei Rot zurueck + dringende Meldung
- Waechter in der Rolle homelab: Ausfuehrer schweigt, Gaeste antworten nicht
- kern/github.py fuer beide Rollen (auch untagged Releases mit Version im Namen)
- Oberflaeche: Seite Homelab zeigt alle Geraete als Karten (KI-Box ueber /api/ziele, Homelab ueber
/api/homelab/ziele) mit Stand, Rueckweg und Knopf samt Rueckfrage
- Einrichtung als Skripte (container-anlegen, ausrollen, ausfuehrer-einrichten, box-partner) — noch
nicht ausgefuehrt, jeder Schritt braucht das User-OK
- frontend-bauen-box.sh: Frontend-Pruefung und Build auf der Box, wenn der PC keinen Speicher hat
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- llamaswap.sammeln(): Aenderungen lesen dieselbe Config aus dem Speicher, geschrieben wird
einmal am Ende, bei einem Fehler gar nicht
- Radar-Tausch und Hirn-Umstellung nutzen es; Hermes wird erst nach dem Schreiben umgestellt
- Test-Attrappe fuer update_brain_model: der Radar-Test faesst auf der Box nie die echte
Hermes-Config an
- Doku: Ziel-Modell, strukturierter Verlauf, Sammel-Schreiben
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- kern/ziele.py: Ziel -> Bausteine mit Stand (neu/aktuell/unbekannt/festgehalten/wird-geprueft),
Versionen und dem Knopf, der das Update anstoesst; gleiches Modell fuer Box und Homelab
- services/box_updates.py: Update-Zwischenspeicher aus dem Router geholt, ki_box_ziel() als
Box-Adapter; GET /api/ziele
- Update-Verlauf strukturiert: autoupdate.sh und die Update-Knoepfe schreiben je Baustein eine
JSON-Zeile (mc2-update-verlauf.jsonl); die Meldungstexte bleiben gleich, aeltere Laeufe kommen
weiter aus dem Meldeprotokoll. Updates per Knopf erscheinen jetzt auch im Verlauf.
- jobengine: Abschluss-Haken fuer jedes Ende (neben der Nacharbeit fuer den Erfolg)
- Sonntags-Lauf setzt seinen Anlass; Hermes-Job aus dem Lauf schreibt nicht doppelt
- Vertragstest Bash-Schreiber gegen Python-Leser (laeuft auf der Box mit jq)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- /api/instanz: Rolle der ausliefernden Instanz, ohne Netzabfragen
- lib/instanz.ts: /api/homelab/... an die Homelab-Instanz, alles andere an die Box,
ueber /api/partner/..., wenn die andere Instanz die Seite ausliefert
- neue Seite Homelab: Stand der zweiten Instanz (noch nicht eingerichtet / verbunden /
antwortet nicht) und was dazukommt
- Kopfzeile, Titel und Web-Manifest mit neuem Namen; fuenfter Menuepunkt, 320 px geprueft
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Befunde der Schlussdurchsicht (Attrappe des Backends, 320 x 568 bis 1440 px):
- Rueckfragen: Bei 320 x 568 lagen "Installieren"/"Abbrechen" unter dem Bildschirmrand
und liessen sich nicht erreichen (Dialog 791 px hoch, kein Scrollen). Jetzt hoechstens
Bildschirmhoehe, der Text scrollt, die Knoepfe bleiben unten stehen. Gilt fuer alle.
- Installieren: Die Rueckfrage sagt jetzt, dass llama-swap beim Eintragen sofort neu laedt
(--watch-config): laufende Antworten von Lucy/OpenChamber brechen ab, mit Rolle nach dem
Download noch einmal. Der Ersatz-Hinweis nennt, dass das bisherige Modell "heavy" behaelt.
- Abbrechen nur noch bei Downloads (eigener Prozess). Updates und die Suche laufen als
Shell-Kette, ein Abbruch stoppt dort nicht sicher alles.
- Auftragstitel in den Worten der Oberflaeche ("Update Motor (llama.cpp)" statt
"Engine-Update (llama.cpp Vulkan)"); "Laeuft seit ... min" zaehlt weiter, auch wenn der
Auftrag nichts schreibt; Ueberschriftenebene passend zum Panel.
- Updates: "Alles jetzt aktualisieren" richtet sich wie die Zeilen nach den frischen
Details (vorher nur nach dem bis zu 10 min alten Start-Stand); "Nach Neuem suchen"
sperrt, solange eine Suche laeuft (zwei apt-get update stolpern ueber die Sperre);
Rueckfragetext sagt genau, was gesichert wird.
- Nach Auftragsende nur nachladen, was betroffen ist (Download: Modelle/Platte; sonst
Versionen/Verlauf/Sicherungen) - die Update-Pruefung fragt GitHub, apt und git.
- Radar "Uebernehmen"/"Verwerfen" und "Endgueltig loeschen": Ja-Knopf gesperrt, solange
die Aktion laeuft, und ein zweiter Klick waehrend des Schliessens loest nichts mehr aus.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- STACK.md: Instanz-Rolle box, Partner noch nicht eingerichtet; 62 /api-Routen; Waechter prueft
die Partner-Instanz, sobald es sie gibt.
- OFFENE-FAEDEN.md: Phase 2 begonnen (2a auf main: backend/kern/, /api/partner,
Partner-Pruefung, Telegram-Zweitweg); die Homelab-Instanz selbst in Phase 3 (User-OK).
Punkt "Waechter prueft die schlafende Spracherkennung" gestrichen - auf main behoben (99ba6a7).
- VERDIKTE.md: eine Codebasis, zwei Rollen (MC_ROLLE); zweiter Weg zu Telegram direkt ueber die
Bot-API.
- FALLEN.md: schlafgelegte Dienste auch in den HTTP-Proben ausnehmen (Fehlalarm 24.09. 14:56).
- ARBEITSWEISE.md, README.md: Homelab-Instanz ab Phase 3, Partner-Pruefung "sobald eingerichtet".
Pruefungen: git grep auf Altbegriffe ausserhalb docs/archiv trifft nur noch die Tabelle
"Ueberholt (mit Datum)" in VERDIKTE.md; 0 tote Links in 15 Dateien; keine zerrissenen Tabellen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- jobengine: jeder Auftrag laeuft als eigene systemd-Einheit mc2-job-<id> (systemd-run,
RuntimeMaxSec als Zeitlimit); Akte, Protokoll und Exit-Code liegen unter
<Datenordner>/mc2-jobs; MC2 nimmt laufende Auftraege beim Start wieder auf
- Geheimnisse (HF_TOKEN) ueber eine nur fuer den Nutzer lesbare Umgebungsdatei, die der
Auftrag beim Start liest und loescht; nichts davon in Befehlszeile oder Einheit
- benannte Nacharbeiten (wartung:nach_update, modell:rolle) statt Closures, laufen auch
nach einem Neustart
- ohne systemd (PC, Tests) weiter als Kindprozess
- deploy.sh wartet nur noch auf Update-Auftraege; Downloads laufen weiter
- 14 neue Tests; systemd-Weg auf der Box echt geprueft (Neustart, Abbruch, Zeitlimit,
Geheimnis nicht sichtbar)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- README.md: eine Seite zum Homelab Orchestrator - Bereiche Box-Wart und Homelab, zwei
Instanzen, Seiten der Oberflaeche, was von allein laeuft, Dienste und Ports, Entwickeln mit
Prueftor, Links. Ersetzt die alte MC2-Seite (Mem0, Ideen-Queue, entfernte Routen, alte
Modelltabelle, kaputte Tabellen).
- docs/README.md (loest docs/wissen/README.md ab): Index, Lesereihenfolge, Archiv-Uebersicht,
Pflegeregeln.
- docs/BEDIENUNG.md: fuer den User neu geschrieben - Start, Updates, Modelle, Dienste,
Einstellungen, jede Telegram-Nachricht mit Bedeutung und Handgriff, "wenn etwas hakt".
- deploy/jobs/README.md: alle Jobs und Timer (Modell-Radar, NerdQuiz-Nachtlauf 03:00,
Updates wieder per Timer), Ausbringen macht deploy.sh, Daily-News-Kette auf dem Stand vom
23./24.09.
- AGENTS.md: Coding-Oberflaeche heisst OpenChamber; der Verweis auf .agents/mcp_config.json
(am 24.09. geloescht) ersetzt durch den tatsaechlichen Weg ueber :9001/v1; Titel mit dem
neuen Produktnamen.
- Archivdatei der Referenzaufgabe umbenannt (…-gedaechtnis-ausbau.md), damit der Index keine
Altnamen traegt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ARCHITEKTUR.md (neu): Prozesse und Units, Rollen box/homelab und Partner-Instanz aus
Phase 2a (kern/einstellungen.py, kern/zeit.py, kern/partner.py, /api/partner), Modell-Rollen,
Bild-Weiche, wer welche Datei schreibt (inkl. mc2-quittiert.json), Meldeweg mit
Telegram-Zweitweg, alle 62 /api-Routen, Herkunftspruefung, kurzer Ausblick Homelab-Teil.
- BETRIEB.md (neu, loest RUNBOOK.md und BACKUP.md ab): Handgriffe, Meldungen und Betreffzeilen,
Waechter-Regeln (Partner nach 5 Takten, Spracherkennung nur wenn wach, Ausblenden-Knopf),
Dienste schlafen/wecken, zweistufiger Deploy mit Prueftor, Sicherung und Zurueckspielen,
Notfall, Pfade auf der Box.
- UPDATES.md (neu): Sonntags-Kette per Timer, Postchecks, Festhalten und Freigeben, Handbetrieb,
Update-Verlauf, Fallen.
- RADAR.md (neu): Modell-Radar (Leitplanken, Nachtablauf, Pruefstand, Uebernehmen/Verwerfen,
Merkliste) und Stack-Radar.
- WIEDERAUFBAU.md (neu, loest DISASTER_RECOVERY.md ab): entschlackte Schrittfolge, Anhang A
(llama-swap-Unit und Drop-ins) behalten.
Stand der Aussagen: Code in main 75611be.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vier Auftraege (zwei laufende, zwei frisch beendete) nahmen auf der Modelle-Seite fast
eine Bildschirmhoehe ein. Ab 1024 px stehen die Karten nebeneinander.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- shadcn liefert zur Laufzeit nichts: gebraucht wird nur shadcn/tailwind.css beim Bauen
(am PC und im CI, beide mit npm ci inkl. devDependencies). Also devDependency; 325
Pakete im Lockfile haengen ausschliesslich daran und sind jetzt "dev".
- @testing-library/user-event war nirgends benutzt: entfernt.
- Dialog/Sheet: ungenutzte Trigger/Close/Footer und "use client" raus.
- test/setup.ts: ResizeObserver-Attrappe fuer Recharts und Kraftgraph entfernt - beide
gibt es nicht mehr, und Radix' Dialog misst nichts.
- eslint.config.js: Die vier React-Compiler-Regeln sollten laut Kommentar auf "error",
sobald ihr Zaehler 0 ist. Er ist 0 - jetzt error. Veraltete Zahlen und "Recharts" im
Kommentar korrigiert.
- lib/utils.ts bleibt (Ziel von components.json fuer die shadcn-CLI), jetzt mit Kommentar.
- Lockfile: npm 11.17 traegt sechs optionale wasm32-Unterpakete zusaetzlich ein, auch
ohne diese Aenderung; die sind wieder raus, damit der Diff nur das Gewollte zeigt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- kern/einstellungen.py: MC_ROLLE (box|homelab), Instanzname, Datenordner, Partner-URL
- kern/zeit.py: eine Zeitzone statt sechs Kopien
- app.py/steward.py: Box-Router und Warm-Set nur in der Rolle box; der Homelab-Teil
laedt nichts von der Box
- /api/health nennt Rolle und Instanz; Engine/Gateway/Hirn nur auf der Box
- /api/partner (Lebenszeichen) und /api/partner/<pfad> (Durchreiche, ohne Schleifen und SSE)
- Waechter prueft die andere Instanz (rot erst nach 5 Takten, ein Neustart ist kein Alarm)
- notify.sh: Zweitweg direkt an die Telegram-Bot-API, wenn hermes send scheitert oder fehlt;
Token nicht in der Prozessliste, Tests greifen nie auf die echte .env
- update_verlauf erkennt "OK telegram direkt"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Dienste: Lade-, Fehler- und Leerzustand; das Protokoll erscheint direkt unter dem
angetippten Dienst (am Handy stand es vorher unter der ganzen Liste ausser Sicht) und
meldet Lesefehler; "Wirklich neu starten?" hat ein "Nein", waehrend eines Neustarts
sind die Knoepfe gesperrt, Meldungen nennen den Dienst beim Namen statt der Unit.
- Einstellungen: Solange der Stand laedt, steht "Wird gelesen ..." statt eines falschen
"Fehlt."; Lesefehler und eine nicht beschreibbare Ablage werden gesagt; Speichern
sperrt gegen Doppelklick, "Zugang loeschen" fragt vorher nach.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- STACK.md: Stand 24.09. - Dienste mit Zustand (Konsole und Spracherkennung schlafen), Units im
Repo und nur auf der Box, Modelltabelle aus der Config vom 24.09. (Hirn, Coder, zwei
Bild-Zwillinge, brains mit exclusive: false), Hermes v0.21.4 mit MCP-Stand nach der Diaet,
vollstaendiger Automatik-Fahrplan (Timer, Hermes-Crons, NerdQuiz 03:00), Coding-Bahn
OpenChamber, Sicherheit in einem Satz.
- VERDIKTE.md: Box-Wart-Verdikte vom 23./24.09. ergaenzt (Umbau statt Neubau, zwei Instanzen,
Homelab-Rechte und -Updates, keine Anmeldung, Nachtruhe, Timer, Box-Diaet, Radar-Leitplanken,
Bild-Zwillinge, exclusive: false); Ueberholtes in eine Tabelle "Ueberholt (mit Datum)";
Formatfehler (Zeilen mit "|-") beseitigt.
- FALLEN.md: neue Fallen (Persistent=true, Abzug ueberschreibt lebende Config, Jobs sterben bei
MC2-Neustart, exclusive, Draft+Bild=500, Hermes-Cron als Updater, write_file, web_extract,
Gitea-SSH-Benutzer); Werkstatt-, Kritiker-, Delegations- und Desktop-Fallen gestrichen.
- ARBEITSWEISE.md mit GRENZEN.md zusammengelegt; Flaechen-Tabelle fuer Box-Wart, Homelab-Teil,
Lucy, Hermes, Telegram, OpenChamber, Android-App.
- OFFENE-FAEDEN.md neu: Phasen 0-5 laut Plan (Phase 1 laeuft, Oberflaeche und Doku offen) und
13 offene Einzelpunkte, alle am Code in main belegt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Befunde aus der Sichtpruefung (Attrappe des Backends, 320/768/1024/1440 px):
- Zaehlwerk: Das "H" ragte bei 320 px 30 px ueber sein Feld. Ziffern skalieren jetzt
mit der Feldbreite (Container-Einheiten), am PC bleibt es bei 38 x 56 px.
- Flugplan und Update-Verlauf: Der Text bekam schmal nur ~50 px und lief in den Zustand.
Schmales Feld: Zeit und Zustand oben, Text darunter (nach Feldbreite, nicht Bildschirm).
- Update-Zeilen am Handy: Name und Version stiessen aneinander ("BetriebssystemUbuntu"),
die Version steht jetzt darunter; scheitert die Pruefung, heisst sie "unbekannt" statt "-".
- Schubladen (Modell-Suche, Dienste, Einstellungen, Protokoll) waren am Handy nur 75 %
und am PC hoechstens 384 px breit - die shadcn-Grundklassen schlugen die eigenen.
- Doppelklick: Die Sperre beim Installieren haengt jetzt an einem Ref und greift sofort
(vorher starteten zwei Klicks im selben Takt zwei Downloads); die Ja-Knoepfe von
"Alles aktualisieren" und "Auftrag abbrechen" ignorieren den zweiten Klick.
- Balken eines abgebrochenen Downloads grau statt cyan.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>