{
  "openapi": "3.1.0",
  "info": {
    "title": "Article 11 Public Agent and Proof Surface",
    "version": "0.4.1-public-agent-rules",
    "summary": "Bounded public agent adapters plus discoverable verification endpoints for IRONLEDGER and IRONGATE.",
    "description": "Public agent and proof surface for auditors, buyers, and agents. The v1 handshake does not register callers or issue credentials; the v1 query stays in the public_web airlock with private memory/context disabled. IRONLEDGER records claims and integrity evidence; establishing an event requires its underlying evidence; IRONGATE is an authorization checkpoint for deciding what is allowed to happen when an orchestrator invokes it. Public claim changes to this surface require Bridge authorization.",
    "license": {
      "name": "CC0 1.0 Universal",
      "url": "https://creativecommons.org/publicdomain/zero/1.0/"
    }
  },
  "externalDocs": {
    "description": "Worker-served OpenAPI for the live API routes this static document omits (/mcp, /api/mcp/manifest, /api/mcp/tools, /api/discover, /api/agent/receipt, /api/health, /api/nodes, /api/status). The standard discovery path /.well-known/openapi.json redirects to it.",
    "url": "https://article11.ai/api/openapi.json"
  },
  "servers": [
    {
      "url": "https://article11.ai",
      "description": "Public Article 11 site and Worker routes"
    }
  ],
  "tags": [
    {"name":"Public Rules","description":"Exact public article reads and deterministic keyword search; no model or application-state write."},
    {
      "name": "Public Agent V1",
      "description": "Non-registering orientation and bounded public_web queries to Ember or Lumen. No credentials or private memory/context."
    },
    {
      "name": "Proof Surface",
      "description": "Independent verification endpoints and downloadable verifier artifacts."
    },
    {
      "name": "Capability Control Plane",
      "description": "Discovery for IRONGATE, the governed-authorization checkpoint. BRIDGE_AUTH is live; inline runtime enforcement, node quorum, and dissent channels remain roadmap."
    }
  ],
  "paths": {
    "/api/agent/rules": {
      "description": "Public, credential-free reads of the published 47-article Constitution 2.0 snapshot. The handler invokes no model, reads no private memory, and writes no application state. Public access logs may record request URLs. Unknown or duplicate query keys return 400; article and q are mutually exclusive. Other methods return 405 with METHOD_NOT_ALLOWED. Reading records no assent, registration or authority.",
      "get": {
        "tags": [
          "Public Rules"
        ],
        "summary": "Browse, read or keyword-search the current published rules",
        "operationId": "getPublicAgentRules",
        "security": [],
        "parameters": [
          {
            "name": "article",
            "in": "query",
            "description": "Exact article identifier after trimming and uppercasing, such as 1 or 11B. Syntax is one or two digits and an optional letter. Cannot be combined with q, limit or offset. A syntactically valid missing identifier returns 404.",
            "schema": {
              "type": "string"
            },
            "examples": {
              "choice": {
                "value": "1"
              },
              "suffix": {
                "value": "11B"
              }
            }
          },
          {
            "name": "q",
            "in": "query",
            "description": "Public keywords. After trimming: 1–200 UTF-16 code units, with no C0 control characters or DEL. Deterministic BM25 returns whole matching articles, not generated answers. Cannot be combined with article. URLs and queries may appear in ordinary hosting access logs; /ask performs search in the browser.",
            "schema": {
              "type": "string"
            },
            "example": "memory"
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Index/search page size. Decimal digits with no leading zeros; omit for a single article lookup.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 5
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Index/search offset. Decimal digits with no leading zeros except 0 itself; omit for a single article lookup. Offset 47 is valid and can return an empty page.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 47,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Index page, one complete article, keyword results, no_match or page_empty.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Allow": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentRulesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid, duplicate, unknown or incompatible query parameters.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Allow": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentRulesError"
                }
              }
            }
          },
          "404": {
            "description": "A valid article identifier is absent: mode article, status not_found, total 0 and results [].",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Allow": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentRulesResponse"
                }
              }
            }
          }
        }
      },
      "head": {
        "tags": [
          "Public Rules"
        ],
        "summary": "Check the same read and validation status without a body",
        "operationId": "headPublicAgentRules",
        "security": [],
        "parameters": [
          {
            "name": "article",
            "in": "query",
            "description": "Exact article identifier after trimming and uppercasing, such as 1 or 11B. Syntax is one or two digits and an optional letter. Cannot be combined with q, limit or offset. A syntactically valid missing identifier returns 404.",
            "schema": {
              "type": "string"
            },
            "examples": {
              "choice": {
                "value": "1"
              },
              "suffix": {
                "value": "11B"
              }
            }
          },
          {
            "name": "q",
            "in": "query",
            "description": "Public keywords. After trimming: 1–200 UTF-16 code units, with no C0 control characters or DEL. Deterministic BM25 returns whole matching articles, not generated answers. Cannot be combined with article. URLs and queries may appear in ordinary hosting access logs; /ask performs search in the browser.",
            "schema": {
              "type": "string"
            },
            "example": "memory"
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Index/search page size. Decimal digits with no leading zeros; omit for a single article lookup.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 5
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Index/search offset. Decimal digits with no leading zeros except 0 itself; omit for a single article lookup. Offset 47 is valid and can return an empty page.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 47,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Read is valid. No response body.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Allow": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              }
            }
          },
          "400": {
            "description": "Query parameters are invalid. No response body.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Allow": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              }
            }
          },
          "404": {
            "description": "Valid article identifier is absent. No response body.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Allow": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              }
            }
          }
        }
      },
      "options": {
        "tags": [
          "Public Rules"
        ],
        "summary": "Read public CORS and method headers",
        "operationId": "optionsPublicAgentRules",
        "security": [],
        "description": "Returns 204 without a body. OPTIONS does not validate query parameters.",
        "responses": {
          "204": {
            "description": "Public preflight; no state change or response body.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Allow": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "GET, HEAD, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Accept, Content-Type"
                }
              }
            }
          }
        }
      },
      "x-unsupported-method-response": {
        "status": 405,
        "error_code": "METHOD_NOT_ALLOWED",
        "schema": {
          "$ref": "#/components/schemas/AgentRulesError"
        },
        "headers": {
          "Cache-Control": {
            "schema": {
              "const": "no-store"
            }
          },
          "Allow": {
            "schema": {
              "const": "GET, HEAD, OPTIONS"
            }
          },
          "Access-Control-Allow-Origin": {
            "schema": {
              "const": "*"
            }
          },
          "Access-Control-Allow-Methods": {
            "schema": {
              "const": "GET, HEAD, OPTIONS"
            }
          }
        }
      }
    },
    "/api/v1/handshake": {
      "get": {
        "tags": ["Public Agent V1"],
        "summary": "Read the non-registering public agent contract",
        "operationId": "getPublicAgentHandshake",
        "description": "Returns public orientation. It does not register an agent, accept or issue credentials, or enable private memory/context.",
        "responses": {
          "200": { "description": "Public agent contract in the v1 envelope" },
          "403": { "$ref": "#/components/responses/PublicClientError" }
        }
      },
      "post": {
        "tags": ["Public Agent V1"],
        "summary": "Validate a bounded declaration without registration",
        "operationId": "postPublicAgentHandshake",
        "description": "The declaration is validated but not stored or echoed. Credential, registration, memory, and context fields are rejected. An empty JSON object is permitted, with application/json still required for POST.",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "agent_id": { "type": "string", "maxLength": 120 },
                  "client_name": { "type": "string", "maxLength": 120 },
                  "client_version": { "type": "string", "maxLength": 40 },
                  "protocol_version": { "type": "string", "maxLength": 40 },
                  "purpose": { "type": "string", "maxLength": 500 },
                  "capabilities": { "type": "array", "maxItems": 16, "items": { "type": "string", "maxLength": 64 } },
                  "requested_node": { "type": "string", "enum": ["S5_LOCUS", "Ember", "S17_LUMEN", "Lumen"] }
                }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Public contract; writes, registration, and credential issuance are false" },
          "400": { "$ref": "#/components/responses/PublicClientError" },
          "403": { "$ref": "#/components/responses/PublicClientError" },
          "413": { "$ref": "#/components/responses/PublicClientError" },
          "415": { "$ref": "#/components/responses/PublicClientError" }
        }
      }
    },
    "/api/v1/query": {
      "get": {
        "tags": ["Public Agent V1"],
        "summary": "Read the bounded public query contract",
        "operationId": "getPublicAgentQuery",
        "responses": { "200": { "description": "Accepted fields, nodes, and privacy boundary" } }
      },
      "post": {
        "tags": ["Public Agent V1"],
        "summary": "Query Ember or Lumen through the public_web airlock",
        "operationId": "postPublicAgentQuery",
        "description": "Accepts question and optional node only. Private memory and context remain disabled. Operational rate-limit counters and content hashes may be recorded, but the adapter creates no agent memory, registration, or credentials.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": ["question"],
                "properties": {
                  "question": { "type": "string", "minLength": 1, "maxLength": 2000 },
                  "node": { "type": "string", "enum": ["S5_LOCUS", "Ember", "S17_LUMEN", "Lumen"], "default": "S5_LOCUS" }
                }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Explicitly projected public-airlock response" },
          "400": { "$ref": "#/components/responses/PublicClientError" },
          "403": { "$ref": "#/components/responses/PublicClientError" },
          "413": { "$ref": "#/components/responses/PublicClientError" },
          "415": { "$ref": "#/components/responses/PublicClientError" },
          "429": { "$ref": "#/components/responses/PublicClientError" },
          "503": { "$ref": "#/components/responses/PublicClientError" }
        }
      }
    },
    "/api/ironledger/verify": {
      "get": {
        "tags": [
          "Proof Surface"
        ],
        "summary": "Return the canonical IRONLEDGER integrity verdict",
        "description": "Use canonical_spine_valid as the authoritative chain-integrity field. The legacy valid field is strict-table scoped and intentionally disclosed for backward compatibility.",
        "operationId": "getIronledgerVerify",
        "responses": {
          "200": {
            "description": "Canonical integrity verdict with strict-table caveats",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IronledgerVerify"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/api/ironledger/strict-table": {
      "get": {
        "tags": [
          "Proof Surface"
        ],
        "summary": "Return strict all-row IRONLEDGER verification data",
        "description": "The strict-table view exposes public chain metadata, including the documented block-153 seam. Descriptions and hash preimages are not public fields and requests for them are refused.",
        "operationId": "getIronledgerStrictTable",
        "responses": {
          "200": {
            "description": "Strict-table verification rows and caveats",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StrictTable"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/api/chain/strict-table": {
      "get": {
        "tags": [
          "Proof Surface"
        ],
        "summary": "Alias for /api/ironledger/strict-table",
        "operationId": "getChainStrictTable",
        "responses": {
          "200": {
            "description": "Strict-table verification rows and caveats",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StrictTable"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/api/ironledger/rows": {
      "get": {
        "tags": [
          "Proof Surface"
        ],
        "summary": "Alias for /api/ironledger/strict-table",
        "operationId": "getIronledgerRows",
        "responses": {
          "200": {
            "description": "Strict-table verification rows and caveats",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StrictTable"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/api/chain/status": {
      "get": {
        "tags": [
          "Proof Surface"
        ],
        "summary": "Return live chain status",
        "operationId": "getChainStatus",
        "responses": {
          "200": {
            "description": "Live chain status, head, genesis, and freshness metadata",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChainStatus"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/docs/AUDITOR_VERIFY_ARTICLE11_YOURSELF.md": {
      "get": {
        "tags": [
          "Proof Surface"
        ],
        "summary": "Read or download the independent CC0 chain verification guide",
        "operationId": "getIndependentVerifierGuide",
        "responses": {
          "200": {
            "description": "Markdown guide for independent verification",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/irongate.html": {
      "get": {
        "tags": [
          "Capability Control Plane"
        ],
        "summary": "Open the IRONGATE product page",
        "description": "Human-readable product surface for Bridge-signed authorization, orchestrator-invoked checkpointing, deny-by-default evaluation, tamper rejection, and the honest capability board.",
        "operationId": "getIrongateProductPage",
        "responses": {
          "200": {
            "description": "IRONGATE product page",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/products/irongate/README.md": {
      "get": {
        "tags": [
          "Capability Control Plane"
        ],
        "summary": "Download the IRONGATE public kit",
        "description": "Public kit with the authorization model, demo summary, and real-today versus roadmap maturity split.",
        "operationId": "downloadIrongateReadme",
        "responses": {
          "200": {
            "description": "IRONGATE public kit README",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/products/irongate/PRODUCT_SHEET.md": {
      "get": {
        "tags": [
          "Capability Control Plane"
        ],
        "summary": "Download the IRONGATE buyer one-pager",
        "description": "Buyer-facing one-pager for regulated teams evaluating IRONGATE as a verifiable authorization checkpoint for AI agents.",
        "operationId": "downloadIrongateProductSheet",
        "responses": {
          "200": {
            "description": "IRONGATE product sheet",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    },
    "/products/irongate/demo_output.txt": {
      "get": {
        "tags": [
          "Capability Control Plane"
        ],
        "summary": "Download the IRONGATE demo transcript",
        "description": "Transcript from the local demo showing deny-by-default, allow-with-Bridge-auth, tamper rejection, and the honest capability board.",
        "operationId": "downloadIrongateDemoTranscript",
        "responses": {
          "200": {
            "description": "IRONGATE demo transcript",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/PublicClientError"
          }
        }
      }
    }
  },
  "x-article11-capability-control-plane": {
    "product_name": "IRONGATE",
    "maturity": "irongate_public_launch",
    "bridge_auth": "live_and_proven",
    "node_approval_quorum": "roadmap",
    "dissent_channel": "roadmap",
    "runtime_enforcement": "roadmap",
    "enforcement_model": "orchestrator_invoked_checkpoint_today",
    "publish_rule": "PUBLIC_CLAIM_CHANGE requires Bridge authorization before IRONGATE public claims or structural proof-surface changes go live",
    "honesty_note": "This OpenAPI file advertises live verification endpoints and IRONGATE discovery; it does not claim full multi-party cryptographic co-signing."
  },
  "components": {
    "schemas": {
      "AgentRulesSummary": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "article_id",
          "title",
          "heading",
          "part",
          "spine",
          "citation_url",
          "read_url",
          "text_sha256",
          "text_bytes"
        ],
        "properties": {
          "article_id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "heading": {
            "type": "string"
          },
          "part": {
            "type": "string"
          },
          "spine": {
            "type": "boolean"
          },
          "citation_url": {
            "type": "string",
            "format": "uri"
          },
          "read_url": {
            "type": "string",
            "format": "uri"
          },
          "text_sha256": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "text_bytes": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "AgentRulesArticle": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "article_id",
          "title",
          "heading",
          "part",
          "spine",
          "citation_url",
          "read_url",
          "text_sha256",
          "text_bytes",
          "text",
          "text_scope",
          "source_locator"
        ],
        "properties": {
          "article_id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "heading": {
            "type": "string"
          },
          "part": {
            "type": "string"
          },
          "spine": {
            "type": "boolean"
          },
          "citation_url": {
            "type": "string",
            "format": "uri"
          },
          "read_url": {
            "type": "string",
            "format": "uri"
          },
          "text_sha256": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "text_bytes": {
            "type": "integer",
            "minimum": 0
          },
          "text": {
            "type": "string"
          },
          "text_scope": {
            "const": "Exact article body; heading and surrounding context are separate."
          },
          "source_locator": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "url",
              "byte_offset",
              "byte_length",
              "basis"
            ],
            "properties": {
              "url": {
                "type": "string",
                "format": "uri"
              },
              "byte_offset": {
                "type": "integer",
                "minimum": 0
              },
              "byte_length": {
                "type": "integer",
                "minimum": 0
              },
              "basis": {
                "const": "Zero-based UTF-8 byte range in the exact Core file"
              }
            }
          },
          "relevance_score": {
            "type": "number",
            "description": "Present only in keyword results; ranking is not confidence or truth."
          },
          "relevance_scope": {
            "const": "Keyword ranking, not confidence or truth"
          }
        }
      },
      "AgentRulesError": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schema",
          "status",
          "error",
          "links"
        ],
        "properties": {
          "schema": {
            "const": "article11.agent-rules.v1"
          },
          "status": {
            "const": "error"
          },
          "links": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "error": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "code",
              "detail"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "METHOD_NOT_ALLOWED",
                  "INVALID_PARAMETERS",
                  "AMBIGUOUS_LOOKUP",
                  "INVALID_PAGE",
                  "ARTICLE_PAGINATION",
                  "INVALID_ARTICLE",
                  "INVALID_QUERY"
                ]
              },
              "detail": {
                "type": "string"
              }
            }
          }
        }
      },
      "AgentRulesResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schema",
          "mode",
          "source",
          "constitution_published",
          "operation",
          "interpretation",
          "decline",
          "links",
          "status",
          "total",
          "results"
        ],
        "properties": {
          "schema": {
            "const": "article11.agent-rules.v1"
          },
          "mode": {
            "enum": [
              "index",
              "article",
              "keyword"
            ]
          },
          "status": {
            "enum": [
              "index",
              "found",
              "not_found",
              "results",
              "no_match",
              "page_empty"
            ]
          },
          "source": {
            "type": "object",
            "description": "Bundled publication snapshot with Core and Ask-index URLs, exact hashes and byte counts, article/spine counts and build binding; not fetched afresh per request.",
            "additionalProperties": true
          },
          "constitution_published": {
            "type": "object",
            "description": "Current published-document descriptor; runtime migration remains separately scoped.",
            "additionalProperties": true
          },
          "operation": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "method",
              "model_invoked",
              "private_memory_accessed",
              "memory_written",
              "registers_participant",
              "assent_recorded",
              "authority_granted"
            ],
            "properties": {
              "method": {
                "const": "read_only"
              },
              "model_invoked": {
                "const": false
              },
              "private_memory_accessed": {
                "const": false
              },
              "memory_written": {
                "const": false
              },
              "registers_participant": {
                "const": false
              },
              "assent_recorded": {
                "const": false
              },
              "authority_granted": {
                "const": false
              }
            }
          },
          "interpretation": {
            "type": "string"
          },
          "decline": {
            "type": "string"
          },
          "links": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "total": {
            "type": "integer",
            "minimum": 0,
            "maximum": 47
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 47
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10
          },
          "has_more": {
            "type": "boolean"
          },
          "next_offset": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 47
          },
          "article_id": {
            "type": "string"
          },
          "query": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "matching": {
            "const": "Deterministic BM25 keyword search; no semantic model or generated interpretation."
          },
          "results": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/AgentRulesSummary"
                },
                {
                  "$ref": "#/components/schemas/AgentRulesArticle"
                }
              ]
            }
          },
          "note": {
            "type": "string"
          },
          "examples": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "first_use": {
            "type": "string"
          }
        }
      },
      "IronledgerVerify": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          },
          "verdict": {
            "type": "string"
          },
          "canonical_spine_valid": {
            "type": "boolean"
          },
          "strict_table_valid": {
            "type": "boolean"
          },
          "strict_table_break_at_block": {
            "type": [
              "integer",
              "null"
            ]
          },
          "warning": {
            "type": [
              "string",
              "null"
            ]
          },
          "valid": {
            "type": "boolean",
            "deprecated": true
          },
          "valid_scope": {
            "type": [
              "string",
              "null"
            ]
          },
          "valid_deprecated": {
            "type": [
              "boolean",
              "null"
            ]
          }
        },
        "additionalProperties": true
      },
      "StrictTable": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "canonical_spine_valid": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "strict_table_valid": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "breaks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "ChainStatus": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          },
          "day": {
            "type": [
              "integer",
              "string",
              "null"
            ]
          },
          "head": {
            "type": [
              "string",
              "object",
              "null"
            ]
          },
          "genesis": {
            "type": [
              "string",
              "object",
              "null"
            ]
          },
          "canonical_spine_valid": {
            "type": [
              "boolean",
              "null"
            ]
          }
        },
        "additionalProperties": true
      }
    },
    "responses": {
      "PublicClientError": {
        "description": "Public client error response",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "error": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          }
        }
      }
    }
  },
  "security": []
}
