Faden 5: Box-Selbstwissen mechanisch in jeden Kanban-Worker (pre_llm_call-Hook)
Fallstrick #1 behoben: Ops-/Mess-/Verify-Aufgaben landen oft auf `default` (= Lucys Persona, "nicht technisch, keine Pfade/Versionen") und flailen, weil sie llama-swap :8080 & Co. nicht kennen. Nur `werkstatt` hatte Box-Wissen. deploy/agent-hooks/box-steckbrief-inject.sh (neu): pre_llm_call-Hook, haengt eine kompakte Box-Orientierung ephemer an die User-Message JEDES Kanban-Workers (egal welches Profil) — aber NUR wenn eine task_id gesetzt ist. Lucys interaktiver/Voice-Chat hat keine task_id -> sofortiger No-op (7 ms gemessen), kein Persona- oder Latenz-Eingriff. Inhalt: Identitaet + Modell-Endpunkte (llama-swap :8080, MC2 :9001/v1, gateway :8642, mem0 :8765) + Tabu-Live-Checkout + Zeiger auf den vollen Selbst-Steckbrief und docs/wissen. = der "via Hook/ Wrapper/Guard"-Weg aus der Fallstrick-Karte (Dispatcher-Spawn ist Hermes-intern). deploy/agent-hooks/pre-verify-gates.sh: der bestehende py_compile/dist-Gate-Hook, bisher nur manuell auf der Box -> jetzt verbatim im Repo getrackt (ueberlebt Box-Neuaufbau, schliesst eine Autonomie-Luecke). deploy.sh synct beide nach ~/.hermes/agent-hooks/ (+chmod). Die Registrierung in ~/.hermes/config.yaml (hooks: pre_llm_call) bleibt einmalig von Hand (config.yaml ist Zwei-Schreiber-sensibel). Verifiziert: Hook-Logik auf der Box gegen synthetische Payloads (Worker -> 987-Zeichen-Kontext injiziert, Lucy/leer -> {}, JSON valide), bash -n + LF sauber. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# pre_llm_call-Hook (Faden 5, 13.07.2026): verdrahtet Box-Selbstwissen MECHANISCH in
|
||||||
|
# JEDEN Kanban-Worker — egal welches Profil (werkstatt, default=Lucys Persona als Worker,
|
||||||
|
# kuenftige betrieb-/Ops-Profile). Der Kontext wird ephemer pro Turn an die User-Message
|
||||||
|
# angehaengt (agent/turn_context.py), NUR wenn eine Kanban-task_id gesetzt ist. Lucys
|
||||||
|
# interaktiver/Voice-Chat hat KEINE task_id → sofortiger No-op, kein Persona- oder
|
||||||
|
# Latenz-Eingriff. Loest Fallstrick #1 (Ops/Mess/Verify-Worker landen auf der am
|
||||||
|
# schlechtesten geruesteten Persona und flailen, weil sie llama-swap :8080 nicht kennen).
|
||||||
|
# Ausgabe {"context":"..."} = anhaengen; {} = durchlassen (No-op).
|
||||||
|
set -u
|
||||||
|
payload="$(cat -)"
|
||||||
|
|
||||||
|
# Scope-Gate: nur echte Kanban-Worker (task_id gesetzt). Alles andere (Lucy-Chat, Voice,
|
||||||
|
# CLI, Telegram) faellt hier sofort raus — der Hook feuert zwar pro Turn, kostet aber nur
|
||||||
|
# ein jq und ist damit fuer den Voice-Pfad vernachlaessigbar.
|
||||||
|
task_id=$(printf %s "$payload" | jq -r '.extra.task_id // .task_id // ""' 2>/dev/null || echo "")
|
||||||
|
case "$task_id" in ""|null) printf '{}'; exit 0 ;; esac
|
||||||
|
|
||||||
|
# Zeiger auf den vollen, naechtlich generierten Selbst-Steckbrief (nur wenn er existiert).
|
||||||
|
STECKBRIEF="$HOME/.hermes/state/selbst-steckbrief.md"
|
||||||
|
hint=""
|
||||||
|
[ -f "$STECKBRIEF" ] && hint=" Dein vollstaendiger Selbst-Steckbrief (aktuelle Versionen/Dienste/Modelle/Crons/offene Karten) liegt in $STECKBRIEF — dort nachlesen statt raten."
|
||||||
|
|
||||||
|
# Stabile Anti-Flail-Orientierung: WER bin ich, WO laufen die Modelle, WAS ist tabu.
|
||||||
|
ctx="$(cat <<EOF
|
||||||
|
[BOX-ORIENTIERUNG — du bist ein Hintergrund-Worker auf der lokalen AI-Box (Linux, Zeit UTC / lokal Europe/Berlin, locale de_DE), NICHT Lucy und kein Dev-Laptop. Du arbeitest EINE Kanban-Aufgabe ab.]
|
||||||
|
Die Modelle / das "Hirn" laufen ausschliesslich ueber den Router llama-swap auf 127.0.0.1:8080 (startet je Modell einen llama-server) bzw. das OpenAI-kompatible Gateway von MC2 auf 127.0.0.1:9001/v1 — es gibt KEINEN anderen Modell-Server, also nicht danach suchen. Weitere Dienste: hermes-gateway :8642, mem0-Gedaechtnis :8765. Der MC2-Live-Checkout ~/mission-control-v2 ist nur zum LESEN da (Schreiben/committen TABU — Code-Arbeit immer im frischen Klon deines Task-Workspaces). Feste Entscheide/Verbote: ~/mission-control-v2/docs/wissen/ (VERDIKTE/FALLEN/STACK) + ~/wissens-vault/eigenbau-landkarte.md.${hint}
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
|
||||||
|
jq --null-input --arg c "$ctx" '{context:$c}'
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# pre_verify-Gate (P1-5, 09.07.2026): erinnert den Agenten VOR dem Fertigmelden an
|
||||||
|
# die zwei MC2-Pflichten aus AGENTS.md — py_compile-Gate und die dist-Falle.
|
||||||
|
# Antwort {"action":"continue","message":...} = Agent arbeitet weiter; {} = durchlassen.
|
||||||
|
set -u
|
||||||
|
payload="$(cat -)"
|
||||||
|
attempt=$(printf %s "$payload" | jq -r '.extra.attempt // 0' 2>/dev/null || echo 0)
|
||||||
|
# Ein-Schuss: nach dem ersten Nudge nicht erneut nerven (Docs-Empfehlung).
|
||||||
|
if [ "$attempt" != "0" ]; then printf '{}'; exit 0; fi
|
||||||
|
mapfile -t paths < <(printf %s "$payload" | jq -r '.extra.changed_paths[]? // empty' 2>/dev/null)
|
||||||
|
[ ${#paths[@]} -eq 0 ] && { printf '{}'; exit 0; }
|
||||||
|
msgs=()
|
||||||
|
|
||||||
|
# Gate 1: py_compile fuer alle geaenderten .py, die existieren
|
||||||
|
pyfail=""
|
||||||
|
for p in "${paths[@]}"; do
|
||||||
|
case "$p" in
|
||||||
|
*.py)
|
||||||
|
if [ -f "$p" ] && ! err=$(python3 -m py_compile "$p" 2>&1); then
|
||||||
|
pyfail="${pyfail}${p}: ${err}"$'\n'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if [ -n "$pyfail" ]; then
|
||||||
|
msgs+=("py_compile-Gate ROT:"$'\n'"${pyfail}Erst fixen, dann fertigmelden.")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Gate 2: dist-Falle — frontend/src geaendert, aber kein frontend/dist angefasst.
|
||||||
|
# Feuert NUR in Repos mit der MC2-Konvention (frontend/dist ist git-getrackt) —
|
||||||
|
# sonst nudgt es in beliebigen Spielordnern ohne Build (False-Positive, 09.07. beobachtet).
|
||||||
|
srcfile=""; dist=0
|
||||||
|
for p in "${paths[@]}"; do
|
||||||
|
case "$p" in
|
||||||
|
*/frontend/src/*|frontend/src/*) srcfile="$p" ;;
|
||||||
|
*/frontend/dist/*|frontend/dist/*) dist=1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if [ -n "$srcfile" ] && [ $dist -eq 0 ]; then
|
||||||
|
# Repo-Wurzel vom geaenderten File aus hochlaufen (max 8 Ebenen).
|
||||||
|
root=$(dirname "$srcfile"); n=0
|
||||||
|
while [ $n -lt 8 ] && [ -n "$root" ] && [ "$root" != "/" ] && [ ! -e "$root/.git" ]; do
|
||||||
|
root=$(dirname "$root"); n=$((n+1))
|
||||||
|
done
|
||||||
|
if [ -e "$root/.git" ] && git -C "$root" ls-files frontend/dist 2>/dev/null | head -1 | grep -q .; then
|
||||||
|
msgs+=("AGENTS.md-Gate: Du hast frontend/src geaendert, aber frontend/dist nicht. Die Box baut NICHT selbst: cd frontend && npm run build, dann das neue dist im selben Branch mit-committen — sonst zeigt die Box nach Merge+Deploy den alten Stand.")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#msgs[@]} -eq 0 ]; then printf '{}'; exit 0; fi
|
||||||
|
joined=$(printf '%s\n\n' "${msgs[@]}")
|
||||||
|
jq --null-input --arg m "$joined" '{action:"continue", message:$m}'
|
||||||
@@ -119,6 +119,14 @@ chmod +x "$HOME/.hermes/scripts/pc_path_lookup.sh"
|
|||||||
# Portiert vom PC-Skill (F:\Coding Stuff\projekt-start), Zed-Verweise durch Hermes Desktop ersetzt.
|
# Portiert vom PC-Skill (F:\Coding Stuff\projekt-start), Zed-Verweise durch Hermes Desktop ersetzt.
|
||||||
mkdir -p "$HOME/.hermes/skills/projekt-start"
|
mkdir -p "$HOME/.hermes/skills/projekt-start"
|
||||||
cp "$SRC/deploy/skills/projekt-start/SKILL.md" "$HOME/.hermes/skills/projekt-start/SKILL.md"
|
cp "$SRC/deploy/skills/projekt-start/SKILL.md" "$HOME/.hermes/skills/projekt-start/SKILL.md"
|
||||||
|
# Agent-Hooks (Faden 5, 13.07.2026): Skripte frisch halten (reproduzierbar, ueberlebt
|
||||||
|
# Box-Neuaufbau). box-steckbrief-inject.sh = Box-Selbstwissen in JEDEN Kanban-Worker
|
||||||
|
# (pre_llm_call, scoped auf task_id → Lucy-Chat unberuehrt); pre-verify-gates.sh = das
|
||||||
|
# bestehende py_compile/dist-Gate. Die REGISTRIERUNG in ~/.hermes/config.yaml (hooks:)
|
||||||
|
# ist EINMALIG von Hand (config.yaml ist Zwei-Schreiber-sensibel, kein Deploy-Schreiber).
|
||||||
|
mkdir -p "$HOME/.hermes/agent-hooks"
|
||||||
|
cp "$SRC/deploy/agent-hooks/box-steckbrief-inject.sh" "$SRC/deploy/agent-hooks/pre-verify-gates.sh" "$HOME/.hermes/agent-hooks/"
|
||||||
|
chmod +x "$HOME/.hermes/agent-hooks/box-steckbrief-inject.sh" "$HOME/.hermes/agent-hooks/pre-verify-gates.sh"
|
||||||
# Eingebaute Hermes-Web-GUI (`hermes serve`) für die Einbettung in MC2 (routers/hermes_ui.py →
|
# Eingebaute Hermes-Web-GUI (`hermes serve`) für die Einbettung in MC2 (routers/hermes_ui.py →
|
||||||
# same-origin /hermes-ui/) vorbereiten: das SPA-Bundle mit Vite-base=/hermes-ui/ (neu) bauen, sonst
|
# same-origin /hermes-ui/) vorbereiten: das SPA-Bundle mit Vite-base=/hermes-ui/ (neu) bauen, sonst
|
||||||
# kollidieren seine absoluten Pfade (/assets, /api) mit MC2s eigenen. Läuft auch nach jedem
|
# kollidieren seine absoluten Pfade (/assets, /api) mit MC2s eigenen. Läuft auch nach jedem
|
||||||
|
|||||||
Reference in New Issue
Block a user