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).
47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
import json, os
|
|
|
|
# 1. Check data pipeline stagnation
|
|
print("=== DATA FILE AGES ===")
|
|
for f in ['multi_tf_cache.json', 'macro_context.json', 'market.json']:
|
|
p = f'/home/hmo/MoFin/data/{f}'
|
|
if os.path.exists(p):
|
|
sec = (os.path.getmtime(p))
|
|
from datetime import datetime
|
|
print(f' {f}: {datetime.fromtimestamp(sec)} ({int((os.path.getmtime(p))/3600)}h ago)')
|
|
else:
|
|
print(f' {f}: MISSING')
|
|
|
|
# 2. Cron scripts missing from profile scripts dir
|
|
print()
|
|
print("=== MISSING CRON SCRIPTS ===")
|
|
d = json.load(open('/home/hmo/.hermes/profiles/position-analyst/cron/jobs.json'))
|
|
jobs = d if isinstance(d, list) else d.get('jobs', [])
|
|
scripts_dir = '/home/hmo/.hermes/profiles/position-analyst/scripts'
|
|
existing = set(os.listdir(scripts_dir))
|
|
missing = []
|
|
for j in jobs:
|
|
s = j.get('script', '')
|
|
if s and s not in existing and j.get('no_agent'):
|
|
missing.append((j.get('name'), s))
|
|
print(f' MISSING: {s} (job: {j.get(\"name\",\"?\")})')
|
|
if not missing:
|
|
print(' (none missing)')
|
|
|
|
# 3. Find source locations for missing scripts
|
|
print()
|
|
print("=== FIND MISSING SCRIPTS IN MoFin ===")
|
|
for name, script in missing:
|
|
import subprocess
|
|
r = subprocess.run(['find', '/home/hmo/MoFin', '-name', script, '-not', '-path', '*/venv/*'],
|
|
capture_output=True, text=True, timeout=15)
|
|
found = [l for l in r.stdout.splitlines() if l.strip()]
|
|
print(f' {script}: {found if found else "NOT FOUND"}')
|
|
|
|
# 4. market.json generator
|
|
print()
|
|
print("=== market.json GENERATOR ===")
|
|
r = subprocess.run(['grep', '-rn', "'market.json'", '/home/hmo/MoFin/deploy/profile-scripts/', '/home/hmo/MoFin/scripts/'],
|
|
capture_output=True, text=True, timeout=10)
|
|
for l in r.stdout.splitlines():
|
|
if 'market.json' in l:
|
|
print(f' {l}') |