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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user