Source — status.mainland.so health.json contract · src-status-health
Owner directive (2026-07-10), canonical. "Create a Dispatch, Wake you up every 10 minutes, check if all capability is allocated, check the conclusion of particles and atoms and if the run is moving." [src: wiki/development/prompts-archive/by-topic/knowledge-management-and-concept-modeling.md:646] — health.json is the estate-level probe the dispatch heartbeat reads.
Content
Absorption card for the live health contract of the estate: https://status.mainland.so/health.json — an unauthenticated, CORS-open endpoint ("/health.json is left unauthenticated + CORS-open so dashboards/widgets can poll the live status (it exposes only HTTP codes + up/down + disk/load — no credentials)" [src: runs/deploy-status/status.mainland.so:2]; Access-Control-Allow-Origin: *, Cache-Control: no-store [src: runs/deploy-status/status.mainland.so:17]). The rest of the status site is basic-auth gated (hos).
Generator
status-health.py runs on the droplet as a systemd oneshot service + timer, every 5 minutes (OnUnitActiveSec=300, OnBootSec=60) [src: runs/deploy-status/status-health.timer:1] and writes /var/www/status/health.json. It probes origin-local ("no Cloudflare round-trip, no single-IP rate-limit") by curling 127.0.0.1 with a Host: header per vhost [src: runs/deploy-status/status-health.py:2,13].
The JSON contract
{
"generatedAt": "ISO-8601 UTC",
"source": "live",
"endpoints": [ { "group": "...", "name": "...", "url": "...", "purpose": "...", "code": 200, "agg": "28/28" } ],
"services": { "hosweb": "active", "nginx": "active", "hosweb-health.timer": "active" },
"box": { "disk": "42%", "load": "0.31, 0.28, 0.25", "port3300": "listening" }
}
[src: runs/deploy-status/status-health.py:79]
Endpoint groups probed
| Group | Entries | Notes |
|---|---|---|
| Flagship & Orgs | web.mainland.so/website + the 28 org subdomains aggregated as one row (agg: "N/28") | ORG_SLUGS lists 28 slugs (the 29 instances minus mainland itself) [src: runs/deploy-status/status-health.py:20] |
| Content & Static | organizations · documentation · docs · prompts · showcase · poc · mvp | the static vhosts of src-droplet-index |
| Infrastructure | app (Coolify) · git (Gitea) · n8n | HTTP-probed |
| Infrastructure (docker-detected) | mail (Stalwart) · livekit · neo4j | code: 200 iff a matching container name is in docker ps, else null [src: runs/deploy-status/status-health.py:60] |
services checks systemctl is-active for hosweb/nginx/timer; box reports disk %, load averages, and whether :3300 is listening [src: runs/deploy-status/status-health.py:71].
Consumption rules
- Any dashboard, widget or kernel-neural-engine heartbeat may poll it cross-origin; never cache (the server already forbids it).
code: nullmeans down or not probed-able, not necessarily an error class — pair withpurposetext.- The aggregated org row means per-org failures are invisible in this feed; for per-slug truth, probe
https://<slug>.mainland.so/websitedirectly per src-droplet-index. - The 5-minute generator cadence and the 10-minute dispatch heartbeat are intentionally different clocks: health.json is estate truth; the dispatch heartbeat is run truth (schema-dispatch-json).
Composition
- uses: src-droplet-index (the vhosts it probes)
- used-by: kernel-neural-engine (heartbeat's estate-level input), district-spatial-site (workstation page may embed the pane), cogni-neural-engine (accept/refuse may require live 200s post-deploy)
See also
- bm-001-web-perf — performance gates complementing this availability gate
- [Status generator source](../../../runs/deploy-status/status-health.py)