PBI-49: review-fixes — primary_worktree order, idea-claim rollback, sprint mark-ready fallback
Three findings from PBI-47 review: P1 — primary_worktree_path scheiden van lock-volgorde setupProductWorktrees acquired locks in alphabetical order (deadlock prevention) but also returned worktrees in that order, so worktrees[0] could point at a secondary product when its id sorted before the primary's. Lock-acquire stays sorted; output now preserves caller's input order so worktrees[0] is always the primary. P1 — Idea-claim rollback bij worktree setup failure setupProductWorktrees runs after tryClaimJob has already flipped the job to CLAIMED. A failure in lock-acquire/git-fetch/reset/sync left the job hanging until the 30-min stale-reset and the lock-map populated. Wrapped in try/catch with releaseLocksOnTerminal + rollbackClaim mirror of the task-pad behaviour. P2 — SPRINT mark-ready fallback when last task didn't push The mark-ready path used updated.pr_url, which is null when the closing task was verify-only or had no diff. Now falls back to a Prisma findFirst on the SprintRun's earliest job with pr_url IS NOT NULL. Tests: 31 files, 243 passing (incl. new input-order regression for setupProductWorktrees). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f7f5a487ec
commit
d2f43fe8e6
4 changed files with 71 additions and 18 deletions
|
|
@ -428,9 +428,27 @@ async function getFullJobContext(jobId: string) {
|
|||
involvedProductIds.push(ip.product_id)
|
||||
}
|
||||
}
|
||||
const worktrees = involvedProductIds.length > 0
|
||||
? await setupProductWorktrees(job.id, involvedProductIds, (pid) => resolveRepoRoot(pid))
|
||||
: []
|
||||
// PBI-49 P1: rollback the claim if worktree setup fails so the job
|
||||
// doesn't hang in CLAIMED until the 30-min stale-reset, and any partial
|
||||
// locks are released. Mirrors attachWorktreeToJob's task-pad behaviour.
|
||||
let worktrees: Array<{ productId: string; worktreePath: string }> = []
|
||||
if (involvedProductIds.length > 0) {
|
||||
try {
|
||||
worktrees = await setupProductWorktrees(
|
||||
job.id,
|
||||
involvedProductIds,
|
||||
(pid) => resolveRepoRoot(pid),
|
||||
)
|
||||
} catch (err) {
|
||||
console.warn(
|
||||
`[wait-for-job] product-worktree setup failed for idea-job ${job.id}; rolling back claim:`,
|
||||
err,
|
||||
)
|
||||
await releaseLocksOnTerminal(job.id)
|
||||
await rollbackClaim(job.id)
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
job_id: job.id,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue