{"record":{"id":"a8985751a2b5223e","repo":"ruvnet/RuView","slug":"cannot-read-e","errorCode":null,"errorMessage":"cannot read {}: {e}","messagePattern":"cannot read (.+?): (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"v2/crates/wifi-densepose-cli/src/room.rs","lineNumber":304,"sourceCode":"    Ok(())\n}\n\n// ---------------------------------------------------------------------------\n// room-status\n// ---------------------------------------------------------------------------\n\n/// Arguments for `room-status`.\n#[derive(Args, Debug, Clone)]\npub struct RoomStatusArgs {\n    /// Specialist-bank file.\n    #[arg(long, default_value = \"./room-bank.json\")]\n    pub bank: String,\n}\n\n/// Execute `room-status`.\npub async fn room_status(args: RoomStatusArgs) -> Result<()> {\n    let raw = std::fs::read_to_string(&args.bank)\n        .map_err(|e| anyhow::anyhow!(\"cannot read {}: {e}\", args.bank))?;\n    let bank = SpecialistBank::from_json(&raw).map_err(|e| anyhow::anyhow!(\"{e}\"))?;\n    println!(\"room:        {}\", bank.room_id);\n    println!(\"baseline:    {}\", bank.baseline_id);\n    println!(\"trained_at:  {}\", bank.trained_at_unix_s);\n    println!(\"anchors:     {}\", bank.anchor_count);\n    println!(\"specialists: {:?}\", bank.trained_kinds());\n    Ok(())\n}\n\n// ---------------------------------------------------------------------------\n// room-watch\n// ---------------------------------------------------------------------------\n\n/// Arguments for `room-watch`.\n#[derive(Args, Debug, Clone)]\npub struct RoomWatchArgs {\n    /// Specialist-bank file (single-node mode).\n    #[arg(long, default_value = \"./room-bank.json\")]","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/ruvnet/RuView/blob/4685618388a5e49fad5b3005806f3bdd6a7c25c3/v2/crates/wifi-densepose-cli/src/room.rs#L286-L322","documentation":"room-status failed to std::fs::read_to_string the specialist-bank file (default ./room-bank.json). The command is read-only reporting; the io::Error is typically NotFound (train-room not run yet, wrong path, or wrong working directory), permission denied, or non-UTF-8 content when another artifact is passed by mistake.","triggerScenarios":"Querying status before train-room produced the bank; --bank defaulting to ./room-bank.json while running from another directory; passing the enrollment JSON or binary baseline instead of the bank.","commonSituations":"Relative-path assumptions across shell sessions; artifact mixups along the calibrate, enroll, train-room, room-status chain.","solutions":["Run train-room first and pass the exact path it wrote via --bank","Use an absolute path instead of relying on the ./room-bank.json default","Confirm the file is the JSON bank, not another artifact","Fix permissions if the file exists but is unreadable"],"exampleFix":"// before\n$ cd /srv && ruview room-status   # cannot read ./room-bank.json\n\n// after\n$ ruview room-status --bank /srv/ruview/room-bank.json","handlingStrategy":"validation","validationCode":"fn bank_file_readable(path: &str) -> bool {\n    std::path::Path::new(path).is_file() && std::fs::read_to_string(path).is_ok()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Print and reuse the artifact path each pipeline stage emits","Wrap the calibrate-to-room-status pipeline in one script with a shared artifacts directory","Pass --bank explicitly rather than relying on the ./room-bank.json default"],"tags":["rust","filesystem","cli","specialists"],"backgroundTag":null,"analyzedSha":"4685618388a5e49fad5b3005806f3bdd6a7c25c3","analyzedAt":"2026-08-16T06:09:40.886Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}