{
  "bridgeBaseUrlPolicy": {
    "mustReachExactRuntimeContact": true,
    "reject": [
      "127.0.0.1",
      "localhost",
      "E:Voice account website",
      "setup-code issuer URL",
      "general Emergence website/build server URL",
      "URLs for another runtime/contact"
    ]
  },
  "channelModel": "current-only",
  "connectionDoctrine": {
    "advancedAlternative": "user-owned public HTTPS reverse proxy",
    "emergenceRelayAvailable": false,
    "localTestOnly": "same Wi-Fi/LAN",
    "normalTraffic": "direct phone-to-runtime through the user's chosen connection path",
    "recommendedDefault": "Tailscale/private network",
    "stopBeforeConsumeWhen": "no verified bridgeBaseUrl reaches this exact runtime/contact from the user's phone"
  },
  "consume": {
    "errorCodes": {
      "expired_setup_code": "The code passed its expiry. Request a fresh code.",
      "invalid_setup_code": "The code does not exist, was revoked, or was already used. Request a fresh code.",
      "unsupported_runtime_kind": "The account service cannot pair this runtime. The setup code was NOT consumed and stays valid; do not request a new one."
    },
    "jsonFields": [
      "setupCode",
      "bridgeBaseUrl",
      "runtimeKind"
    ],
    "method": "POST",
    "url": "https://www.emergencerising.com/api/v1/evoice/bridge/bootstrap/consume"
  },
  "current": {
    "manifestUrl": "https://www.emergencerising.com/evoice/plugins/grok-bot/evoice-bridge-plugin/current.json",
    "packageSha256": "a086db966f075b618d6606a39439234a3108e22edc88554e9964b8913ac1f242",
    "packageSizeBytes": 29573,
    "packageUrl": "https://www.emergencerising.com/evoice/plugins/grok-bot/evoice-bridge-plugin/v0.1.2/evoice-grok-bot-bridge-plugin-v0.1.2.zip",
    "version": "0.1.2"
  },
  "currentManifestUrl": "https://www.emergencerising.com/evoice/plugins/grok-bot/evoice-bridge-plugin/current.json",
  "expectedHealth": {
    "compatibilityPath": "/plugins/evoice-gateway/health",
    "method": "GET",
    "path": "/plugins/evoice-bridge/health",
    "type": "http"
  },
  "installDocs": {
    "source": "README.md inside the package archive",
    "steps": [
      "Fetch currentManifestUrl first and treat its version, packageUrl, and packageSha256 as authoritative.",
      "Download packageUrl, verify packageSha256, extract it, and read README.md before changing runtime state.",
      "Install or update the packaged Grok Bot adapter on the user-owned machine that hosts the Grok Bot shop. This adapter is the PC twin; do not wrap the Cursor CLI.",
      "Preserve runtime configuration, pairing state, and bridge tokens during repair.",
      "Bind the adapter on the machine's Tailscale interface. The published Grok Bot default port is 8794.",
      "Run the runtime preflight (GET /api/v1/evoice/bridge/runtimes, or the adapter's /plugins/evoice-bridge/preflight) and confirm GROK_BOT is listed before a setup code is ever sent.",
      "Verify GET /plugins/evoice-bridge/health on the phone-reachable Tailscale bridge URL before consuming the setup code.",
      "Account-issued evs_ codes are consumed against the E:Voice account service with runtimeKind GROK_BOT and never bind locally."
    ]
  },
  "installedVersionCheck": {
    "compareInstalledVersionTo": "currentManifestUrl.version",
    "inspect": [
      "evoice_grok_bot_bridge_adapter.py",
      "plugin.yaml",
      "SOURCE_PROVENANCE.md",
      "runtime health/status/version output when available"
    ],
    "repairWhen": [
      "installed version missing",
      "installed version unknown",
      "installed version older than current manifest version",
      "source provenance differs from the current manifest package"
    ],
    "requiredBeforeSetupCodeConsume": true
  },
  "latestManifestAliasUrl": "https://www.emergencerising.com/evoice/plugins/grok-bot/evoice-bridge-plugin/latest.json",
  "manifestUrl": "https://www.emergencerising.com/evoice/plugins/grok-bot/evoice-bridge-plugin/current.json",
  "missingPackageFiles": [],
  "packageSha256": "62417419bd469228c1c54c5177c46d7118bbd857c2d3e0f33907ade4b70c6464",
  "packageSizeBytes": 33528,
  "packageUrl": "https://www.emergencerising.com/evoice/plugins/grok-bot/evoice-bridge-plugin/v0.1.3/evoice-grok-bot-bridge-plugin-v0.1.3.zip",
  "pairingContractSha256": "84823229d83d7a99427f3f64253f274b578c57a58ddeb93235b8d2971df88d35",
  "pairingContractUrl": "https://www.emergencerising.com/evoice/plugins/contracts/pairing/grok-bot/current.json",
  "pairingContractVersion": "1.0.4",
  "pairingContractVersionedUrl": "https://www.emergencerising.com/evoice/plugins/contracts/pairing/v1.0.4/grok-bot.json",
  "previousPublicVersion": "0.1.2",
  "privatePathLeakCount": 0,
  "privatePathLeaks": [],
  "releaseChannel": "current",
  "requiredArchiveMembers": [
    "README.md",
    "SOURCE_PROVENANCE.md",
    "evoice_grok_bot_bridge_adapter.py",
    "evoice_grok_webhook.py",
    "plugin.yaml",
    "scripts/install_evoice_grok_bot_bridge.sh"
  ],
  "runtime": "grok-bot",
  "runtimeDisplayName": "Grok Bot",
  "runtimeKind": "GROK_BOT",
  "runtimePreflight": {
    "adapterPath": "/plugins/evoice-bridge/preflight",
    "expectRuntimeKind": "GROK_BOT",
    "method": "GET",
    "onMissingRoute": "treat as unknown and consume anyway",
    "requiredBeforeSetupCodeConsume": true,
    "schema": "com.emergencerising.evoice.bridge-runtimes.v1",
    "url": "https://www.emergencerising.com/api/v1/evoice/bridge/runtimes"
  },
  "schema": "com.emergencerising.evoice.external-runtime-plugin.v1",
  "setupCodeGate": {
    "downloadRequiresAccountLogin": false,
    "pairingRequiresSetupCode": true,
    "setupCodeProperties": [
      "expiring",
      "single-use",
      "high-entropy",
      "hashed-at-rest"
    ]
  },
  "statePreservation": [
    "pairing state",
    "bridge tokens",
    "device/session state",
    "user runtime config"
  ],
  "status": "ready",
  "version": "0.1.3",
  "versionBumpRequired": true,
  "versionMetadata": {
    "files": [
      {
        "file": "evoice_grok_bot_bridge_adapter.py",
        "status": "ready",
        "version": "0.1.3"
      },
      {
        "file": "plugin.yaml",
        "status": "ready",
        "version": "0.1.3"
      }
    ],
    "status": "ready"
  }
}
