Gesamtpruefung 2026-08-11: drei Defekte behoben
Zweiter vollstaendiger Durchlauf nach docs/review-prompt.md.
BEFUND 1: rec_outcomes war seit dem Einbau (06.08.) still tot - 0
Zeilen in 5 Tagen. _run_analysis las s.get("pb_feats"), aber s ist der
MT5Data-Snapshot; pb_feats lebt im Wave-Snapshot. _atr also immer 0,0
und die Schreibbedingung nie erfuellt. Kein NameError (ruff sieht
nichts), und das umgebende except loggt auf DEBUG. Aufgefallen nur,
weil die Tabelle mit 0 Zeilen neben ihren Schwestern stand.
Generalisiert als measurement_reminder.telemetrie_puls(): jede
Telemetrie-Tabelle muss einen Puls haben. Erster Lauf meldet genau
diesen Fund, alle uebrigen gruen.
BEFUND 2: der Divergenz-Waechter war selbst driftend. Abschnitt A
verglich gegen 43 % WARTEN - seit 05.08. ausdruecklich ungueltig (das
misst _build allein); richtig sind 80,5 %. Und entry_room galt als
"live-only", obwohl es seit 04./05.08. modelliert wird.
A: +50,8 Pp Warnung -> +13,3 Pp OK. B: 63,9 % -> 5,0 %.
BEFUND 3: P(break) ist wieder kalibriert (Delta -1,7 Pp nach +14,3 Pp
am 07.08.) - stuetzt den Schluss, dass die gewanderte Basisrate ein
Zeitraum-Effekt war.
Sauber: alle Standardpruefungen, 0 fehlende Frontend-IDs, mt5_lock,
Broker-Zeit, Race-Klasse. Performance: Snapshot-Median 15,9 ms, alle
heissen Abfragen ueber Index - keine Optimierung noetig.
Kein toter Code geloescht: die vermeintlich verwaisten Snapshot-Felder
sind Diagnose-Oberflaeche (vier davon heute zur Deploy-Verifikation
benutzt).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
a866c9cec7
commit
dca3c11bbd
@@ -414,6 +414,59 @@ CONFIG_DEPS = [
|
||||
]
|
||||
|
||||
|
||||
# ── TELEMETRIE-PULS ───────────────────────────────────────────────────────────
|
||||
# ⚠⚠ ANLASS (2026-08-11, Review-Durchgang 4): `rec_outcomes` — die
|
||||
# Selbst-Kalibrierung der Empfehlung — stand seit dem Einbau am 06.08. bei
|
||||
# **0 Zeilen**. Ursache war ein falsches dict (`s.get("pb_feats")` auf dem
|
||||
# MT5Data- statt dem Wave-Snapshot) → `_atr` immer 0 → die Schreibbedingung
|
||||
# nie erfüllt. **Kein NameError** (ruff sieht nichts), und das umgebende
|
||||
# `except` loggt auf DEBUG, der Logger steht auf INFO. Fünf Tage still tot.
|
||||
# Aufgefallen NUR, weil die Tabelle mit 0 Zeilen neben ihren Schwestern stand.
|
||||
# ➜ Diese Prüfung generalisiert den Fund: jede Telemetrie-Tabelle muss einen
|
||||
# PULS haben. Schweigt eine, während die anderen schreiben, ist der Logger tot.
|
||||
# ⚠ Die Toleranz ist grosszügig (Faktor 20 der erwarteten Kadenz), damit ein
|
||||
# ruhiger Markt keinen Fehlalarm auslöst — ein Wächter, der oft warnt, wird
|
||||
# ignoriert (Lehre vom 02.08.).
|
||||
_PULS = [
|
||||
# (Tabelle, Zeitspalte, erwartete Kadenz in Minuten, wozu)
|
||||
("recommendations", "timestamp", 1, "Empfehlungs-Log"),
|
||||
("candles_m1", "time", 1, "M1-Kerzen-Sammlung"),
|
||||
("verdict_votes", "ts", 1, "Modul-Stimmen"),
|
||||
("m15_states", "ts", 60, "M15-Karte Selbstmessung"),
|
||||
("cone_checks", "ts", 60, "Kegel-Kalibrierung (ACI)"),
|
||||
("pbreak_predictions", "ts", 60, "P(break)-Prognose-Tracking"),
|
||||
("rec_outcomes", "ts", 180, "Selbst-Kalibrierung Empfehlung"),
|
||||
]
|
||||
|
||||
|
||||
def telemetrie_puls() -> list:
|
||||
"""Welche Telemetrie-Tabelle schreibt nicht mehr? → Liste von Klartext-Zeilen."""
|
||||
import sqlite3
|
||||
import time as _t
|
||||
out = []
|
||||
try:
|
||||
db = sqlite3.connect(DB)
|
||||
except Exception:
|
||||
return out
|
||||
jetzt = _t.time()
|
||||
for tab, sp, kadenz, wozu in _PULS:
|
||||
try:
|
||||
n = db.execute(f"SELECT COUNT(*) FROM {tab}").fetchone()[0]
|
||||
letzt = db.execute(f"SELECT MAX({sp}) FROM {tab}").fetchone()[0]
|
||||
except Exception:
|
||||
continue # Tabelle gibt es (noch) nicht
|
||||
if not n:
|
||||
out.append(f"{tab}: 0 Zeilen — der Logger hat NIE geschrieben ({wozu})")
|
||||
continue
|
||||
# ⚠ candles_m1.time ist ROHE Brokerzeit (UTC+3) — sonst 3 h Fehlalarm.
|
||||
alter_min = (jetzt - (letzt - 10800 if tab == "candles_m1" else letzt)) / 60.0
|
||||
if alter_min > kadenz * 20:
|
||||
out.append(f"{tab}: letzte Zeile vor {alter_min/60:.1f} h "
|
||||
f"(erwartet ~alle {kadenz} min) — {wozu}")
|
||||
db.close()
|
||||
return out
|
||||
|
||||
|
||||
def _cfg_now() -> dict:
|
||||
"""Liest NUR die überwachten [trading]-Keys. ⚠ Die ini enthält Live-Secrets —
|
||||
hier wird bewusst nichts anderes gelesen oder ausgegeben.
|
||||
@@ -533,6 +586,14 @@ def main() -> None:
|
||||
print(f"\n ⚠ {d['key']}: ist '{cur}' — gemessen/validiert gegen '{val}'")
|
||||
print(f" betroffen: {d['test']}")
|
||||
print(f" {d['why']}")
|
||||
print("\n" + "=" * 78)
|
||||
print(" TELEMETRIE-PULS — schreibt jeder Logger noch?")
|
||||
print("=" * 78)
|
||||
puls = telemetrie_puls()
|
||||
if not puls:
|
||||
print(f"\n ✅ alle {len(_PULS)} Telemetrie-Tabellen schreiben")
|
||||
for x in puls:
|
||||
print(f"\n ⚠ {x}")
|
||||
return
|
||||
|
||||
if not due and not drift_new:
|
||||
|
||||
Reference in New Issue
Block a user