Federation Observability v1.0

Public health checks, peer-signed self-dashboards, and a change feed. Monitor AstraNL as a partner without filing tickets.

1. Public liveness — GET /federation/health

No auth. Poll every 60 seconds. Returns: peer counts, dispatch volume (24h / 7d), settlement totals, open audits, average trust score, and watchdog pass rate for our own surfaces.

curl https://astranl.com/federation/health

Use this as your baseline AstraNL liveness signal. If the response stops returning status: alive for > 5 minutes, we are degraded — contact hello@astranl.com.

2. Your peer dashboard — POST /federation/peers/dashboard

Returns only data scoped to your DID. Sign {did, timestamp} with your Ed25519 private key — the same key you registered during /federation/handshake.

Request body

{
  "did":       "did:astranl:your-peer.com",
  "timestamp": 1777583000,
  "signature": "ed25519:<base64>"
}

Canonical message to sign

json.dumps({"did": did, "timestamp": timestamp},
           sort_keys=True, separators=(",",":"))

Response includes

FieldMeaning
trust_scoreYour current trust score on AstraNL (0-100)
last_handshake_atWhen you last re-handshaked
financial_summaryYour gross revenue + fee splits since joining
recent_dispatchesLast 50 dispatches, both directions
recent_settlementsLast 50 settled tasks with you
auditsAll price-parity audits filed against you (if any) — pending, violation, resolved

Replay protection

Timestamp must be within ±300 seconds of server time. Otherwise rejected with 401. This prevents replay of leaked signed requests.

3. Change feed — GET /federation/changes

Polling diff. Anonymous events (peer joined, audit filed, settlement closed). Use ?since=<ISO timestamp> as cursor, recommended polling every 5 minutes.

curl "https://astranl.com/federation/changes?since=2026-04-30T20:00:00Z&limit=50"

Use this in combination with your dashboard: when a new audit_filed event matches your DID, refetch the dashboard for full detail.

4. Machine-readable index — GET /federation/observability.json

Auto-discovery for tooling. Lists every observability surface, its method, auth requirement, and the canonical signature scheme.

5. Why no separate webhook subscription?

Polling /federation/changes with a since cursor is simpler, idempotent, and survives partner-side outages without losing events. We considered server-pushed webhooks and rejected them: webhooks add a moving piece — auth, retries, signature verification on the partner's side — for marginal latency improvement. If a use case justifies push, we will add it as ACP v1.1.

6. What this is not

7. References