Real errors fixed (all verified by manual run): - price_monitor.py: shares None -> TypeError at L584 (now completes 3m7s, full 39-stock reassess + zone triggers + Dad push) - market_insight.py: net_inflow None -> TypeError at L142 (now 0.3s, 5 insights) - promote_candidates.py: add busy_timeout=30s (DB lock under concurrent writes) - premarket_full_review.py: 12-dim analysis now detached background launch (was doomed by cron 120s script timeout no matter what) Systemic: - HERMES_CRON_SCRIPT_TIMEOUT=600 drop-in for both gateway services (fixes mofin_health SIGTERM, market_watch timeout, memory_guardian timeout) - sync_profile_scripts.sh: re-hardlink deploy->profile scripts after every deploy (scp replaces files = new inode = broken hardlink = cron silently runs stale code; this caused promote to keep failing after my first fix) Monitoring false-alarm fixes (the '花瓶' problem): - mofin_health.py: legacy JSONs that migrated to DB (multi_tf_cache/ macro_context/market/live_prices/price_history/macro_risk_state) no longer warn 'no readers'; marked as migrated - NEW db_freshness section: real pipeline health from DB tables (mtf_cache 0.4h / macro_context_log 2h / market_snapshots 2h / live_prices 0.4h / price_events.json 0.4h — ALL HEALTHY) - price_events freshness reads live JSON store (DB table is legacy) - market.json placeholder created (13+ scripts have fallback paths) Investigation notes: wiki-self-growth 03:04 key1 429 predates full key6 activation on default gateway; current 8642 verified on key6 and working. Weekend 'Blocked' jobs verified fixed (vacuum_state_db passes).
16 lines
713 B
Python
16 lines
713 B
Python
import sqlite3
|
|
from datetime import datetime
|
|
conn = sqlite3.connect('/home/hmo/MoFin/data/mofin.db')
|
|
for t, c in [('mtf_cache','updated_at'),('macro_context_log','created_at'),
|
|
('live_prices','updated_at'),('price_events','created_at'),('market_snapshots','created_at')]:
|
|
try:
|
|
row = conn.execute(f"SELECT MAX({c}) FROM {t}").fetchone()
|
|
print(f"{t}.{c} MAX = {row[0]!r}")
|
|
if row and row[0]:
|
|
try:
|
|
dt = datetime.fromisoformat(str(row[0]).replace('Z',''))
|
|
print(f" parsed OK: {dt}")
|
|
except Exception as pe:
|
|
print(f" PARSE FAIL: {pe}")
|
|
except Exception as e:
|
|
print(f"{t}: QUERY ERROR {e}") |