From 06cf4d1b9efa6c85cb3717e02f005fdd39019a2e Mon Sep 17 00:00:00 2001 From: Daniel Samson <12231216+daniel-samson@users.noreply.github.com> Date: Sun, 12 Apr 2026 13:58:08 +0100 Subject: [PATCH] Handle stale workspaces: 409 conflict auto-cleanup + verbose logging When the orchestrator restarts, it loses in-memory queue state. If a stale workspace still exists, createWorkspace now auto-deletes it and retries instead of failing with 409. Also adds --verbose to Claude Code invocation for better task log debugging. Co-Authored-By: Claude Opus 4.6 --- coder/cloudflare-worker/main.tf | 6 ++++-- src/services/coder.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/coder/cloudflare-worker/main.tf b/coder/cloudflare-worker/main.tf index ab46765..2fc8517 100644 --- a/coder/cloudflare-worker/main.tf +++ b/coder/cloudflare-worker/main.tf @@ -579,8 +579,10 @@ LOGEOF ARGS="$DEPLOY_ENV" fi - # Run Claude Code in non-interactive mode - claude --print --dangerously-skip-permissions "/project:$TASK_TYPE $ARGS" 2>&1 | tee ~/task-output.log + # Run Claude Code in non-interactive mode with tool access + claude -p --dangerously-skip-permissions --verbose "/project:$TASK_TYPE $ARGS" 2>&1 | tee ~/task-output.log + EXIT_CODE=$? + echo "Claude exited with code: $EXIT_CODE" | tee -a ~/task-output.log echo "Task completed. Output saved to ~/task-output.log" diff --git a/src/services/coder.ts b/src/services/coder.ts index 655dabf..9086818 100644 --- a/src/services/coder.ts +++ b/src/services/coder.ts @@ -50,6 +50,18 @@ export class CoderClient { }, ); + // Handle 409 conflict — stale workspace from a previous orchestrator instance + if (res.status === 409) { + console.log(`[coder] workspace "${name}" already exists — deleting stale workspace and retrying`); + const existing = await this.findWorkspaceByName(name); + if (existing) { + await this.deleteWorkspace(existing.id); + // Wait for deletion to propagate + await new Promise((resolve) => setTimeout(resolve, 5000)); + } + return this.createWorkspace(task); + } + if (!res.ok) { const text = await res.text(); throw new Error(`Coder API error ${res.status}: ${text}`);