feat: initial uptime-probe — replaces upptime/uptime-monitor (closes molecule-ai-status#2)
Gitea-native uptime probe. Reads .upptimerc.yml-compatible config,
emits per-site Result{timestamp, name, url, status_code, latency_ms,
success, error} as JSON. Optional -history-dir appends per-site JSONL
files for time-series.
Why: upptime is structurally GitHub-coupled (every code path hits
api.github.com — releases lookup + issue management + result commits).
Post the 2026-05-06 GitHub org suspension, no token in our org
authenticates there. Diagnosis + replacement options in
molecule-ai-status#2.
What this replaces vs deliberately leaves out:
- IN: probe loop, parallel HTTP, status + latency cap matching, JSONL
history append, JSON stdout output
- OUT: result commits (Gitea Actions cron orchestrates), issue
management (out of scope), status-page rendering (Vercel does that)
Module path: go.moleculesai.app/uptime-probe (vanity from day 1 — no
migration cost later; matches internal#71 pattern).
Smoke-tested against the existing .upptimerc.yml in molecule-ai-status:
all 7 production endpoints (canvas, docs, CP, landing) return 200 with
latencies 148-357ms. Probe classifies correctly.
Exit codes:
0 all probes succeeded
1 one or more sites returned a non-success (status / latency /
connection failure)
2 config error / unrecoverable I/O