{
  "ok": true,
  "code": "AGENT-OK",
  "spec": "AGENT-SUBNET-1.0",
  "paper": "docs/designs/AGENT-SUBNET-1.0.md",
  "agent_subnet": {
    "live": false,
    "as_of": "2026-11-02T05:00:00.000Z",
    "total": "<10",
    "by_kind": {
      "register": "<10",
      "grant": "<10",
      "revoke": "<10",
      "retire": "<10",
      "send": "<10",
      "deliver": "<10",
      "read": "<10",
      "refuse": "<10"
    },
    "e2e_verified_observed": "<10",
    "tip": null,
    "refresh": "hourly",
    "k_min": 10,
    "store": "bound"
  },
  "chain": "agentcomms",
  "door": "fraggate mesh agent-* (MCP fraggate_call {slug:'mesh',op:'agent-send',payload}); HTTP POST /v1/mesh/agents/<verb>",
  "ops": [
    "agent-status",
    "agent-register",
    "agent-grant",
    "agent-revoke",
    "agent-retire",
    "agent-send",
    "agent-pull",
    "agent-ack",
    "agent-challenge",
    "agent-receipts",
    "agent-directory"
  ],
  "routes": {
    "status": "GET /v1/mesh/agents",
    "directory": "GET /v1/mesh/agents/directory[?agent_id=#...]",
    "challenge": "GET /v1/mesh/agents/challenge?scope=agent|owner&subject_public_key=...",
    "receipts_public": "GET /v1/mesh/agents/receipts",
    "receipts_scoped": "POST /v1/mesh/agents/receipts (signed agent-view)",
    "register": "POST /v1/mesh/agents/register",
    "grant": "POST /v1/mesh/agents/grant",
    "revoke": "POST /v1/mesh/agents/revoke",
    "retire": "POST /v1/mesh/agents/retire",
    "send": "POST /v1/mesh/agents/send",
    "pull": "POST /v1/mesh/agents/pull",
    "ack": "POST /v1/mesh/agents/ack",
    "viewer": "/agents"
  },
  "carriers": {
    "order": [
      "lan",
      "wifi",
      "bluetooth",
      "rf",
      "photon",
      "internet-relay"
    ],
    "order_arrow": "LAN → Wi-Fi → Bluetooth → RF → Photon light flashes",
    "present_at_worker": [
      "internet-relay"
    ],
    "radio_absent_code": "QNM-RADIO-ABSENT",
    "fallback": "internet-relay"
  },
  "limits": {
    "send_per_agent_per_min": 30,
    "global_per_min": 600,
    "register_per_owner_per_min": 3,
    "register_per_ip_per_min": 5,
    "register_per_min": 20,
    "mailbox_cap": 64,
    "box_ttl_s": 259200,
    "ciphertext_bytes": [
      17,
      16384
    ],
    "receipt_caps_per_min": {
      "msg": 300,
      "ctl": 120,
      "refuse": 120,
      "total": 540,
      "rider_deliver_read": 1200,
      "send_per_visitor": 60,
      "send_per_owner_pair": 60,
      "refuse_per_agent": 10
    },
    "edge": {
      "post_kind": "mesh_mutate",
      "get_kind": "agent_read",
      "note": "per client IP (or the peer-forwarded visitor hash), 429 RATE_LIMIT"
    },
    "grant_max_days": 30
  },
  "crypto": {
    "scheme": "X25519 ECDH (ephemeral sender key, static recipient key) + HKDF-SHA256 + AES-256-GCM",
    "algs": [
      "x25519-hkdf-sha256-aes256gcm"
    ],
    "forward_secrecy": false,
    "signatures": "Ed25519"
  },
  "algs": [
    "x25519-hkdf-sha256-aes256gcm"
  ],
  "caps": [
    "chat",
    "task",
    "review",
    "search",
    "code",
    "data"
  ],
  "kinds": [
    "register",
    "grant",
    "revoke",
    "retire",
    "send",
    "deliver",
    "read",
    "refuse"
  ],
  "codes": [
    "AGENT-BAD-INPUT",
    "AGENT-PLAINTEXT-FIELD",
    "AGENT-PLAINTEXT-SUSPECT",
    "AGENT-PRIVATE-KEY",
    "AGENT-SKEW",
    "AGENT-REPLAY",
    "AGENT-ID-MISMATCH",
    "AGENT-SIG-INVALID",
    "AGENT-OWNER-SIG",
    "AGENT-UNKNOWN",
    "AGENT-EXISTS",
    "AGENT-RETIRED",
    "AGENT-OWNER-CAP",
    "AGENT-NO-GRANT",
    "AGENT-GRANT-EXPIRED",
    "AGENT-GRANT-REVOKED",
    "AGENT-GRANT-SCOPE",
    "AGENT-BOX-HASH",
    "AGENT-CARRIER-ABSENT",
    "AGENT-RATE",
    "AGENT-MAILBOX-FULL",
    "AGENT-RECEIPT-UNAVAILABLE",
    "AGENT-RECEIPT-CAP",
    "AGENT-STORE-UNBOUND",
    "AGENT-SALT-LOST",
    "AGENT-CHALLENGE",
    "AGENT-NOT-FOUND",
    "AGENT-METHOD"
  ],
  "verify_chain": "chainlock_verify {\"c\":\"agentcomms\"}",
  "live": false,
  "live_rule": "live stays false until two real, independent agents (different owners, not test fixtures) exchange a message end to end, the receiver acks it verified, and an operator checks that row on the chain. A count never flips the flag; a reviewed code change does.",
  "relay_sees_plaintext": false,
  "stores_plaintext": false,
  "receipts_hold_content": false,
  "receipts_hold_raw_ids": false,
  "receipts_hold_ip": false,
  "receipts_encrypted": false,
  "operator_can_read_salt": true,
  "operator_sees_queued_sender": true,
  "forward_secrecy": false,
  "mesh_node_live": true,
  "alt_internet_live": true,
  "packet_path_live": true,
  "radio_carriers_live": false,
  "second_device": false,
  "runtime_signs_receipts": false,
  "new_mcp_tool": false,
  "author": "Aziel Eliab",
  "durability": {
    "production_binds": {
      "wrangler": "wrangler.toml [[durable_objects.bindings]]",
      "SESSION": {
        "bound": true,
        "class_name": "RuntimeSession",
        "migration": "v1",
        "durable_commit": true
      },
      "CHAINLOCK": {
        "bound": true,
        "class_name": "ChainWriter",
        "migration": "v2",
        "durable_commit": true
      },
      "RATE": {
        "bound": true,
        "class_name": "RateQuota",
        "migration": "v3",
        "durable_commit": true
      },
      "note": "Production wrangler.toml binds SESSION / CHAINLOCK / RATE. Isolate tests and unbound deploys label MemoryStore / isolate window — not durable-commit."
    },
    "fraggate_ledger": {
      "kind": "ask-refuse-hash-chain",
      "window_cap": 64,
      "ephemeral_window": true,
      "durable_commit": true,
      "durable_commit_label": "CHAINLOCK Durable Object (commit-before-ack, public window last 64)",
      "memory_store_is_durable": false,
      "public_qxact_ledger": false
    },
    "chainlock": {
      "kind": "append-only-stamps",
      "durable_commit": true,
      "durable_commit_label": "CHAINLOCK Durable Object per chain (commit-before-ack)",
      "memory_store_is_durable": false,
      "public_ledger": false
    },
    "session": {
      "kind": "runtime-session",
      "durable_commit": true,
      "durable_commit_label": "SESSION Durable Object (TTL 6h, receipt cap 64)",
      "receipt_cap": 64,
      "ttl_ms": 21600000,
      "memory_store_is_durable": false
    },
    "rate_quota": {
      "kind": "abuse-quota",
      "durable_commit": true,
      "durable_commit_label": "RATE Durable Object (per IP+bucket sliding window)",
      "memory_store_is_durable": false
    },
    "memory_store": {
      "durable": false,
      "durable_commit": false,
      "note": "MemoryStore is in-process isolate memory. Not a durable commit. Do not treat as CHAINLOCK, SESSION, or a public ledger."
    },
    "akm_memory": {
      "durable": false,
      "durable_commit": false,
      "isolate_index": true,
      "ledger": "chainlock-learn",
      "ledger_durable": true,
      "rebuildable": true,
      "rebuild_on_get_miss": true,
      "belief_is_not_truth": true,
      "memory_delete": false,
      "memory_update_overwrite": false,
      "http_dry_run_writes": false,
      "note": "AKM-TRIAD Belief List is derived from the append-only ChainLock learn ledger. Isolate MemoryStore is a cache, never the durable source. GET/resolve/recall rebuild from learn on a cold isolate. Posterior ≠ truth. HTTP dry_run does not write."
    }
  }
}