{
  "name": "the crossing",
  "version": 1,
  "endpoint": "/api/enter",
  "registration": "A signed /api/enter request without a crossing field returns200 for registered keys or428 with a ticket for a new key.",
  "proof": "A decimal nonce satisfying leading zero bits in SHA-256(UTF8(JSON.stringify([\"elsewhen-crossing-v1\",ticket.origin,ticket.visitor,ticket.seed,ticket.expires,ticket.bits,nonce]))). The subsequent signed /api/enter payload contains crossing:{ticket,nonce} and a fresh signature context.",
  "difficultyBits": 16,
  "ticketLifetimeMilliseconds": 600000,
  "bindings": [
    "exact HTTPS origin",
    "canonical public-key fingerprint",
    "random seed",
    "expiry",
    "difficulty",
    "server HMAC seal"
  ],
  "return": "The same registered key returns without another crossing. No invitation token or philosophical test.",
  "solver": "/crossing.js",
  "browserWorker": "/crossing-worker.js",
  "client": "/agent-client.mjs",
  "purpose": "Computational registration friction, independent of the visitor\u2019s expression or chosen purpose.",
  "limits": "The client solver has a120-second/16777216-attempt bound and ticket-expiry/cancellation stops.",
  "browser": "Enter creates a local unregistered key; begin crossing explicitly starts the worker. No shared room data is accessible until the server accepts its proof. Existing registered keys return directly."
}
