{"record":{"id":"e82e196080f9e652","repo":"Hmbown/CodeWhale","slug":"this-launcher-does-not-support-sandbox-listing","errorCode":null,"errorMessage":"this launcher does not support sandbox listing","messagePattern":"this launcher does not support sandbox listing","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/cloud_dispatch.rs","lineNumber":1199,"sourceCode":"    fn clone_repository(&self, _receipt: &SandboxReceipt, _url: &str, _path: &str) -> Result<()> {\n        bail!(\"this launcher does not support repository clones\")\n    }\n    /// Run one harness command inside the sandbox and return bounded stdout.\n    fn run_harness(&self, _receipt: &SandboxReceipt, _command: &HarnessCommand) -> Result<String> {\n        bail!(\"this launcher does not support harness execution\")\n    }\n    /// Collect the agent's work product from the sandbox.\n    fn collect_patch(&self, _receipt: &SandboxReceipt) -> Result<PatchReceipt> {\n        bail!(\"this launcher does not support patch collection\")\n    }\n    /// Tear the sandbox down. Called on cancel, failure, and completion.\n    fn teardown(&self, _receipt: &SandboxReceipt) -> Result<()> {\n        bail!(\"this launcher does not support teardown\")\n    }\n    /// List Codewhale-dispatch sandboxes with their job labels. Used by the\n    /// reconciler (startup sweep and cancel); not part of the run protocol.\n    fn list_job_sandboxes(&self) -> Result<Vec<LabeledSandbox>> {\n        bail!(\"this launcher does not support sandbox listing\")\n    }\n}\n\n/// One dispatch-labeled sandbox discovered by the reconciler.\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct LabeledSandbox {\n    pub sandbox_id: String,\n    /// Job id from the `codewhale.job` label, when the label is present.\n    pub job_id: Option<String>,\n}\n\n/// Provider receipt for a created sandbox. `toolbox_url` is the validated\n/// per-sandbox toolbox origin returned by the create call, when present.\n/// `pr_url` is intentionally omitted from this slice.\n///\n/// This is the infrastructure id of a created sandbox. It is not Computer\n/// entitlement and must not be treated as provider-accepted active seconds.\n#[derive(Debug, Clone, PartialEq, Eq)]","sourceCodeStart":1181,"sourceCodeEnd":1217,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/cloud_dispatch.rs#L1181-L1217","documentation":"list_job_sandboxes backs the reconciler's startup sweep and cancel path, discovering Codewhale-dispatch sandboxes by their job labels. The trait default stubs it with this bail so partial fixtures keep compiling. It fires when a launcher that never implemented listing is asked to enumerate sandboxes.","triggerScenarios":"The reconciler runs a startup sweep or cancel-time sweep and calls launcher.list_job_sandboxes() on a launcher whose impl relies on the default trait body (typically a test recorder).","commonSituations":"Starting the TUI/cloud-dispatch runner against a fake or custom launcher lacking reconciliation support; integrating a new provider before implementing discovery.","solutions":["Implement fn list_job_sandboxes in your launcher to query the provider for dispatch-labeled sandboxes.","Skip reconciliation gracefully (or use an empty listing) when the launcher intentionally does not support discovery.","Point the reconciler at LiveDaytonaLauncher in production, which implements listing."],"exampleFix":"null","handlingStrategy":"fallback","validationCode":"let listings = launcher.list_job_sandboxes().unwrap_or_default();","typeGuard":null,"tryCatchPattern":"let sandboxes = match launcher.list_job_sandboxes() {\n    Ok(v) => v,\n    Err(e) if e.to_string().contains(\"does not support sandbox listing\") => Vec::new(),\n    Err(e) => return Err(e),\n};","preventionTips":["Gate reconciler sweeps on launcher capability.","Prefer LiveDaytonaLauncher anywhere reconciliation runs.","Treat listing as optional and default to empty in non-production launchers."],"tags":["sandbox","reconciler","trait-default","cloud-dispatch"],"backgroundTag":"unsupported-operation","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}