{
  "checker": {
    "details": {
      "argv": [
        "/tmp/uiprotect-venv/bin/uiprotect",
        "-a",
        "127.0.0.1",
        "decode-ws-msg",
        "AQEBAAAAAHR4nB2MWwqDMBBFtyLz3YAmkzDpDorfLmCSGUFotfigFHHvknyee7jnBM77tMzwbOD4Cu8KjwZm/Q0VXlJEsIqx88mQxWDQ52jIiRgZO6eOOSKncvssou9e/zW26Vq2qRYw+7F1TJmSILGQtiFY8nDdlRMkmAIBAQAAAAEkeJyFkc1uwjAQhF8FRT2hHOz4Jz8P0HMv7aXisLbXwcJJkB1AqOq7NwSoCm3xxbJG34x3xx9ZG4bdNmbN4j2TVDErNCe0FlAShiUh06mzVb7IwPsXDJ2L0Q39mfduj3uHh2bZGCmU4lRTbiRAXSgLHKSh2eT8gfFaKSUIEbzgQAwTVBSypHCHqaLSrLK0KIiVijPLakaMtfdYXU0jC8agKhEkq6dHDWfVCev3oQkIplnemPSkjXiSdhHPRH4IbsTcoMcRm6er+UadQ+amLgn5b+fyO/UxEvUazc5jAvPYgj6+Pr/9MeQMqOBMm0rR0GGAf6FZ6dA4uAjz/dpZux5Tu2Afh9TCZhiCH/QmgZ3+J1mecXHr4Zjaeu26h82sPr8AeQX7wQ=="
      ],
      "kind": "cli",
      "needs_browser": false,
      "needs_credentials": false,
      "returncode": 0,
      "scope": "product operation",
      "stderr": "",
      "stdout": "{\"action\":{\"action\":\"update\",\"newUpdateId\":\"62e4915b-8246-45c9-83dd-df13e3aa94ab\",\"modelKey\":\"user\",\"id\":\"4c5f03a8c8bd48ad8e066285\"},\"data\":{\"groups\":[\"61b3f5c40195a703e70003ec\"],\"allPermissions\":[\"liveview:*:d65bb41c14d6aa92bfa4a6d1\",\"liveview:*:49bbb5005424a0d35152671a\",\"liveview:*:b28c38f1220f6b43f3930dff\",\"liveview:*:b9861b533a87ea639fa4d438\",\"nvr:read:*\",\"liveview:create\",\"user:read,write,delete:$\",\"nvr:write,delete:*\",\"group:create,read,write,delete:*\",\"user:create,read,write,delete:*\",\"schedule:create,read,write,delete:*\",\"legacyUFV:read,write,delete:*\",\"bridge:create,read,write,delete:*\",\"camera:create,read,write,delete,readmedia,deletemedia:*\",\"light:create,read,write,delete:*\",\"sensor:create,read,write,delete:*\",\"doorlock:create,read,write,delete:*\",\"viewer:create,read,write,delete:*\",\"display:create,read,write,delete:*\",\"chime:create,read,write,delete:*\"]}}",
      "working": true
    },
    "status": "PASS"
  },
  "deviations": [
    "python3 -m venv failed with no ensurepip; ran apt-get install python3-venv python3-pip, then recreated the venv.",
    "decode-ws-msg is documented in docs/cli.md, not README.md; used it because the README has no offline operation. Its top-level --address is required by typer but unused by this command, so a dummy 127.0.0.1 is passed.",
    "Probe argv contains the sample base64 frame inline instead of a file path, because file-based inputs are rejected by the checker."
  ],
  "main_blocker": null,
  "operation": "uiprotect decode-ws-msg on a recorded base64 Protect websocket frame from tests/sample_data/sample_ws_messages.json; prints decoded action and data JSON",
  "operation_scope": "Offline decode only. Live console operations (cameras list-ids, nvr, etc.) need a UniFi Protect console, API key or local user, which this VM does not have, so they were not exercised.",
  "outcome": "working",
  "steps": [
    "Read README.md (Installation > From GitHub/PyPI, Quickstart > CLI).",
    "apt-get install -y python3-venv python3-pip (ensurepip missing for python3 -m venv).",
    "python3 -m venv /tmp/uiprotect-venv",
    "/tmp/uiprotect-venv/bin/pip install \"<host-path>\" (the README's pip install \"uiprotect[cli]\" from the pinned checkout).",
    "uiprotect --help (verified CLI entry point).",
    "uiprotect -a 127.0.0.1 decode-ws-msg <base64> (docs/cli.md command table) on a sample frame; exit 0 and decoded JSON printed."
  ],
  "stuck_step": null,
  "suggested_fix": null
}
