{"record":{"id":"4a67d2f4eb0f997a","repo":"BloopAI/vibe-kanban","slug":"timeout-process-took-more-than-30-seconds-to-star","errorCode":null,"errorMessage":"Timeout: process took more than 30 seconds to start","messagePattern":"Timeout: process took more than 30 seconds to start","errorType":"exception","errorClass":"ContainerError","httpStatus":null,"severity":"error","filePath":"crates/local-deployment/src/container.rs","lineNumber":1376,"sourceCode":"        drop(config);\n        let mut env = ExecutionEnv::new(\n            repo_context,\n            commit_reminder_enabled,\n            commit_reminder_prompt,\n        );\n\n        // Always inject workspace/session context\n        env.insert(\"VK_WORKSPACE_ID\", workspace.id.to_string());\n        env.insert(\"VK_WORKSPACE_BRANCH\", &workspace.branch);\n\n        // Create the child and stream, add to execution tracker with timeout\n        let mut spawned = tokio::time::timeout(\n            Duration::from_secs(30),\n            executor_action.spawn(&current_dir, approvals_service, &env),\n        )\n        .await\n        .map_err(|_| {\n            ContainerError::Other(anyhow!(\n                \"Timeout: process took more than 30 seconds to start\"\n            ))\n        })??;\n\n        if let Err(e) = self\n            .track_child_msgs_in_store(execution_process.id, &mut spawned.child)\n            .await\n        {\n            let _ = command::kill_process_group(&mut spawned.child).await;\n            return Err(e);\n        }\n\n        self.add_child_to_store(execution_process.id, spawned.child)\n            .await;\n\n        // Store cancellation token for graceful shutdown\n        if let Some(cancel) = spawned.cancel {\n            self.add_cancellation_token(execution_process.id, cancel)","sourceCodeStart":1358,"sourceCodeEnd":1394,"githubUrl":"https://github.com/BloopAI/vibe-kanban/blob/4deb7eca8f381f7cbc1f9d15515a9ab8f8009053/crates/local-deployment/src/container.rs#L1358-L1394","documentation":"start_execution_inner wraps executor_action.spawn in a 30-second tokio timeout; if the executor process does not spawn within that window the future is dropped and this timeout error is returned. This prevents hangs from blocked executors (e.g. waiting on network or approval) from stalling executions indefinitely.","triggerScenarios":"executor_action.spawn(&current_dir, approvals_service, &env) taking >30s to return — slow executor binary download/startup, hung credential prompt, filesystem stall, or executor waiting for interactive input.","commonSituations":"Cold start with no cached executor (large npx/pip fetch), offline or proxied environments blocking downloads, antivirus/permission scans delaying process start, misconfigured executor command that waits on stdin.","solutions":["Retry — transient slowness (network, cold cache) often resolves on a second attempt.","Pre-install/warm the executor binary so spawn does not need to download it.","Check network/proxy settings if the executor fetches assets at startup.","Run the executor command manually in the worktree to see what it is blocking on."],"exampleFix":"// before\n// spawn hangs 45s on first run downloading the executor\n// after\nexecutors::ensure_executor_installed(&action).await?; // warm cache before spawn\nlet spawned = tokio::time::timeout(Duration::from_secs(30), action.spawn(...)).await??;","handlingStrategy":"retry","validationCode":"// ensure the executor binary is available before spawning\nif !executor_binary_cached(&action).await? {\n    executors::install_executor(&action).await?;\n}","typeGuard":null,"tryCatchPattern":"match container.start_execution(...).await {\n    Err(ContainerError::Other(e)) if e.to_string().contains(\"Timeout: process took more than 30 seconds\") => {\n        // one retry after warming caches / checking network\n        warm_executor_cache(&action).await?;\n        container.start_execution(...).await\n    }\n    other => other,\n}","preventionTips":["Pre-install/warm executor binaries before first use.","Verify network/proxy access for executors that download at startup.","Avoid executor commands that block on stdin or prompts.","Time the spawn manually once to know its cold-start cost."],"tags":["timeout","process","executor"],"backgroundTag":"process-start-timeout","analyzedSha":"4deb7eca8f381f7cbc1f9d15515a9ab8f8009053","analyzedAt":"2026-08-29T09:24:13.446Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}