From 51533cf48e828099a77222dd863daae2df1f2d43 Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Sat, 9 May 2026 14:05:59 +0200 Subject: [PATCH] fix(attachWorktreeToJob): schrijf branch naar claudeJob.branch in DB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptoom: TASK_IMPLEMENTATION jobs in een sprint-run met pr_strategy= SPRINT kregen branch=null in claudeJob.branch, ook al maakte attachWorktreeToJob de juiste worktree-branch (feat/sprint-) aan en returnde die in de payload-response. Gevolg: update_job_status (na PR #43-fix) leest claudeJob.branch uit de DB → null → valt terug op legacy `feat/job-<8>` → `git push` faalt met "src refspec feat/job-xxx does not match any" → job FAILED → cascade- cancel van sibling-tasks in dezelfde sprint-run. Live waargenomen voor sprint-run cmoy9irr8000ci017fvy30lvv (T-806 FAILED, T-807-T-811 CANCELLED) ondanks dat Claude PR #174 op feat/sprint-fvy30lvv had gemaakt. Root cause: attachWorktreeToJob (wait-for-job.ts:205-209) update'de alleen base_sha. Voor SPRINT_IMPLEMENTATION-kind wordt branch wel naar DB geschreven (regel 655) maar voor TASK_IMPLEMENTATION-pad zat dat gat. Fix: altijd branch + (indien aanwezig) base_sha schrijven naar claudeJob in de update aan het eind van attachWorktreeToJob. Tests: __tests__/wait-for-job-worktree.test.ts mock-prisma uitgebreid met `claudeJob.update`. 341 tests in 38 files passed. Co-Authored-By: Claude Opus 4.7 (1M context) --- __tests__/wait-for-job-worktree.test.ts | 4 ++-- src/tools/wait-for-job.ts | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/__tests__/wait-for-job-worktree.test.ts b/__tests__/wait-for-job-worktree.test.ts index c03e91d..d36e08f 100644 --- a/__tests__/wait-for-job-worktree.test.ts +++ b/__tests__/wait-for-job-worktree.test.ts @@ -6,7 +6,7 @@ import * as fs from 'node:fs/promises' vi.mock('../src/prisma.js', () => ({ prisma: { $executeRaw: vi.fn(), - claudeJob: { findFirst: vi.fn(), findUnique: vi.fn() }, + claudeJob: { findFirst: vi.fn(), findUnique: vi.fn(), update: vi.fn() }, product: { findUnique: vi.fn() }, }, })) @@ -21,7 +21,7 @@ import { resolveRepoRoot, rollbackClaim, attachWorktreeToJob } from '../src/tool const mockPrisma = prisma as unknown as { $executeRaw: ReturnType - claudeJob: { findFirst: ReturnType; findUnique: ReturnType } + claudeJob: { findFirst: ReturnType; findUnique: ReturnType; update: ReturnType } product: { findUnique: ReturnType } } const mockCreateWorktree = createWorktreeForJob as ReturnType diff --git a/src/tools/wait-for-job.ts b/src/tools/wait-for-job.ts index c8af6f4..96c11ba 100644 --- a/src/tools/wait-for-job.ts +++ b/src/tools/wait-for-job.ts @@ -202,12 +202,18 @@ export async function attachWorktreeToJob( } catch (err) { console.warn(`[attachWorktreeToJob] failed to resolve base_sha for ${jobId}:`, err) } - if (baseSha) { - await prisma.claudeJob.update({ - where: { id: jobId }, - data: { base_sha: baseSha }, - }) - } + // Persist branch + base_sha. update_job_status (prepareDoneUpdate) + // leest claudeJob.branch om naar de juiste ref te pushen — zonder deze + // update valt 'ie terug op het legacy `feat/job-<8>` patroon en faalt + // de push met "src refspec ... does not match any" voor sprint/story + // strategy branches. + await prisma.claudeJob.update({ + where: { id: jobId }, + data: { + branch: actualBranch, + ...(baseSha ? { base_sha: baseSha } : {}), + }, + }) return { worktree_path: worktreePath, branch_name: actualBranch, reused_branch: reused } } catch (err) {