{
  "_what": "The service manifest at the conventional fixed path. A stranger can find the service and check its answers without asking us.",
  "service": {
    "name": "bringup-service",
    "url": "https://bringup-svc.pages.dev/",
    "why_this_host": "The Worker deployment is unreachable here: *.workers.dev resolves to a non-Cloudflare address on this network. Same handler, different hostname family.",
    "identity": "64a95f9c9b42feb4185746eb6c88708bbfe8dda8909dc72dbc243552d1dc3baa",
    "identity_note": "PUBLISHED and BIP340-verified: this is the x-only key the deployed service signs with, established by verifying an answer rather than by trusting one. A second check used 36 real reveal txids; the service rebuilt the container from the chain and returned ok with 47 files and 322622 bytes, and that answer verified too.",
    "expires": 1800145928,
    "expires_note": "2027-01-17T00:32:08Z, 90 days after this manifest was written. A MONOTONE COUNTER, not a time lock: a client remembers the highest expires it accepted (service.js floorVerdict) and refuses any manifest that does not advance it. It does NOT stop the service (no CLTV here), and on an unsigned manifest the number only orders versions. Bump it on every publish."
  },
  "envelope": {
    "request": "GET /?method=<name>&id=<client id>&params=<url-encoded JSON object>",
    "reply": "{ service, id, ok, body, ts, sig }",
    "digest": "BRINGUP/resp|v1| over service, id, hash(request), ok, hash(body), ts",
    "verify_with": "service.js answerDigest() then BIP340-verify with the service key. Use the request YOU sent, never values echoed back.",
    "classification": "classifyAnswer() has six names: accepted result, accepted error, own request malformed, binding failure, transport failure, rate limited. No signature at all is a transport failure.",
    "body": "canonical JSON text, hashed as text"
  },
  "methods": [
    {
      "name": "verifyContent",
      "params": {
        "reveals": "array of reveal txids",
        "payloadHash": "64 hex content root"
      },
      "returns": "payloadHash, size, files, fileNames when ok; code and message otherwise",
      "indexer": "none: the caller already knows the carriers",
      "why_trustworthy": "the verdict is derived from the bytes, so the service cannot be talked into saying ok"
    },
    {
      "name": "blockNumber",
      "params": {},
      "returns": "always a signed INTERNAL error today",
      "indexer": "required and absent, so it refuses instead of inventing a number"
    }
  ],
  "error_codes": [
    "PAYMENT_REQUIRED",
    "BAD_VOUCHER",
    "METHOD_NOT_FOUND",
    "BAD_REQUEST",
    "INTERNAL",
    "TOOLS_CHANGED"
  ],
  "error_codes_note": "codes are added, never renamed; an unknown code is an error, never a result",
  "how_to_check_this_service": "node engine/tools/service_probe.mjs --url=https://bringup-svc.pages.dev"
}
