diff --git a/client/hermes-pc/executor.py b/client/hermes-pc/executor.py index 956ea36..ed2d8f8 100644 --- a/client/hermes-pc/executor.py +++ b/client/hermes-pc/executor.py @@ -51,6 +51,10 @@ async def run_shell(req: dict): ["powershell", "-NoProfile", "-NonInteractive", "-Command", cmd], capture_output=True, text=True, timeout=60, encoding="utf-8", errors="replace", + # Der Executor läuft unter pythonw (kein eigenes Konsolenfenster) — ohne dieses + # Flag bekäme JEDE gespawnte powershell ein sichtbares Fenster (beim 10-s-Polling + # der Lucy-Annahme blitzte das im Sekundentakt auf dem Desktop, 12.07.). + creationflags=subprocess.CREATE_NO_WINDOW, ) return { "stdout": result.stdout.strip(), diff --git a/deploy/lucy-annahme.sh b/deploy/lucy-annahme.sh index 90b1e21..2757450 100644 --- a/deploy/lucy-annahme.sh +++ b/deploy/lucy-annahme.sh @@ -155,7 +155,10 @@ pc_shell "git -C '$PC_REPO' fetch origin main 2>&1; if (\$LASTEXITCODE -ne 0) { pc_shell "if (Test-Path '$PC_RUNNER') { exit 0 } else { exit 1 }" >>"$LOG" 2>&1 \ || revert_main "PC-Runner-Skript fehlt im Lucy-Repo (deploy/lucy-annahme.ps1)" -pc_shell "Remove-Item -Force '$PC_STATUSFILE' -ErrorAction SilentlyContinue; Start-Process powershell -WindowStyle Hidden -ArgumentList '-NoProfile','-ExecutionPolicy','Bypass','-File','$PC_RUNNER','-WasRunning','$WAS_RUNNING'" >>"$LOG" 2>&1 \ +# WICHTIG: -File-Pfad MUSS eingebettete Anführungszeichen tragen — Start-Process fügt +# die ArgumentList-Elemente OHNE Quoting zusammen; 'F:\Coding Stuff\…' zerbricht sonst am +# Leerzeichen und die gespawnte powershell stirbt still (erster Live-Lauf, 12.07.). +pc_shell "Remove-Item -Force '$PC_STATUSFILE' -ErrorAction SilentlyContinue; Start-Process powershell -WindowStyle Hidden -ArgumentList '-NoProfile','-ExecutionPolicy','Bypass','-File','\"$PC_RUNNER\"','-WasRunning','$WAS_RUNNING'" >>"$LOG" 2>&1 \ || revert_main "PC-Build ließ sich nicht starten" # ── Status-Datei pollen, Fortschritt in die UI spiegeln ───────────────────── @@ -167,6 +170,8 @@ while [ "$(date +%s)" -lt "$DEADLINE" ]; do sleep 10 RAW="$(pc_shell "if (Test-Path '$PC_STATUSFILE') { Get-Content -Raw '$PC_STATUSFILE' }" 2>>"$LOG")" || continue [ -n "$RAW" ] || continue + # Parse OHNE f-String-Escapes: \" in f-String-Ausdruecken ist seit Python 3.12/3.14 + # ein SyntaxError (alter Pre-3.12-Stil) — genau das legte den ersten Live-Lauf lahm. PARSED="$(printf '%s' "$RAW" | python3 -c ' import json, sys try: @@ -174,7 +179,9 @@ try: except Exception: sys.exit(0) detail = str(d.get("detail", "")).replace("|", "/").replace("\n", " ") -print(f"{1 if d.get(\"done\") else 0}|{1 if d.get(\"ok\") else 0}|{detail}") +done = "1" if d.get("done") else "0" +ok = "1" if d.get("ok") else "0" +print(done + "|" + ok + "|" + detail) ')" [ -n "$PARSED" ] || continue DONE="${PARSED%%|*}"; REST="${PARSED#*|}"; OK="${REST%%|*}"; DETAIL="${REST#*|}" diff --git a/docs/wissen/FALLEN.md b/docs/wissen/FALLEN.md index 4f07e26..418dae6 100644 --- a/docs/wissen/FALLEN.md +++ b/docs/wissen/FALLEN.md @@ -102,6 +102,16 @@ Neue Fallen: hier eintragen, mit Datum und Symptom._ blind per Produkt-Gefühl. - **Executor-Task** `HermesPCExecutor` läuft aus dem Repo mit pythonw → nach executor.py-Änderung Task neu starten; Logs in `%LOCALAPPDATA%\HermesPCExecutor\`. +- **`Start-Process -ArgumentList` quotet NICHT** (PS 5.1): Elemente werden mit Leerzeichen + zusammengefügt — ein Pfad wie `F:\Coding Stuff\…` zerbricht, die gespawnte powershell + stirbt STILL (kein Fenster, kein Log). → Anführungszeichen ins Element einbetten: + `'-File','"F:\Coding Stuff\…\skript.ps1"'`. Kostete den ersten Lucy-Annahme-Lauf (12.07.). +- **`\"` in f-String-AUSDRÜCKEN ist seit Python 3.12 ein SyntaxError** (Alt-Stil + `f"{d.get(\"x\")}"` lief nur pre-3.12; Box hat 3.14). In bash-eingebetteten + `python3 -c '…'`-Snippets braucht es die Escapes eh nicht (single-quoted) — Werte vorab + in Variablen ziehen statt Quote-Akrobatik. Kostete denselben Lauf (Poll parste nie). +- **pythonw + subprocess ohne `CREATE_NO_WINDOW`** = jedes gespawnte Konsolenprogramm + bekommt ein SICHTBARES Fenster (Executor-Polling blitzte im 10-s-Takt auf dem Desktop). - **MSIX-Sandbox-Falle (Claude-Desktop-Tools):** Tools der Claude-App laufen im MSIX-Container — Writes nach `AppData\Local\` landen in `AppData\Local\Packages\Claude_*\LocalCache\` (Merge-Read täuscht!). Windows-Apps NIE über diff --git a/docs/wissen/OFFENE-FAEDEN.md b/docs/wissen/OFFENE-FAEDEN.md index a566746..462a393 100644 --- a/docs/wissen/OFFENE-FAEDEN.md +++ b/docs/wissen/OFFENE-FAEDEN.md @@ -20,12 +20,15 @@ keine zweite Liste anlegen. Verdikte werden NICHT als „offen" geführt → [VE (Zentrale/Telegram/Lucy), Bagatell-Pfad enabled; voller Kreislauf einmal komplett durchlaufen (`wartung/fix-double-zero-self-repair`). Rest: Live-Telegram-Test beim nächsten echten Zuruf beobachten; Specifier schreibt Titel englisch (ggf. tunen). -- **S3 „leg los lucy-pipeline" (12.07., diese Karte):** PC-Annahme-Weg gebaut — - Auftragsbuch liest jetzt ZWEI Repos (mc2 + lucy), Lucy-Annahme = Merge auf der Box + +- **S3 „leg los lucy-pipeline" ✅ (12.07., beide Karten angenommen):** PC-Annahme-Weg live — + Auftragsbuch liest ZWEI Repos (mc2 + lucy), Lucy-Annahme = Merge auf der Box + dist-Build/Neustart am PC via PC-Executor (`deploy/lucy-annahme.sh` + - `deploy/lucy-annahme.ps1` im Lucy-Repo), Auto-Revert bei Rot. Erster echter Auftrag: - A4-Turncheck-Auswertung (Verdikt aus 680 echten Entscheidungen: Default AUS, opt-in) — - liegt als Lucy-Karte bereit. **E2E-Beweis = Annahme-Klick der beiden Karten.** + `deploy/lucy-annahme.ps1` im Lucy-Repo), Auto-Revert bei Rot. Erster echter Auftrag + durch: A4-Turncheck Default AUS (680 Entscheidungen, 79 % der Halte umsonst), dist am PC + gebaut. **Erster Live-Lauf fand 2 Runner-Bugs** (Start-Process-Quoting bei Leerzeichen-Pfad, + f-String-`\"` auf Python 3.14 → Poll blind; Abschluss manuell nachgezogen, Build war grün) — + Fixes + Executor-Fensterblitz-Fix in Karte `wartung/lucy-annahme-fixes`. Details FALLEN.md. + **Der nächste Lucy-Auftrag ist der ehrliche Voll-Automatik-Test.** - **S4 „leg los zuendung":** Idle-Radar / Fehler→Auftrag (Traum-Funde + Journal-Muster → Queue-Kandidaten) · Großbau-Etappen-Regeln in Skills · Generalprobe ohne Claude.