Pruefstand+Radar: MTP-Fairness, Tempo-Baseline-Refresh, Puls-Langzeit-Historie

Drei Luecken aus der Selbst-Review 17.07.:
1. MTP-Fairness: Kandidaten mit MTP-Kopf (Dateiname oder nextn-Tensoren im
   GGUF-Kopf) bekommen eine Zusatz-Tempomessung mit draft-mtp; Steckbrief
   rechnet best-of speed/speed_mtp - das Live-Hirn laeuft schliesslich MIT MTP.
2. Baseline-Refresh: baseline.json traegt jetzt den Engine-Build; weicht die
   installierte Engine ab (So-Auto-Update), misst der Pruefstand-Cron nur den
   Tempo-Teil aller Rollen neu (Geister-Zahlen-Schutz, Qualitaet bleibt gueltig).
3. Langzeit-Historie: Puls wird als JSONL angehaengt statt ueberschrieben;
   Radar vergleicht zusaetzlich gegen ~8 Wochen zurueck und meldet
   SCHLEICHENDE REGRESSION, die woechentlich unter der 10-%-Schwelle bleibt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-17 16:28:27 +02:00
parent 9c03316755
commit de21e1ac68
2 changed files with 155 additions and 24 deletions
+50 -7
View File
@@ -21,6 +21,7 @@ set -uo pipefail
MC="$HOME/mission-control-v2"
STATE_DIR="$HOME/.hermes/state"
STATE="$STATE_DIR/trend-radar-state.json"
HIST="$STATE_DIR/trend-radar-puls-history.jsonl" # Langzeit-Verlauf (Lücke 3, 17.07.)
PS_QUEUE="$STATE_DIR/pruefstand/queue"
PS_DONE="$STATE_DIR/pruefstand/done"
WATCHLIST="$MC/deploy/trend-radar-watchlist.json"
@@ -61,11 +62,12 @@ echo
# =====================================================================
# 1. LIVE-PULS aller Rollen (heavy zuletzt → Analyst findet es noch warm)
# =====================================================================
echo "### 1. LIVE-PULS (echte Messung über llama-swap, Vergleich zur Vorwoche)"
python3 - "$ENDPOINT" "$STATE" "$TMPD/puls.json" <<'PY'
echo "### 1. LIVE-PULS (echte Messung über llama-swap, Vergleich zur Vorwoche + Langzeit)"
python3 - "$ENDPOINT" "$STATE" "$TMPD/puls.json" "$HIST" <<'PY'
import json, sys, time, urllib.request
endpoint, state_pfad, out_pfad = sys.argv[1], sys.argv[2], sys.argv[3]
hist_pfad = sys.argv[4]
ROLLEN = ["hermes", "coder", "vision", "scout", "heavy"] # heavy zuletzt (Analyst-Wärme)
def chat(model, timeout=420):
@@ -117,6 +119,40 @@ for rolle, w in puls.items():
if d <= -10:
zeile += " ⚠️ REGRESSION"
print(zeile)
# Langzeit-Vergleich (~8 Wochen): fängt SCHLEICHENDE Regression, die jede Woche
# einzeln unter der 10-%-Schwelle bleibt (Lücke 3, 17.07.).
eintraege = []
try:
with open(hist_pfad, encoding="utf-8") as f:
for l in f:
l = l.strip()
if l:
try:
eintraege.append(json.loads(l))
except Exception:
pass
except FileNotFoundError:
pass
grenze = time.time() - 49 * 86400
alte = [z for z in eintraege if (z.get("ts") or 0) <= grenze]
ref = alte[-1] if alte else None
if ref:
treffer = []
for rolle, w in puls.items():
a = (ref.get("puls") or {}).get(rolle) or {}
if a.get("tg") and w.get("tg"):
d = 100 * w["tg"] / a["tg"] - 100
if d <= -10:
treffer.append(f"- LANGZEIT {rolle}: tg {w['tg']} vs. {a['tg']} "
f"({ref.get('datum','?')}, Engine b{ref.get('engine','?')}) "
f"= {d:+.0f} % ⚠️ SCHLEICHENDE REGRESSION")
if treffer:
print(f"Langzeit-Vergleich (vs. {ref.get('datum','?')}):")
for t in treffer:
print(t)
else:
print(f"Langzeit-Vergleich vs. {ref.get('datum','?')}: unauffällig.")
json.dump(puls, open(out_pfad, "w"))
PY
PULS_BLOCK="$(cat "$TMPD/puls.json" 2>/dev/null || echo '{}')"
@@ -408,17 +444,24 @@ PY
echo "### 6. PRÜFSTAND-QUEUE"
echo "$ERGEBNIS"
# ---------- Puls in den State (für den Vorwochen-Vergleich) ----------
python3 - "$STATE" "$TMPD/puls.json" <<'PY'
import json, sys
# ---------- Puls in den State (Vorwoche) + an die Langzeit-Historie anhängen ----------
python3 - "$STATE" "$TMPD/puls.json" "$HIST" "${INST_NUM:-}" <<'PY'
import json, sys, time
try:
state = json.load(open(sys.argv[1]))
except Exception:
state = {}
try:
state["puls"] = json.load(open(sys.argv[2]))
puls = json.load(open(sys.argv[2]))
except Exception:
pass
puls = None
if puls:
state["puls"] = puls
with open(sys.argv[3], "a", encoding="utf-8") as f:
f.write(json.dumps({"ts": int(time.time()),
"datum": time.strftime("%Y-%m-%d"),
"engine": sys.argv[4], "puls": puls},
ensure_ascii=False) + "\n")
json.dump(state, open(sys.argv[1], "w"))
PY