{
  "generated_at": 1791172981,
  "generated_at_iso": "2026-10-05T04:03:01.000Z",
  "collector": {
    "version": 1,
    "kinds": [
      11316,
      11317,
      11318,
      11319,
      11320
    ],
    "relays": [
      "wss://relay.damus.io",
      "wss://relay2.orangesync.tech"
    ],
    "relay_status": [
      {
        "relay": "wss://relay.damus.io",
        "ok": true,
        "events": 66,
        "error": null
      },
      {
        "relay": "wss://relay2.orangesync.tech",
        "ok": true,
        "events": 0,
        "error": null
      }
    ],
    "offline_input": null
  },
  "allowlist": {
    "source": "curators.json",
    "dashboard_host": "cvm.orangesync.tech",
    "curators": [
      {
        "npub": "npub1ftjlarsn0k4g5wmxnjcae48u2nl20vfu2lf3rjdqrht89h9z0fhsah7hqu",
        "role": "curator",
        "note": "Registry #1. Publishes the kind-30000 lists referenced by the 'a' tag in provider announcements.",
        "derived_from": "secp256k1 key 4ae5fe8e (operator's active signing key; npub re-derived with nak encode npub on 2026-10-04)"
      }
    ],
    "pubkey_count": 1,
    "errors": [],
    "policy": {
      "unknown_npub": "not rendered",
      "empty_list": "renders nothing (fail closed)",
      "change_process": "edit this file, commit, redeploy"
    }
  },
  "policy": {
    "_comment": "Freshness policy for the public cvm-registry dashboard. Single source of truth: the collector copies this object verbatim into site/catalog.json under 'policy', and the client reads it from there. Change the numbers here, rebuild, redeploy. ADR-0001 D6 is the rule this file implements.",
    "version": 1,
    "updated": "2026-10-05",
    "dashboard_host": "cvm.orangesync.tech",
    "freshness": {
      "fresh_ttl_seconds": 900,
      "max_age_seconds": 21600,
      "clock_skew_seconds": 120
    },
    "semantics": {
      "fresh": "age <= fresh_ttl_seconds: announcements may be presented as current",
      "stale": "fresh_ttl_seconds < age <= max_age_seconds: entries are shown ONLY as an explicitly labelled cached snapshot; every live claim (freshness, refresh, 'current') is disabled",
      "expired": "age > max_age_seconds: the catalog is DISABLED and no entry is rendered",
      "invalid": "generated_at missing, unparseable, or future-dated beyond clock_skew_seconds: DISABLED (fail closed)",
      "rule": "stale must disable, never silently show old state as live (ADR-0001 D6)"
    }
  },
  "counts": {
    "raw_events": 66,
    "after_dedupe": 66,
    "kept": 0,
    "dropped_not_allowlisted": 66
  },
  "class_tally": {},
  "entries": []
}
