{
  "file": "F29-app-backend-bridge.md",
  "bullet": "Handshake rejections (`F29.ws-handshake-rejections`).",
  "ids": [
    "F29.ws-handshake-rejections"
  ],
  "line": 678,
  "script": "control-agent-server ws listen <redacted:session-cookie>/ws --auth none --header \"Cookie: oh_app_backend_session=$TOKEN\" \\\n  --duration 5 --expect-reject 403 --save F29.ws-handshake-rejections/no-origin\ncontrol-agent-server ws listen <redacted:session-cookie>/ws --auth none --header 'Origin: http://localhost:3000' \\\n  --header \"Cookie: oh_app_backend_session=$TOKEN\" --duration 5 --expect-reject 403 --save F29.ws-handshake-rejections/control-origin\ncontrol-agent-server ws listen <redacted:session-cookie>/ws --auth none --header \"Origin: $S\" --duration 5 --expect-reject 403\ncontrol-agent-server ws listen <redacted:session-cookie>/ws --auth none --header \"Origin: $S\" \\\n  --header 'Cookie: oh_app_backend_session=qa-f29-bogus' --duration 5 --expect-reject 403\ncontrol-agent-server ws listen <redacted:session-cookie>/ws --auth none --header \"Origin: $S\" \\\n  --header \"Cookie: oh_app_backend_session=$T2\" --duration 5 --expect-reject 403 --save F29.ws-handshake-rejections/other-app\ncontrol-agent-server ws listen <redacted:session-cookie>/ws --auth header --header \"Origin: $S\" --duration 5 --expect-reject 403\ncontrol-agent-server ws listen <redacted:session-cookie>/ws --auth query --header \"Origin: $S\" --duration 5 --expect-reject 403\n",
  "exit_code": 0,
  "elapsed_ms": 15677,
  "failed_line": null,
  "failed_command": null,
  "stdout": "{\n  \"ok\": true,\n  \"path\": \"<redacted:session-cookie>/ws\",\n  \"opened\": false,\n  \"frames\": 0,\n  \"kinds\": {},\n  \"stopped\": \"error\",\n  \"close\": {\n    \"error\": \"InvalidStatus: server rejected WebSocket connection: HTTP 403\",\n    \"http_status\": 403\n  },\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-021747-0b62-map-f29/evidence/F29.ws-handshake-rejections/no-origin.json\",\n  \"first_frames\": []\n}\n{\n  \"ok\": true,\n  \"path\": \"<redacted:session-cookie>/ws\",\n  \"opened\": false,\n  \"frames\": 0,\n  \"kinds\": {},\n  \"stopped\": \"error\",\n  \"close\": {\n    \"error\": \"InvalidStatus: server rejected WebSocket connection: HTTP 403\",\n    \"http_status\": 403\n  },\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-021747-0b62-map-f29/evidence/F29.ws-handshake-rejections/control-origin.json\",\n  \"first_frames\": []\n}\n{\n  \"ok\": true,\n  \"path\": \"<redacted:session-cookie>/ws\",\n  \"opened\": false,\n  \"frames\": 0,\n  \"kinds\": {},\n  \"stopped\": \"error\",\n  \"close\": {\n    \"error\": \"InvalidStatus: server rejected WebSocket connection: HTTP 403\",\n    \"http_status\": 403\n  },\n  \"first_frames\": []\n}\n{\n  \"ok\": true,\n  \"path\": \"<redacted:session-cookie>/ws\",\n  \"opened\": false,\n  \"frames\": 0,\n  \"kinds\": {},\n  \"stopped\": \"error\",\n  \"close\": {\n    \"error\": \"InvalidStatus: server rejected WebSocket connection: HTTP 403\",\n    \"http_status\": 403\n  },\n  \"first_frames\": []\n}\n{\n  \"ok\": true,\n  \"path\": \"<redacted:session-cookie>/ws\",\n  \"opened\": false,\n  \"frames\": 0,\n  \"kinds\": {},\n  \"stopped\": \"error\",\n  \"close\": {\n    \"error\": \"InvalidStatus: server rejected WebSocket connection: HTTP 403\",\n    \"http_status\": 403\n  },\n  \"saved\": \"/workspace/verification-artifacts/runs/20261013-021747-0b62-map-f29/evidence/F29.ws-handshake-rejections/other-app.json\",\n  \"first_frames\": []\n}\n{\n  \"ok\": true,\n  \"path\": \"<redacted:session-cookie>/ws\",\n  \"opened\": false,\n  \"frames\": 0,\n  \"kinds\": {},\n  \"stopped\": \"error\",\n  \"close\": {\n    \"error\": \"InvalidStatus: server rejected WebSocket connection: HTTP 403\",\n    \"http_status\": 403\n  },\n  \"first_frames\": []\n}\n{\n  \"ok\": true,\n  \"path\": \"<redacted:session-cookie>/ws\",\n  \"opened\": false,\n  \"frames\": 0,\n  \"kinds\": {},\n  \"stopped\": \"error\",\n  \"close\": {\n    \"error\": \"InvalidStatus: server rejected WebSocket connection: HTTP 403\",\n    \"http_status\": 403\n  },\n  \"first_frames\": []\n}\n",
  "stderr": ""
}
