{
  "openapi": "3.1.0",
  "info": {
    "title": "FragGate",
    "version": "0.1.0",
    "summary": "Dual surface: human Worker UI + agent MCP/OpenAPI. Same four ops: list, describe, call, verify. Not a second kernel.",
    "description": "FragGate FG-0.1 door. Human buttons on this Worker call /v1/fraggate/*. MCP tools fraggate_list / fraggate_describe / fraggate_verify / fraggate_call map to those same routes (proxied to https://aziel-runtime.vibelock.workers.dev). Canonical agent path: POST https://aziel-runtime.vibelock.workers.dev/mcp and https://aziel-runtime.vibelock.workers.dev/v1/fraggate/*. Author Aziel Eliab. Apache-2.0.",
    "license": {
      "name": "Apache-2.0",
      "identifier": "Apache-2.0"
    },
    "contact": {
      "name": "Aziel Eliab",
      "url": "https://github.com/AzielEliab/fraggate"
    }
  },
  "servers": [
    {
      "url": "https://fraggate-download-tracker.vibelock.workers.dev",
      "description": "This Worker (human UI + OpenAPI/MCP doubles)"
    },
    {
      "url": "https://aziel-runtime.vibelock.workers.dev",
      "description": "aziel-runtime FragGate door (canonical agent path)"
    }
  ],
  "paths": {
    "/v1/health": {
      "get": {
        "operationId": "fraggate_health",
        "summary": "Liveness. Does not increment downloads.",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      }
    },
    "/v1/skill": {
      "get": {
        "operationId": "fraggate_skill",
        "summary": "Skill markdown for assistants. Dual-surface law.",
        "responses": {
          "200": {
            "description": "markdown"
          }
        }
      }
    },
    "/v1/example": {
      "get": {
        "operationId": "fraggate_example",
        "summary": "Sample List/Describe/Call/Verify payloads.",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      }
    },
    "/v1/fraggate": {
      "get": {
        "operationId": "fraggate_summary",
        "summary": "Door summary (registry digest, live/stub counts). Same as catalog GET /v1/fraggate.",
        "responses": {
          "200": {
            "description": "summary"
          }
        }
      }
    },
    "/v1/fraggate/list": {
      "get": {
        "operationId": "fraggate_list",
        "summary": "List hashed registry / LIVE ops. Same as the human List button and MCP fraggate_list.",
        "responses": {
          "200": {
            "description": "registry"
          }
        }
      }
    },
    "/v1/fraggate/describe": {
      "get": {
        "operationId": "fraggate_describe",
        "summary": "Describe one name. Same as the human Describe button and MCP fraggate_describe.",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "entry"
          }
        }
      }
    },
    "/v1/fraggate/verify": {
      "post": {
        "operationId": "fraggate_verify",
        "summary": "Verify a name or digest. Same as the human Verify button and MCP fraggate_verify.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "slug": {
                    "type": "string"
                  },
                  "digest": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "slug": "decisiongate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "verify"
          }
        }
      }
    },
    "/v1/fraggate/call": {
      "post": {
        "operationId": "fraggate_call",
        "summary": "CallEnvelope → DecisionGATE → handler or refuse. Same as the human Call button and MCP fraggate_call.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "slug": {
                    "type": "string"
                  },
                  "op": {
                    "type": "string"
                  },
                  "payload": {
                    "type": "object"
                  },
                  "claim": {
                    "type": "object"
                  }
                },
                "required": [
                  "op"
                ]
              },
              "example": {
                "slug": "decisiongate",
                "op": "health",
                "payload": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "result or typed refuse (FG-HALLUC-TOOL, FG-GATE, FG-STUB, …)"
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "fraggate_mcp",
        "summary": "JSON-RPC MCP. Tools: runtime_skill, fraggate_list, fraggate_describe, fraggate_verify, fraggate_call. Canonical catalog MCP remains POST https://aziel-runtime.vibelock.workers.dev/mcp.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC"
          }
        }
      }
    }
  }
}