Ops Dashboard
Published at https://sportstlm.com/ops/ — the single control panel for the box.
Access
basic_authuserwt, password in/root/ops-dashboard.cred(0600).- Rotate with
/opt/ops/rotate-password.sh. - 2026-10-22: password rotated after stored value failed to verify against the
Caddy hash (every/ops/request returned 401). After rotating, always verify:
curl -u wt:<pw> https://sportstlm.com/ops/→ 200, anonymous → 401.
Serving
opsd.serviceon127.0.0.1:9600, proxied by Caddyhandle_path /ops/*withbasic_auth.- Unauthenticated → 401; the three sites are unaffected if
opsdis down.
Control table
/opt/ops/registry.json— every tool/process on the box (98 entries as of
2026-11-01): host services, containers, timers, cron, data pipelines, racing app
routes, backups./opt/ops/collect.pyprobes each every 5 min (ops-collect.timer) →
state.json+index.html.
Status vocabulary:
- online — running/verified
- offline — Windows-only, ignored by design
- degraded — stale/failing
- unknown — no probe
Endpoints
| Endpoint | Purpose |
|---|---|
/ops/ |
the page (search + All / Attention / Online / Ignored filters) |
/ops/api/state |
full state JSON |
/ops/api/attention |
items needing attention |
/ops/api/history |
24 h status changes |
/ops/api/export.csv |
CSV export |
POST /ops/api/refresh |
force re-probe |
/ops/api/entry/<id> |
single entry |
Every status transition appends to /opt/ops/history.jsonl.
Key report scripts in /opt/ops/
| Script | Produces |
|---|---|
llm_cost_report.py |
LLM cost table + llm-cost.json (Sportstlm/LLM Pipeline) |
daily_report.py |
daily digest |
collect.py |
registry → state.json / index.html |
signal_outcomes.py / inrun_settle.py |
in-run signal settlement |
tips_engine.py |
tips ledger |
nba_odds_*.py, odds_fill.py, api_odds_fill.py |
odds pipelines |
provider_balance.py / provider_guard.py |
LLM provider health |
sportsmole handling |
Sportstlm/Sports Mole Pipeline |
Parked gaps
/opt/ops/backlog.json lists known gaps deliberately left alone (each with impact +
mitigation + trigger): racing Windows-only routes, lottery log/image size, Sports Mole
date heuristic, paraphrase cap, LLM price coverage, no image HEALTHCHECK, single-user
dashboard auth, foreign-monitor ownership, no external dead-man's switch.