* PBI-50 F1: SPRINT_BATCH execution-strategy + cross-repo blocker + branch-resume Schema-migratie + Scrum4Me-side wiring voor de nieuwe SPRINT_IMPLEMENTATION-flow: - prisma: PrStrategy ADD VALUE 'SPRINT_BATCH'; ClaudeJobKind ADD VALUE 'SPRINT_IMPLEMENTATION'; nieuwe enum SprintTaskExecutionStatus; ClaudeJob.lease_until + status_lease_until index; SprintRun.previous_run_id (self-relation SprintRunChain) voor branch-hergebruik bij resume; nieuwe sprint_task_executions tabel met frozen plan_snapshot + verify_required_snapshot per task in scope. - actions/sprint-runs.ts startSprintRunCore: nieuwe blocker-type 'task_cross_repo' voor SPRINT_BATCH (pre-flight rejecteert sprints met cross-repo task_url). Bij SPRINT_BATCH: één SPRINT_IMPLEMENTATION ClaudeJob (geen per-task loop). - actions/sprint-runs.ts resumePausedSprintRunAction: SPRINT_BATCH-pad met remaining-execution-check; bij onafgemaakt werk → nieuwe SprintRun met previous_run_id + run.branch hergebruikt + nieuwe SPRINT_IMPLEMENTATION-job. Oude SprintRun → CANCELLED. Bestaande PBI-49 P0 scope-DONE pad ongewijzigd. - actions/products.ts updatePrStrategyAction: accepteert SPRINT_BATCH. - components/products/pr-strategy-select.tsx: drie opties met helptekst, gebruikt @prisma/client PrStrategy ipv lokaal type. - components/sprint/sprint-run-controls.tsx: BLOCKER_LABELS + blockerHref voor task_cross_repo. Migratie applied op Neon. Type-check + 532 tests groen. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * PBI-50 F5: cross-repo blocker test voor SPRINT_BATCH - task_cross_repo blocker fires bij task.repo_url ≠ product.repo_url - happy path: tasks zonder repo_url-override of met match → één SPRINT_IMPLEMENTATION-job (niet per-task). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * PBI-50 F5: docs/architecture/sprint-execution-modes.md Vergelijking PER_TASK vs SPRINT_BATCH met trade-offs, datamodel- toevoegingen (SprintTaskExecution, lease_until, SprintRunChain) en MCP-tools-matrix per modus. Toegevoegd aan breadcrumb in docs/architecture.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.5 KiB
title: "Sprint execution modes — PER_TASK vs SPRINT_BATCH" status: active audience: [maintainer, contributor] language: nl last_updated: 2026-05-07 related: project-structure.md, data-model.md
Sprint execution modes (PBI-50)
Product.pr_strategy bepaalt hoe een SprintRun wordt uitgevoerd. Drie waarden:
| Waarde | Branch + PR | Worker-sessies | Wanneer |
|---|---|---|---|
STORY |
branch + PR per story | één claude-sessie per task | klassieke flow; iedere story landt onafhankelijk |
SPRINT |
één draft-PR voor de hele sprint, mark-ready aan eind | één claude-sessie per task | werk wordt verzameld in één PR maar tasks blijven losse jobs |
SPRINT_BATCH |
één draft-PR voor de hele sprint, mark-ready aan eind | één claude-sessie voor de hele sprint | snelste pad; vereist alle tasks in dezelfde repo |
STORY en SPRINT triggeren beide het PER_TASK-pad: per TO_DO-task één
ClaudeJob met kind=TASK_IMPLEMENTATION. Het verschil zit alleen in de
PR-strategie van maybeCreateAutoPr.
SPRINT_BATCH triggert het PER_SPRINT-pad: één ClaudeJob met
kind=SPRINT_IMPLEMENTATION die alle TO_DO-tasks van de sprint sequentieel
afhandelt in één claude-sessie.
Waarom SPRINT_BATCH
Iedere task-claim onder PER_TASK is een verse claude -p-sessie. Setup-overhead
per task: laden van Claude Code + MCP-tools, project-CLAUDE.md inlezen,
codebase-oriëntatie. Bij een sprint van 12 tasks van elk 2-4 minuten effectief
werk levert dat ~10-20% pure setup-overhead op én geen continuïteit tussen
tasks.
SPRINT_BATCH ruilt deze overhead in voor één lange sessie:
PER_TASK (STORY/SPRINT): SPRINT_BATCH:
task1 → setup → werk → done setup → task1 → task2 → ... → done
task2 → setup → werk → done [één heartbeat-loop, één branch,
task3 → setup → werk → done één PR, één finalisering]
...
Trade-offs
| Aspect | PER_TASK | SPRINT_BATCH |
|---|---|---|
| Setup-overhead per task | hoog | éénmalig |
| Cross-repo task | toegestaan via task.repo_url-override |
hard-fail in pre-flight (task_cross_repo-blocker) |
| Mid-sprint task-plan-edit | wordt direct opgepikt door volgende claim | snapshot-frozen in SprintTaskExecution.plan_snapshot op claim-tijd |
| Cancel/pause vanuit UI | werkt op task-niveau (volgende claim respecteert PAUSED-status) | werkt op SprintRun-niveau via job_heartbeat-respons (worker breekt task-loop bij sprint_run_status !== 'RUNNING') |
| Failure-mode | task → cancelPbiOnFailure cascade | cascade-stop op eerste fail; sprint → FAILED, branch wordt gepusht maar PR niet ready |
| Quota-pause | niet gedefinieerd | per-task probe via worker_heartbeat; bij low → QUOTA_PAUSE:-prefix → SprintRun PAUSED met resume-instructions; resume creëert nieuwe SprintRun met previous_run_id + branch-hergebruik |
Datamodel
SPRINT_BATCH introduceert:
ClaudeJobKind.SPRINT_IMPLEMENTATION— één job per SprintRun.SprintTaskExecution— frozen scope-snapshot per claim:{ plan_snapshot, verify_required_snapshot, verify_only_snapshot, base_sha, head_sha, status, verify_result, verify_summary }. Worker en gate werken uitsluitend op deze rows; latere wijzigingen aan Task-records hebben geen invloed op de lopende batch.ClaudeJob.lease_until— heartbeat-driven anti-stale-reset (60s interval, 5min lease).SprintRun.previous_run_id(self-relationSprintRunChain) — link naar de voorgaande run bij resume; worker hergebruiktprevious.branchin plaats vanfeat/sprint-<new_id>.
MCP-tools per modus
| Tool | PER_TASK | SPRINT_BATCH |
|---|---|---|
wait_for_job |
✓ | ✓ (claim-filter discrimineert via cj.kind) |
update_task_plan |
✓ | n/a (frozen in snapshot) |
verify_task_against_plan |
✓ | n/a |
verify_sprint_task |
n/a | ✓ (per execution, snapshot-aware) |
update_task_status |
✓ | ✓ (vereist sprint_run_id voor token-coupling) |
update_task_execution |
n/a | ✓ |
job_heartbeat |
✓ (lease-extend, no sprint-fields) | ✓ (lease-extend + sprint_run_status poll) |
update_job_status |
✓ (per-task) | ✓ (aggregate checkSprintVerifyGate + finalizeSprintRunOnDone) |
Volledige tool-catalogus: scrum4me-mcp README. Worker-loop pseudocode: scrum4me-docker CLAUDE.md.