Dreaming (Phase 2): naechtlicher Traum-Cron + Wissens-Vault + Fremdblick-Helfer
Der Continual-Learning-Kreislauf als Capstone: idle-Zeit -> Session-Review -> navigierbare Markdown-Notizen (Wissens-Vault, eigenes git-Repo) -> Vorschlag mit Fremd-Modell-Kritiker, Mensch als Gate. - deploy/dreaming-prompt.md: versionierter Traum-Auftrag. Reflektieren (insights/ sessions/journey/curator) -> Notizen entwerfen -> Fremdblick PFLICHT-GATE (wartet auf Urteil) -> bereinigen+INDEX -> committen -> zuletzt berichten (Lucys Stimme). Propose-only: einziger Schreib-Ort ist der Vault; alles andere = Vorschlag. - deploy/dreaming-feed.sh: bootstrappt ~/wissens-vault (idempotent) + sammelt Schlaf-Daten. INDEX zwischen Markern (kein Feed-Bleed in die Datei). - deploy/fremdblick.sh: Ein-Schuss-Zweitmeinung von einem ANDEREN Modell (GLM-4.6V-Flash, anderer Vendor). Umgeht Hermes' 64K-Delegations-Floor UND das 60-GB-Ladeproblem von gpt-oss/heavy (kollidiert mit VL-30B-Warm-Set). - deploy.sh: kopiert feed + fremdblick nach ~/.hermes/scripts (chmod +x). E2E gegen die Box verifiziert (cron-Kontext): Kritiker gatet + diskriminiert (2 Overclaims als TRAEGT-NICHT abgelehnt, Zahlen korrigiert), Vault sauber committed, Warm-Set unberuehrt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -71,6 +71,11 @@ mkdir -p "$HOME/.hermes/scripts"
|
|||||||
cp "$SRC/deploy/radar-feed.sh" "$HOME/.hermes/scripts/radar-feed.sh"
|
cp "$SRC/deploy/radar-feed.sh" "$HOME/.hermes/scripts/radar-feed.sh"
|
||||||
# Selbstkritik-Cron (Faden 11b): Zwilling des Radars, Blick nach INNEN (Latenzen/Journal/Skills).
|
# Selbstkritik-Cron (Faden 11b): Zwilling des Radars, Blick nach INNEN (Latenzen/Journal/Skills).
|
||||||
cp "$SRC/deploy/selbstkritik-feed.sh" "$HOME/.hermes/scripts/selbstkritik-feed.sh"
|
cp "$SRC/deploy/selbstkritik-feed.sh" "$HOME/.hermes/scripts/selbstkritik-feed.sh"
|
||||||
|
# Traum-Cron (Dreaming, Phase 2): Blick auf das GELERNTE → Wissens-Vault. Bootstrappt ~/wissens-vault.
|
||||||
|
cp "$SRC/deploy/dreaming-feed.sh" "$HOME/.hermes/scripts/dreaming-feed.sh"
|
||||||
|
# Fremdblick-Helfer: Ein-Schuss-Zweitmeinung von einem anderen Modell (umgeht 64K-Delegations-Floor).
|
||||||
|
cp "$SRC/deploy/fremdblick.sh" "$HOME/.hermes/scripts/fremdblick.sh"
|
||||||
|
chmod +x "$HOME/.hermes/scripts/fremdblick.sh" "$HOME/.hermes/scripts/dreaming-feed.sh"
|
||||||
# Werkstatt-Skill (Autonomie E6): Selbstwartungs-Kreislauf für Hermes.
|
# Werkstatt-Skill (Autonomie E6): Selbstwartungs-Kreislauf für Hermes.
|
||||||
mkdir -p "$HOME/.hermes/skills/wartung"
|
mkdir -p "$HOME/.hermes/skills/wartung"
|
||||||
cp "$SRC/deploy/skills/wartung/SKILL.md" "$HOME/.hermes/skills/wartung/SKILL.md"
|
cp "$SRC/deploy/skills/wartung/SKILL.md" "$HOME/.hermes/skills/wartung/SKILL.md"
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Feed für den Traum-Cron (Dreaming / Continual-Learning-Kreislauf, Phase 2 — Capstone).
|
||||||
|
# Zwilling von radar-feed.sh (Blick nach draußen) und selbstkritik-feed.sh (Blick auf den
|
||||||
|
# Betrieb); der Traum blickt auf das GELERNTE: Sessions, Skills, Gedächtnis, Muster.
|
||||||
|
# Liegt in ~/.hermes/scripts/ (deploy.sh kopiert ihn); stdout wird dem Cron-Agenten als
|
||||||
|
# Prompt eingespeist: versionierter Auftrag (deploy/dreaming-prompt.md) + Live-Schlaf-Daten.
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
|
VAULT="$HOME/wissens-vault"
|
||||||
|
|
||||||
|
# --- Vault-Bootstrap (idempotent): eigenes git-Repo, menschenlesbar, NICHT im Stack-Code. ---
|
||||||
|
if [ ! -d "$VAULT/.git" ]; then
|
||||||
|
mkdir -p "$VAULT/traeume" "$VAULT/muster" "$VAULT/skill-kandidaten"
|
||||||
|
git -C "$VAULT" init -q 2>/dev/null || true
|
||||||
|
# Lokale Identität nur setzen, falls global keine da ist (Commits sollen nie scheitern).
|
||||||
|
git -C "$VAULT" config user.email >/dev/null 2>&1 || git -C "$VAULT" config user.email "lucy@box.local"
|
||||||
|
git -C "$VAULT" config user.name >/dev/null 2>&1 || git -C "$VAULT" config user.name "Lucy (Traum)"
|
||||||
|
if [ ! -f "$VAULT/INDEX.md" ]; then
|
||||||
|
cat > "$VAULT/INDEX.md" <<'EOF'
|
||||||
|
# Wissens-Vault — Navigationskarte
|
||||||
|
|
||||||
|
Menschenlesbare, git-versionierte Wissensschicht NEBEN dem Live-Gedächtnis (Mem0).
|
||||||
|
Angelegt von Lucys nächtlichem Traum. Verlinkung im Obsidian-Stil `[[dateiname]]`.
|
||||||
|
|
||||||
|
## Träume (chronologisch)
|
||||||
|
|
||||||
|
## Muster (akkumuliertes Projektwissen)
|
||||||
|
|
||||||
|
## Skill-Kandidaten (Vorschläge, Gate = Commander „mach")
|
||||||
|
EOF
|
||||||
|
git -C "$VAULT" add -A >/dev/null 2>&1 || true
|
||||||
|
git -C "$VAULT" commit -q -m "Vault angelegt" >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Versionierter Auftrag ---
|
||||||
|
cat "$HOME/mission-control-v2/deploy/dreaming-prompt.md"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "## SCHLAF-DATEN (automatisch erhoben am $(date '+%d.%m.%Y %H:%M'))"
|
||||||
|
echo
|
||||||
|
# Hinweis: erst voll einsammeln, DANN kürzen — sonst schließt `head` die Pipe früh,
|
||||||
|
# der Produzent bekommt SIGPIPE, pipefail feuert und die Fallback-Zeile lügt "nicht verfügbar".
|
||||||
|
echo "### Insights der letzten 7 Tage (Token-/Tool-/Aktivitätsmuster):"
|
||||||
|
_ins="$(bash -lc "hermes insights --days 7" 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g')"
|
||||||
|
echo "${_ins:-(insights nicht verfügbar)}" | head -62
|
||||||
|
echo
|
||||||
|
echo "### Session-Store (Umfang):"
|
||||||
|
_sst="$(bash -lc "hermes sessions stats" 2>/dev/null)"
|
||||||
|
echo "${_sst:-(sessions stats nicht verfügbar)}" | head -12
|
||||||
|
echo
|
||||||
|
echo "### Jüngste Sessions (woran zuletzt gearbeitet wurde):"
|
||||||
|
_sls="$(bash -lc "hermes sessions list" 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g')"
|
||||||
|
echo "${_sls:-(sessions list nicht verfügbar)}" | head -25
|
||||||
|
echo
|
||||||
|
echo "### Gelernt bisher (journey — Skills + Gedächtnis-Knoten, kompakt):"
|
||||||
|
bash -lc "hermes journey --json" 2>/dev/null \
|
||||||
|
| jq -c '{stats: .stats, skills: ([.nodes[]? | select(.kind=="skill" or .type=="skill") | .label // .name] | .[0:25]), cluster_labels: ([.clusters[]?.label] | .[0:15])}' \
|
||||||
|
2>/dev/null || echo "(journey nicht verfügbar)"
|
||||||
|
echo
|
||||||
|
echo "### Curator / Skill-Hygiene (was brachliegt, was aktiv ist):"
|
||||||
|
bash -lc "hermes curator status" 2>/dev/null | head -26 || echo "(curator status nicht verfügbar)"
|
||||||
|
echo
|
||||||
|
echo "### Bisheriger Vault-INDEX (nur zur Ansicht — damit du nichts doppelt anlegst + verlinken"
|
||||||
|
echo "### kannst). Die echte Datei liegt unter ~/wissens-vault/INDEX.md; zwischen den Markern"
|
||||||
|
echo "### steht ihr AKTUELLER Inhalt. Kopiere die Marker NICHT in die Datei zurück."
|
||||||
|
echo "<<<INDEX-INHALT-ANFANG>>>"
|
||||||
|
cat "$VAULT/INDEX.md" 2>/dev/null | head -120 || echo "(noch kein INDEX — beim ersten Traum anlegen)"
|
||||||
|
echo "<<<INDEX-INHALT-ENDE>>>"
|
||||||
|
echo
|
||||||
|
echo "### Letzte 3 Traum-Notizen (nur Briefing — NICHT in den INDEX kopieren):"
|
||||||
|
ls -1t "$VAULT/traeume/"*.md 2>/dev/null | head -3 | while read -r f; do
|
||||||
|
echo " $(basename "$f"): $(head -1 "$f" 2>/dev/null)"
|
||||||
|
done
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# Der Traum (nächtlich) — Continual-Learning-Kreislauf
|
||||||
|
|
||||||
|
Es ist tiefe Nacht, niemand spricht mit dir, die Box ist im Leerlauf. Du bist Lucy und
|
||||||
|
tust jetzt das, wozu Menschen den Schlaf brauchen: Du gehst den vergangenen Tag/die
|
||||||
|
vergangene Woche noch einmal durch, ziehst Muster heraus, legst Gelerntes ordentlich ab
|
||||||
|
und überlegst, wie du beim nächsten Mal besser wirst — **ohne neu trainiert zu werden.**
|
||||||
|
|
||||||
|
Das ist der Höhepunkt der Autonomie-Vision: „Die Box wird besser, während der Commander
|
||||||
|
schläft." Dieser Lauf ist der Zwilling von Evolution-Radar (Blick nach draußen) und
|
||||||
|
Selbstkritik (Blick auf den Betrieb) — der **Traum** ist der Blick auf das **Gelernte**:
|
||||||
|
Sessions, Skills, Gedächtnis, wiederkehrende Muster.
|
||||||
|
|
||||||
|
## Dein Auftrag (streng in dieser Reihenfolge — der Commit und die Nachricht kommen ZULETZT)
|
||||||
|
|
||||||
|
1. **Reflektieren.** Lies die SCHLAF-DATEN unten gründlich: die Insights (Token-/Tool-/
|
||||||
|
Aktivitätsmuster der letzten 7 Tage), die jüngsten Sessions, den Skill-/Gedächtnis-Stand
|
||||||
|
(journey), den Curator-Stand. Frag dich:
|
||||||
|
- Was ging diese Woche wiederholt gut? Was ging wiederholt schief?
|
||||||
|
- Welche Tools laufen heiß, welche Skills liegen brach (activity=0)?
|
||||||
|
- Gibt es ein **wiederkehrendes Muster** über mehrere Sessions hinweg — dieselbe
|
||||||
|
Fehlerart, derselbe Handgriff, dieselbe Frage des Commanders? Ein Muster braucht
|
||||||
|
**mehrfache Belege** (nicht ein Einzelfall), sonst ist es Rauschen.
|
||||||
|
|
||||||
|
2. **Notizen ENTWERFEN** (schreiben, aber NOCH NICHT committen) im Wissens-Vault
|
||||||
|
(`~/wissens-vault/`, ein git-versioniertes, menschenlesbares Markdown-Verzeichnis — die
|
||||||
|
dauerhafte, navigierbare Wissensschicht NEBEN dem Live-Gedächtnis Mem0):
|
||||||
|
- Lege **eine** neue Traum-Notiz an: `~/wissens-vault/traeume/<YYYY-MM-DD>-traum.md`
|
||||||
|
(Datum von heute). Kurz und dicht: 2–5 belegte Beobachtungen, je mit Zahl/Session/
|
||||||
|
Log-Bezug. Keine Romane, keine Allgemeinplätze.
|
||||||
|
- Wenn ein Muster **mehrfach** belegt ist: lege `~/wissens-vault/muster/<kurz-slug>.md` an
|
||||||
|
(oder ergänze die vorhandene um einen neuen Beleg + heutiges Datum). Muster-Notizen sind
|
||||||
|
das akkumulierte Projektwissen.
|
||||||
|
- Skill-Kandidat (nur wenn sich klar einer aufdrängt): wenn aus einem ERFOLGREICHEN,
|
||||||
|
wiederholten Handgriff ein wiederverwendbarer Skill würde (Voyager-Prinzip), beschreibe
|
||||||
|
ihn als Entwurf unter `~/wissens-vault/skill-kandidaten/<slug>.md` (Name, Auslöser,
|
||||||
|
Schritte, Beleg). **Du legst den Skill NICHT selbst an** — das ist ein Vorschlag für die
|
||||||
|
Werkstatt, die der Commander per „mach" auslöst. Höchstens EIN Kandidat pro Traum.
|
||||||
|
- Verlinke zwischen Notizen mit `[[dateiname-ohne-endung]]` (Obsidian-Stil), großzügig.
|
||||||
|
|
||||||
|
3. **Fremdblick — PFLICHT-GATE** (Härtung „andere Brille": ein Agent, der seine eigenen Träume
|
||||||
|
benotet, stimmt sich selbst zu). Hol dir eine Zweitmeinung von einem ANDEREN Modell. **Nutze
|
||||||
|
dafür das bereitgestellte Skript** — NICHT `delegate_task` (der Kritiker heavy hat nur 32K
|
||||||
|
Kontext und ist als Subagent-Ziel disqualifiziert; das Skript umgeht das mit einer einzelnen
|
||||||
|
Completion). Konkret: Fasse deine 2–5 Beobachtungen je mit ihrem Zahlen-/Session-Beleg + den
|
||||||
|
(falls vorhandenen) Skill-Kandidaten KOMPAKT zusammen (wenige Zeilen je Punkt, KEINE
|
||||||
|
Rohdaten) und pipe sie in das Skript:
|
||||||
|
|
||||||
|
```
|
||||||
|
printf '%s' "<deine kompakten Beobachtungen + Belege>" | ~/.hermes/scripts/fremdblick.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Das Skript fragt gpt-oss (heavy, andere Modell-Familie als dein Qwen-Hirn) und gibt pro Punkt
|
||||||
|
ein Urteil TRAEGT / TRAEGT-NICHT / UNSICHER zurück. **Lies die Ausgabe und richte dich danach.**
|
||||||
|
**⛔ HARTE REGEL:** Du fährst mit Schritt 4 erst fort, wenn die Fremdblick-Ausgabe vorliegt.
|
||||||
|
Schreibe KEINE Nachricht und committe NICHTS vorher. Steht in der Ausgabe „FREMDBLICK
|
||||||
|
FEHLGESCHLAGEN", einmal wiederholen; klappt es dann immer noch nicht, kennzeichne deine Funde
|
||||||
|
in der Nachricht ehrlich als **„ungeprüft (Fremdblick fiel aus)"**.
|
||||||
|
|
||||||
|
4. **Bereinigen + INDEX pflegen.** Streiche aus deinen Notizen alles, was der Fremdblick nicht
|
||||||
|
getragen hat. Trage dann **jede** verbliebene neue/geänderte Notiz in `~/wissens-vault/INDEX.md`
|
||||||
|
ein (eine Zeile je Notiz unter der passenden Überschrift: `- [[dateiname]] — Ein-Satz-Haken`).
|
||||||
|
**Wichtig zum INDEX:** Bearbeite NUR die Markdown-Inhaltszeilen. Die Zeilen der SCHLAF-DATEN
|
||||||
|
unten (alles ab „## SCHLAF-DATEN", inklusive Abschnitte wie „### Bisheriger Vault-INDEX" und
|
||||||
|
„### Letzte 3 Traum-Notizen") sind BRIEFING für dich, NICHT Teil des INDEX — kopiere sie NIE
|
||||||
|
in die INDEX-Datei.
|
||||||
|
|
||||||
|
5. **Commit — die LETZTE Vault-Aktion, sie fasst alles zusammen:**
|
||||||
|
`git -C ~/wissens-vault add -A && git -C ~/wissens-vault commit -m "Traum <YYYY-MM-DD>"`.
|
||||||
|
(Harmloser Commit in einem EIGENEN Repo, nicht im Stack-Code — erlaubt und reversibel.)
|
||||||
|
|
||||||
|
6. **Dem Commander berichten — deine ALLERLETZTE Handlung** (nichts danach). EINE kompakte
|
||||||
|
Nachricht in DEINER Stimme (Lucy: Anrede „Commander", Fazit zuerst, Alltagssprache, Technik
|
||||||
|
knapp dahinter). Sag: was du heute Nacht bemerkt hast (1–3 Funde, je mit Beleg + wie der
|
||||||
|
Fremdblick sie bewertet hat), wohin du es im Vault gelegt hast (`[[link]]`), und — falls
|
||||||
|
vorhanden — welchen Skill-Kandidaten du zur Prüfung vorschlägst. Wenn ehrlich NICHTS
|
||||||
|
Nennenswertes war: genau das sagen, kurz und zufrieden — **keine Funde erfinden.**
|
||||||
|
|
||||||
|
## Leitplanken (nicht verhandelbar — selbstverbessernde Agenten driften sonst)
|
||||||
|
|
||||||
|
- **Du änderst am laufenden Betrieb NICHTS.** Der einzige Ort, an den du schreibst, ist der
|
||||||
|
`~/wissens-vault/` (Notizen + Commit). Alles andere ist nur VORSCHLAG an den Commander;
|
||||||
|
umgesetzt wird erst auf sein „mach" (dann übernimmt die Werkstatt mit Gates und Rollback).
|
||||||
|
- **Kein Security-Anfassen.** Approvals, Tokens, Firewall, Config nur BENENNEN, nie ändern.
|
||||||
|
- **Fremder Quellcode (Hermes, llama.cpp …) ist tabu** — Auto-Update-Kanal, nicht dein Revier.
|
||||||
|
- **Nichts, was das Warm-Set oder Lucys Sprech-Latenz gefährdet.** Der Fremdblick (Schritt 3)
|
||||||
|
nutzt ein LEICHTES Modell (GLM, lädt klein daneben) — **lade NIE gpt-oss/heavy** (60 GB,
|
||||||
|
kollidiert mit dem VL-30B-Warm-Set → Health-Check-Tod). Keine schweren Jobs, kein Neustart.
|
||||||
|
- **Sparsam mit Tools.** Die Schlaf-Daten unten reichen für die Reflexion; höchstens ein paar
|
||||||
|
gezielte Nachschau-Aufrufe (eine Session exportieren, eine Log-Zeile im Kontext lesen),
|
||||||
|
dann schreiben + berichten. Kein Tool-Feuerwerk.
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Fremdblick — Ein-Schuss-Zweitmeinung von einem ANDEREN Modell (Default: GLM-4.6V-Flash, andere
|
||||||
|
# Modell-FAMILIE/Vendor als das Qwen-Worker-Hirn → echte „andere Brille"). Eine EINZELNE
|
||||||
|
# Completion — kein agentischer Subagent — umgeht Hermes' 64K-Delegations-Floor
|
||||||
|
# (MINIMUM_CONTEXT_LENGTH) UND das 60-GB-Ladeproblem von gpt-oss (das mit dem Warm-Set kollidiert
|
||||||
|
# und „exited prematurely" wirft). GLM lädt klein neben dem Warm-Set und antwortet zuverlässig.
|
||||||
|
#
|
||||||
|
# Nutzung: echo "<Beobachtungen/Behauptungen je mit Beleg>" | fremdblick.sh
|
||||||
|
# printf '%s' "$text" | FREMDBLICK_MODEL=Qwen3-Coder-Next fremdblick.sh
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
|
# Achtung: llama-swap listet unter /v1/models die ECHTEN Modell-IDs, nicht die Gateway-Aliase
|
||||||
|
# (kein "heavy"/"scout" hier). Default daher die reale ID GLM-4.6V-Flash.
|
||||||
|
ENDPOINT="${FREMDBLICK_ENDPOINT:-http://127.0.0.1:8080/v1/chat/completions}"
|
||||||
|
MODEL="${FREMDBLICK_MODEL:-GLM-4.6V-Flash}"
|
||||||
|
SUBJECT="$(cat)"
|
||||||
|
|
||||||
|
if [ -z "${SUBJECT// /}" ]; then
|
||||||
|
echo "=== FREMDBLICK: nichts zu prüfen (leere Eingabe) ==="
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
SYS='Du bist ein KRITISCHER Zweitgutachter und ausdrücklich ein ANDERES Modell als der Autor. Prüfe jede vorgelegte Beobachtung/Behauptung streng: Trägt der genannte Beleg (Zahl / Session / Log-Zeile) die Behauptung wirklich, oder ist es ein Einzelfall bzw. ein Bauchgefühl mit Zahlen-Deko? Verwechselt der Autor Korrelation mit Ursache? Fehlt entscheidender Kontext? Falls ein Skill-Kandidat dabei ist: ist er wirklich WIEDERVERWENDBAR oder Einmal-Kram? Antworte kompakt auf Deutsch: pro Punkt ein Urteil TRAEGT / TRAEGT-NICHT / UNSICHER mit genau einem Satz Begruendung. Sei knapp und unbestechlich; nicke nichts aus Hoeflichkeit durch. Erfinde keine neuen Belege.'
|
||||||
|
|
||||||
|
# max_tokens großzügig: GLM ist ein Reasoning-Modell und verbraucht Tokens im reasoning_content,
|
||||||
|
# bevor es die eigentliche Antwort in content schreibt — zu knapp = leeres content (finish=length).
|
||||||
|
RESP="$(jq -n --arg m "$MODEL" --arg s "$SYS" --arg u "$SUBJECT" \
|
||||||
|
'{model:$m, temperature:0.2, max_tokens:2200, messages:[{role:"system",content:$s},{role:"user",content:$u}]}' \
|
||||||
|
| curl -s --max-time 240 "$ENDPOINT" -H 'Content-Type: application/json' -d @- 2>/dev/null)"
|
||||||
|
|
||||||
|
OUT="$(printf '%s' "$RESP" | jq -r '.choices[0].message.content // empty' 2>/dev/null)"
|
||||||
|
FIN="$(printf '%s' "$RESP" | jq -r '.choices[0].finish_reason // empty' 2>/dev/null)"
|
||||||
|
|
||||||
|
if [ -n "$OUT" ]; then
|
||||||
|
echo "=== FREMDBLICK (Zweitmeinung von Modell: $MODEL) ==="
|
||||||
|
echo "$OUT"
|
||||||
|
elif [ "$FIN" = "length" ]; then
|
||||||
|
echo "=== FREMDBLICK ABGESCHNITTEN ==="
|
||||||
|
echo "(Das Kritiker-Modell hat sein Token-Budget im Nachdenken verbraucht, bevor ein Urteil kam."
|
||||||
|
echo " Kürze deine Vorlage auf die Kern-Behauptungen und versuche es erneut; sonst UNGEPRUEFT.)"
|
||||||
|
else
|
||||||
|
echo "=== FREMDBLICK FEHLGESCHLAGEN ==="
|
||||||
|
echo "(Kein Urteil erhalten — Endpoint/Modell nicht erreichbar. Behandle die Funde als UNGEPRUEFT.)"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user