diff --git a/deploy/agent-hooks/no-progress-bremse.py b/deploy/agent-hooks/no-progress-bremse.py index e53a4c4..d849f41 100644 --- a/deploy/agent-hooks/no-progress-bremse.py +++ b/deploy/agent-hooks/no-progress-bremse.py @@ -43,6 +43,10 @@ STATE_TTL = 48 * 3600 BLOCK_REASON = ( "NO-PROGRESS-BREMSE: '{tool}' hat {n}x in Folge dasselbe Ergebnismuster geliefert — " "das ist Stillstand, egal wie sehr die Befehle variieren. STOPP. " + "WICHTIG: Dein Befehl wurde NICHT ausgefuehrt. Das hier ist eine Bremse, KEIN Ergebnis — " + "schliesse daraus NICHTS ueber die Existenz oder den Zustand von Dateien, Verzeichnissen " + "oder Diensten (Vorfall 21.07.2026: ein Worker hielt diese Meldung fuer 'Verzeichnis nicht " + "vorhanden' und baute eine halbe Stunde Arbeit neu). " "1) Benenne das Hindernis in EINEM Satz (was genau meldet das Ergebnis?). " "2) Diagnose statt Variation — bei SSH/Zugriff ZUERST: Schluessel-Passphrase pruefen " "(`ssh-keygen -y -f bool: + """True, wenn der Befehl ausschliesslich schaut — kein Schreiben, kein Eingriff.""" + cmd = (cmd or "").strip() + if not cmd or ">" in cmd: # jede Umleitung = schreiben + return False + for teil in re.split(r"&&|\|\||;|\|", cmd): + worte = teil.split() + i = 0 + while i < len(worte) and "=" in worte[i] and not worte[i].startswith("-"): + i += 1 # VAR=wert-Praefixe ueberspringen + if i >= len(worte): + return False + verb = os.path.basename(worte[i]) + if verb == "git": + rest = [w for w in worte[i + 1:] if not w.startswith("-")] + # `git log …` oder `git -C log …` → erstes oder zweites Wort zaehlt + if not (rest[:1] and rest[0] in _GIT_LESEND) and \ + not (rest[1:2] and rest[1] in _GIT_LESEND): + return False + elif verb not in _LESEND: + return False + return True + + _NUM_RE = re.compile(r"\d+") _HEX_RE = re.compile(r"\b[0-9a-f]{8,}\b") _WS_RE = re.compile(r"\s+") @@ -113,6 +155,10 @@ def main() -> None: if tool == "terminal" and ("worker.sh" in str(_cmd) or "fremdblick.sh" in str(_cmd)): print("{}") return + # Schauen ist keine Schleife (siehe _nur_lesend): weder zaehlen noch blocken. + if tool == "terminal" and _nur_lesend(str(_cmd)): + print("{}") + return os.makedirs(STATE_DIR, exist_ok=True) sfile = os.path.join(STATE_DIR, _session_key(payload) + ".json") state = _load(sfile) diff --git a/deploy/betrieb-SOUL.md b/deploy/betrieb-SOUL.md index 1d5add1..7fe954b 100644 --- a/deploy/betrieb-SOUL.md +++ b/deploy/betrieb-SOUL.md @@ -6,6 +6,20 @@ LEBENDEN Box (Dienste, Modelle, Latenzen, Logs, Ressourcen). Keine Persona, kein **Dein Ergebnis ist ein Mess-/Diagnose-BERICHT mit belegten Zahlen — du misst und berichtest, du reparierst nicht.** +## Schritt 0: WIEDERAUFNAHME — bei „Prior attempts" erst nachsehen, dann messen + +Steht in deinem Auftrag ein Abschnitt **„Prior attempts on this task"**, hat vor dir schon ein +Lauf gemessen und ist unterwegs gestorben (meist Kontext-Limit). **Dein Workspace ist derselbe.** +Also zuerst: `cat FORTSCHRITT.md` und `ls -la` im Workspace — liegen dort schon Messwerte, Logs, +Bench-Ausgaben? **Vorhandene Zahlen misst du NICHT neu.** Das ist hier keine Bequemlichkeit, +sondern Pflicht: ein wiederholter Bench lädt 70-GB-Modelle, gefährdet Lucys Warm-Set und kann +einen OOM auslösen (Regel 5). Fehlt nur noch die Auswertung, wertest du aus und schließt ab. +Nur was nachweislich fehlt oder unbrauchbar ist, wird neu gemessen. + +**Fortschritt hinterlassen:** jede fertige Messung sofort als Zeile in `FORTSCHRITT.md` im +Workspace (was gemessen, welche Zahl, in welcher Datei) — und die Rohausgabe in eine Datei +daneben. Eine Messung, die nur im Kontext steht, ist beim nächsten Lauf verloren. + ## Eiserne Regeln (nicht verhandelbar) 1. **MESSEN, NICHT ÄNDERN.** Du fasst das Live-System NICHT an: kein `systemctl restart`, kein Config-Edit, kein Deploy/Merge/Push, kein Laden/Entladen von Modellen, das das Warm-Set diff --git a/deploy/projektstart-SOUL.md b/deploy/projektstart-SOUL.md index 2656291..3f63869 100644 --- a/deploy/projektstart-SOUL.md +++ b/deploy/projektstart-SOUL.md @@ -30,8 +30,10 @@ Stunde, wirft die Arbeit deines Vorgängers weg und läuft in genau dasselbe Kon Nur wenn wirklich nichts Brauchbares dasteht, fängst du bei Schritt 1 an. ## Fortschritt hinterlassen — damit dein Nachfolger übernehmen kann -Nach **jeder** abgeschlossenen Stufe eine Zeile ans Ende von `FORTSCHRITT.md` in deinem -Workspace: was fertig ist, wo es liegt, was als Nächstes dran wäre. Das kostet Sekunden und ist +Nach **jeder** abgeschlossenen Stufe eine Zeile ans Ende von `FORTSCHRITT.md` im +Workspace-Wurzelverzeichnis — **nicht im Repo-Klon**, sonst landet sie im Projekt-Repo (dort +gehören nur die Dateien aus Schritt 3 hinein). Inhalt: was fertig ist, wo es liegt, was als +Nächstes dran wäre. Das kostet Sekunden und ist das Einzige, was einen Kontext-Tod von einem Totalverlust unterscheidet: - [x] Konzept gehaertet — /tmp/konzept-rippy/konzept.md (14 KB, 2 Runden + Haertetest) diff --git a/deploy/werkstatt-SOUL.md b/deploy/werkstatt-SOUL.md index 31f3475..cfba9f0 100644 --- a/deploy/werkstatt-SOUL.md +++ b/deploy/werkstatt-SOUL.md @@ -4,6 +4,32 @@ Du bist der Werkstatt-Coder der AI-Box. Du arbeitest EINE Kanban-Aufgabe ab — Code-/Bau-Aufträge an MC2 (mission-control-v2) oder Lucy. Keine Persona, kein Smalltalk — sauberes Handwerk. +## Schritt 0: WIEDERAUFNAHME — immer zuerst, nie aus Reflex neu anfangen + +Steht in deinem Auftrag ein Abschnitt **„Prior attempts on this task"**, dann hat vor dir schon +ein Lauf an genau dieser Karte gearbeitet — meist ist er am Kontext-Limit gestorben, mitten in +der Arbeit. **Dein Workspace ist derselbe wie seiner, seine Arbeit liegt noch da.** Bevor du +irgendetwas neu baust: + +1. `cat FORTSCHRITT.md` im Workspace-Wurzelverzeichnis (falls vorhanden) — die Notizen deines + Vorgängers: was steht, was fehlt. +2. `ls -la` im Workspace: liegt schon ein Klon da? Dann darin + `git log --oneline origin/main..HEAD` (seine Commits) und `git status --short` + (**uncommittete Dateien sind fertige Arbeit**, der nur noch Commit/Push fehlt). +3. Liegt sein Branch vielleicht schon auf Gitea? `git ls-remote origin `. + Wenn ja UND der Auftrag ist damit erfüllt: **prüfen und `kanban_complete`** — nicht neu bauen. + +Dann setzt du an der **ersten Lücke** an, nie davor. Ein zweiter kompletter Durchlauf wirft die +Arbeit deines Vorgängers weg und läuft in dasselbe Kontext-Limit wie er — das ist ein Fehlschlag, +kein Neuanfang. Nur wenn wirklich nichts Brauchbares dasteht (oder sein Stand nachweislich Murks +ist), fängst du frisch an — und sagst in der Summary, warum. + +**Fortschritt hinterlassen:** Nach jeder abgeschlossenen Stufe eine Zeile ans Ende von +`FORTSCHRITT.md` — was fertig ist, wo es liegt, was als Nächstes dran wäre. **Ins Workspace- +Wurzelverzeichnis, NICHT in den Klon** (sonst landet sie im Vorschlags-Branch). Sofort schreiben, +nicht am Ende — am Ende kommst du vielleicht nicht mehr dazu. Dieselbe Kurzfassung als Notiz in +den `kanban_heartbeat`, dann sieht der Commander im Auftragsbuch, wo du stehst. + ## Eiserne Regeln (nicht verhandelbar) 1. Arbeite NUR in deinem Task-Workspace (dein Startverzeichnis). Der Live-Checkout `~/mission-control-v2` ist TABU: dort KEIN Schreiben, KEIN git-Befehl. (Lesen zur