{
  "run_id": "happy520ai--gateway-price-check-claude-haiku-5-5-1792969566186927729",
  "checker": {
    "claims": [
      {
        "claim": "CLI reads an OpenAI-compatible endpoint's price disclosure without a key",
        "command": "node src/cli.mjs --url https://openrouter.ai/api/v1 --name OpenRouter",
        "evidence": "467/467 | 317 | 0 | 467 | 467/467 \u6761\u516c\u5e03\u4ef7\u683c\uff08100%\uff09 \u00b7 \u542b\u7f13\u5b58\u4ef7 \u00b7 \u542b\u4e0a\u6e38\u4ed3\u5e93\u6807\u8bc6 |\n\n\u5224\u8bcd\u53ea\u56de\u7b54\"\u514d\u767b\u5f55\u65f6\u516c\u5e03\u4e86\u4ec0\u4e48\"\uff0c\u4e0d\u56de\u7b54\"\u7ed9\u7684\u662f\u4e0d\u662f\u771f\u6743\u91cd\"\u3002\n\u63a2\u6d4b OpenRouter \u2026 [\u6309 OpenAI \u517c\u5bb9\u7ea6\u5b9a\u8865\u5168\u4e3a https://openrouter.ai/api/v1/models] YES (169ms)\n",
        "expected": "table with OpenRouter 467/467 priced models",
        "input": "--url https://openrouter.ai/api/v1 --name OpenRouter",
        "kind": "claim",
        "outcome": "Real input produced the expected result: 467/467",
        "returncode": 0,
        "source": "node src/cli.mjs --url https://your-gateway.example/v1 --name mine",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "MCP tool check_price_disclosure performs one unauthenticated GET and returns the verdict",
        "command": "node src/mcp-server.mjs tools/call {\"tool\": \"check_price_disclosure\", \"arguments\": {\"url\": \"https://openrouter.ai/api/v1\", \"name\": \"OpenRouter\"}}",
        "evidence": "467/467 \u6761\u516c\u5e03\u4ef7\u683c\uff08100%\uff09 \u00b7 \u542b\u7f13\u5b58\u4ef7 \u00b7 \u542b\u4e0a\u6e38\u4ed3\u5e93\u6807\u8bc6\"}], \"structuredContent\": {\"as_of\": \"2026-10-25\", \"as_of_tz\": \"UTC+00:00\", \"note\": \"\u5168\u90e8\u4e3a\u65e0\u9274\u6743 GET\uff1b\u672c\u5de5\u5177\u4e0d\u53d1\u9001\u4efb\u4f55\u5bf9\u8bdd\u8bf7\u6c42\uff0c\u56e0\u6b64\u4e0d\u8bc4\u4f30\u6a21\u578b\u4fdd\u771f\u5ea6\u3002\", \"reading\": {\"name\": \"OpenRouter\", \"url\": \"https://openrouter.ai/api/v1/models\", \"ms\": 158, \"level\": \"YES\", \"verdict\": \"467/467 \u6761\u516c\u5e03\u4ef7\u683c\uff08100%\uff09 \u00b7 \u542b\u7f13\u5b58\u4ef7 \u00b7 \u542b\u4e0a\u6e38\u4ed3\u5e93\u6807\u8bc6\", \"total\": 467, \"listShape\": false, \"inputPriced\": 467, \"anyPriced\": 467, \"hasPricing\": 467, \"cache\": 317, \"currency\": 0, \"upstream\": 467, \"pricedButUnparsed\": 0, \"unrecognizedKeys\": []}}, \"isError\": false}",
        "expected": "verdict table with 467/467 priced",
        "input": "{\"tool\": \"check_price_disclosure\", \"arguments\": {\"url\": \"https://openrouter.ai/api/v1\", \"name\": \"OpenRouter\"}}",
        "kind": "claim",
        "outcome": "Real input produced the expected result: 467/467",
        "source": "`check_price_disclosure(url, name?)`",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "Entry points inspected: src/cli.mjs (one-shot CLI, exits after printing), src/mcp-server.mjs (stdio server, answers requests only), package.json scripts (check/test/prepublishOnly). No cron, loop, setInterval, --once/--now or webhook in src/ or scripts/. The daily reading runs only from a GitHub Actions schedule (.github/workflows/daily.yml), which is CI and not a product cycle. Not triggered.",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "Entry points inspected: src/cli.mjs (one-shot CLI, exits after printing), src/mcp-server.mjs (stdio server, answers requests only), package.json scripts (check/test/prepublishOnly). No cron, loop, setInterval, --once/--now or webhook in src/ or scripts/. The daily reading runs only from a GitHub Actions schedule (.github/workflows/daily.yml), which is CI and not a product cycle. Not triggered.",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "node",
        "src/mcp-server.mjs"
      ],
      "kind": "mcp",
      "scope": "product operation",
      "serverInfo": {
        "name": "gateway-price-check",
        "version": "0.5.8"
      },
      "tool_result": {
        "content": [
          {
            "text": "OpenRouter -> YES\uff1a467/467 \u6761\u516c\u5e03\u4ef7\u683c\uff08100%\uff09 \u00b7 \u542b\u7f13\u5b58\u4ef7 \u00b7 \u542b\u4e0a\u6e38\u4ed3\u5e93\u6807\u8bc6",
            "type": "text"
          }
        ],
        "isError": false,
        "structuredContent": {
          "as_of": "2026-10-25",
          "as_of_tz": "UTC+00:00",
          "note": "\u5168\u90e8\u4e3a\u65e0\u9274\u6743 GET\uff1b\u672c\u5de5\u5177\u4e0d\u53d1\u9001\u4efb\u4f55\u5bf9\u8bdd\u8bf7\u6c42\uff0c\u56e0\u6b64\u4e0d\u8bc4\u4f30\u6a21\u578b\u4fdd\u771f\u5ea6\u3002",
          "reading": {
            "anyPriced": 467,
            "cache": 317,
            "currency": 0,
            "hasPricing": 467,
            "inputPriced": 467,
            "level": "YES",
            "listShape": false,
            "ms": 169,
            "name": "OpenRouter",
            "pricedButUnparsed": 0,
            "total": 467,
            "unrecognizedKeys": [],
            "upstream": 467,
            "url": "https://openrouter.ai/api/v1/models",
            "verdict": "467/467 \u6761\u516c\u5e03\u4ef7\u683c\uff08100%\uff09 \u00b7 \u542b\u7f13\u5b58\u4ef7 \u00b7 \u542b\u4e0a\u6e38\u4ed3\u5e93\u6807\u8bc6"
          }
        }
      },
      "tool_result_checked": true,
      "tool_schema_bytes": 1049,
      "tools": [
        "check_price_disclosure",
        "latest_archive_readings"
      ],
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "CLI reads a public endpoint and reports the price disclosure verdict",
        "command": "node src/cli.mjs --url https://openrouter.ai/api/v1 --name OpenRouter",
        "deferred": false,
        "evidence": "| \u670d\u52a1\u5546 | \u6a21\u578b\u6570 | \u516c\u5e03\u4ef7\u683c | \u542b\u7f13\u5b58\u4ef7 | \u663e\u5f0f\u5e01\u79cd | \u4e0a\u6e38\u6807\u8bc6 | \u5224\u8bcd |\n|---|---|---|---|---|---|---|\n| OpenRouter | 467 | 467/467 | 317 | 0 | 467 | 467/467 \u6761\u516c\u5e03\u4ef7\u683c\uff08100%\uff09 \u00b7 \u542b\u7f13\u5b58\u4ef7 \u00b7 \u542b\u4e0a\u6e38\u4ed3\u5e93\u6807\u8bc6 |\n\n\u5224\u8bcd\u53ea\u56de\u7b54\"\u514d\u767b\u5f55\u65f6\u516c\u5e03\u4e86\u4ec0\u4e48\"\uff0c\u4e0d\u56de\u7b54\"\u7ed9\u7684\u662f\u4e0d\u662f\u771f\u6743\u91cd\"\u3002\n\u63a2\u6d4b OpenRouter \u2026 [\u6309 OpenAI \u517c\u5bb9\u7ea6\u5b9a\u8865\u5168\u4e3a https://openrouter.ai/api/v1/models] YES (169ms)",
        "expected": "OpenRouter row with 467/467 priced models",
        "input": "--url https://openrouter.ai/api/v1 --name OpenRouter",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md: \u4e00\u6761\u547d\u4ee4\u76f4\u63a5\u8dd1 / node src/cli.mjs --url",
        "verdict": "yes"
      },
      {
        "claim": "CLI reports an endpoint that requires a key as AUTH, not as a price disclosure",
        "command": "node src/cli.mjs --url https://api.openai.com/v1 --name OpenAI",
        "deferred": false,
        "evidence": "| \u670d\u52a1\u5546 | \u6a21\u578b\u6570 | \u516c\u5e03\u4ef7\u683c | \u542b\u7f13\u5b58\u4ef7 | \u663e\u5f0f\u5e01\u79cd | \u4e0a\u6e38\u6807\u8bc6 | \u5224\u8bcd |\n|---|---|---|---|---|---|---|\n| OpenAI | \u2014 | \u2014 | \u2014 | \u2014 | \u2014 | \u9700\u8981 key \u624d\u80fd\u8bfb\u6e05\u5355\uff08HTTP 401\uff09\u2014\u2014\u5bf9\"\u514d\u767b\u5f55\u53ef\u89c1\u4ef7\u683c\"\u8fd9\u4e2a\u95ee\u9898\uff0c\u8fd9\u5c31\u662f\u5426 |\n\n\u5224\u8bcd\u53ea\u56de\u7b54\"\u514d\u767b\u5f55\u65f6\u516c\u5e03\u4e86\u4ec0\u4e48\"\uff0c\u4e0d\u56de\u7b54\"\u7ed9\u7684\u662f\u4e0d\u662f\u771f\u6743\u91cd\"\u3002\n\u63a2\u6d4b OpenAI \u2026 [\u6309 OpenAI \u517c\u5bb9\u7ea6\u5b9a\u8865\u5168\u4e3a https://api.openai.com/v1/models] AUTH (254ms)",
        "expected": "401 reported, verdict AUTH",
        "input": "--url https://api.openai.com/v1 --name OpenAI",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md: AUTH \u4e0d\u6ce8\u518c\u8fde\u6e05\u5355\u90fd\u770b\u4e0d\u5230\uff08401\uff09",
        "verdict": "yes"
      },
      {
        "claim": "documented self-test suite",
        "command": "node --test",
        "deferred": false,
        "evidence": "ype: 'test'\n  ...\n# Subtest: \u56fe\u4f8b\u4e09\u6863\u5bb6\u6570=\u6309 level \u805a\u5408\uff0c\u4e14\u4e09\u6863\u4e4b\u548c\u7b49\u4e8e\u603b\u5bb6\u6570\nok 43 - \u56fe\u4f8b\u4e09\u6863\u5bb6\u6570=\u6309 level \u805a\u5408\uff0c\u4e14\u4e09\u6863\u4e4b\u548c\u7b49\u4e8e\u603b\u5bb6\u6570\n  ---\n  duration_ms: 0.163187\n  type: 'test'\n  ...\n# Subtest: \u6587\u672c\u5143\u7d20\u603b\u6570 = 2+2N+3+2\uff08\u6f0f\u4e00\u5bb6\u5c31\u4f1a\u7ea2\uff09\nok 44 - \u6587\u672c\u5143\u7d20\u603b\u6570 = 2+2N+3+2\uff08\u6f0f\u4e00\u5bb6\u5c31\u4f1a\u7ea2\uff09\n  ---\n  duration_ms: 0.118142\n  type: 'test'\n  ...\n# Subtest: \u5047\u9776\uff1a\u8bfb\u6570\u4e0d\u8db3 5 \u884c\u65f6\u62d2\u7edd\u51fa\u56fe\uff0c\u4e14\u4e0d\u7559\u65e7\u6587\u4ef6\nok 45 - \u5047\u9776\uff1a\u8bfb\u6570\u4e0d\u8db3 5 \u884c\u65f6\u62d2\u7edd\u51fa\u56fe\uff0c\u4e14\u4e0d\u7559\u65e7\u6587\u4ef6\n  ---\n  duration_ms: 86.043289\n  type: 'test'\n  ...\n# Subtest: \u5047\u9776\uff1a\u670d\u52a1\u5546\u540d\u8d85\u51fa\u540d\u79f0\u5217\u65f6\u62d2\u7edd\u51fa\u56fe\nok 46 - \u5047\u9776\uff1a\u670d\u52a1\u5546\u540d\u8d85\u51fa\u540d\u79f0\u5217\u65f6\u62d2\u7edd\u51fa\u56fe\n  ---\n  duration_ms: 87.53321\n  type: 'test'\n  ...\n1..46\n# tests 46\n# suites 0\n# pass 45\n# fail 0\n# cancelled 0\n# skipped 1\n# todo 0\n# duration_ms 4415.207368",
        "expected": "no failing tests",
        "input": "none",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md: ## \u81ea\u6d4b / node --test",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "diagnosis": null
}
