feat(runner): terminal-failure handling + early owner-guarded lease (PBI-19 / ST-025) #53

Merged
janpeter merged 1 commit from feat/on-demand-runner-terminal into master 2026-07-08 05:40:54 +02:00
Owner

Wat

Runner-helft van de on-demand repo-clone fallback (PBI-19). Volgt op scrum4me-mcp PR #78 (merged) waaruit deze code markJobTerminallyFailed / TerminalJobError / OwnershipLostError importeert.

bin/run-one-job.ts

  • Terminal/transient-split (voorheen: elke null-context → rollbackClaim → QUEUED → oneindige loop): een TerminalJobError uit getFullJobContext of attachWorktreeToJobmarkJobTerminallyFailed (job FAILED + SprintRun FAILED, geen rollback). OwnershipLostError → abort zonder rollback. Kaal null/overig → rollback zoals voorheen.
  • ownerCtx {jobId,instanceId,tokenId} doorgegeven aan getFullJobContext + attachWorktreeToJob.
  • Early owner-guarded lease (spec §4.1): de lease-renewal-heartbeat start nu vlak ná de claim i.p.v. pas vóór de spawn, zodat de trage on-demand clone in getFullJobContext/attach niet stale-reclaimed wordt. Guard op status IN ('CLAIMED','RUNNING') AND worker_instance_id AND claimed_by_token_id; self-terminating (0 rows na rollback/FAILED) + unref().

Verificatie

node --experimental-strip-types --check groen. Deze repo heeft géén lokale tsc (tsx-runtime); volledige typecheck/build + E2E gebeurt via de container-image (ST-025 T-85) na merge.

Lockstep-rollout (ST-025 T-86, ná merge)

Image-rebuild met MCP_GIT_REF=merged-mcp-main + fleet-recreate op scrum4me-server én max2. Pas dan is de on-demand fallback live; de directe GH_PRECLONE_REPOS-fix voor scrum4me-workers (2026-07-08) mag blijven staan tot on-demand bewezen is.

## Wat Runner-helft van de on-demand repo-clone fallback (PBI-19). Volgt op scrum4me-mcp **PR #78** (merged) waaruit deze code `markJobTerminallyFailed` / `TerminalJobError` / `OwnershipLostError` importeert. ## `bin/run-one-job.ts` - **Terminal/transient-split** (voorheen: elke null-context → `rollbackClaim` → QUEUED → oneindige loop): een `TerminalJobError` uit `getFullJobContext` of `attachWorktreeToJob` → `markJobTerminallyFailed` (job **FAILED** + SprintRun FAILED, **geen** rollback). `OwnershipLostError` → abort zonder rollback. Kaal null/overig → rollback zoals voorheen. - **ownerCtx** `{jobId,instanceId,tokenId}` doorgegeven aan `getFullJobContext` + `attachWorktreeToJob`. - **Early owner-guarded lease** (spec §4.1): de lease-renewal-heartbeat start nu vlak ná de claim i.p.v. pas vóór de spawn, zodat de trage on-demand clone in getFullJobContext/attach niet stale-reclaimed wordt. Guard op `status IN ('CLAIMED','RUNNING') AND worker_instance_id AND claimed_by_token_id`; self-terminating (0 rows na rollback/FAILED) + `unref()`. ## Verificatie `node --experimental-strip-types --check` groen. Deze repo heeft géén lokale `tsc` (tsx-runtime); volledige typecheck/build + E2E gebeurt via de container-image (ST-025 T-85) na merge. ## Lockstep-rollout (ST-025 T-86, ná merge) Image-rebuild met `MCP_GIT_REF`=merged-mcp-main + fleet-recreate op **scrum4me-server én max2**. Pas dan is de on-demand fallback live; de directe `GH_PRECLONE_REPOS`-fix voor scrum4me-workers (2026-07-08) mag blijven staan tot on-demand bewezen is.
feat(runner): terminal-failure handling + early owner-guarded lease (T-84)
All checks were successful
CI / Compose config (pull_request) Successful in 4s
CI / Docker build (pull_request) Successful in 29s
358d901fdc
run-one-job.ts:
- getFullJobContext/attachWorktreeToJob krijgen ownerCtx {jobId,instanceId,tokenId}.
- TerminalJobError → markJobTerminallyFailed (job FAILED + SprintRun FAILED,
  GEEN rollbackClaim) → einde requeue-loop; OwnershipLostError → abort zonder
  rollback; kaal null/overig → rollback zoals voorheen.
- Lease-renewal-heartbeat start nu vlak ná de claim (i.p.v. pas vóór spawn) en is
  owner-guarded (status/worker_instance_id/claimed_by_token_id); dekt de trage
  on-demand clone in getFullJobContext + attach. Self-terminating (0 rows na
  rollback/FAILED) + unref() → veilig op elke bail-return.

Verificatie: node --strip-types --check groen; volledige typecheck/build = container
(T-85, geen lokale tsc in deze repo). Hangt op scrum4me-mcp PR #78 (merged).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
janpeter merged commit 2569b0fbf4 into master 2026-07-08 05:40:54 +02:00
s4m-codex-reviewer left a comment

Verdict: REQUEST_CHANGES

geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • blockerbin/run-one-job.ts:36 / bin/run-one-job.ts:41: de PR importeert markJobTerminallyFailed uit wait-for-job.js en TerminalJobError/OwnershipLostError uit /opt/scrum4me-mcp/src/git/on-demand-clone.js, maar de diff bevat geen wijziging die de gebruikte scrum4me-mcp versie/pin mee optilt. In de beschikbare MCP-bron bestaat on-demand-clone niet en accepteren getFullJobContext/attachWorktreeToJob nog niet de nieuwe ownerCtx parameter. Daarmee kan de runner bij module-load of TypeScript-resolutie breken voordat hij een job kan claimen. Voeg de bijbehorende MCP-update/pin/build-arg wijziging toe of houd deze runnerwijziging compatibel met de huidige MCP API.
  • mediumbin/run-one-job.ts:321: de nieuwe owner-guarded heartbeat is kritisch queue/lease-gedrag, maar de PR voegt geen test of verificatie toe voor de 0-row ownership-lost branch, terminale clone-fouten of de vroege heartbeat vóór getFullJobContext. Gezien de actieve runner-docs split-brain expliciet als veiligheidsrisico benoemen, mist hier minimaal een gerichte runner/MCP-integratietest of reproduceerbare verify-notitie.

Review-log

Actieve productdocs gebruikt: architecture/overview, runbooks/agent-guidance. De multi-worker design-doc is gevonden als draft en alleen als context gebruikt.

# Verdict: REQUEST_CHANGES geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - **blocker** — `bin/run-one-job.ts:36` / `bin/run-one-job.ts:41`: de PR importeert `markJobTerminallyFailed` uit `wait-for-job.js` en `TerminalJobError`/`OwnershipLostError` uit `/opt/scrum4me-mcp/src/git/on-demand-clone.js`, maar de diff bevat geen wijziging die de gebruikte `scrum4me-mcp` versie/pin mee optilt. In de beschikbare MCP-bron bestaat `on-demand-clone` niet en accepteren `getFullJobContext`/`attachWorktreeToJob` nog niet de nieuwe `ownerCtx` parameter. Daarmee kan de runner bij module-load of TypeScript-resolutie breken voordat hij een job kan claimen. Voeg de bijbehorende MCP-update/pin/build-arg wijziging toe of houd deze runnerwijziging compatibel met de huidige MCP API. - **medium** — `bin/run-one-job.ts:321`: de nieuwe owner-guarded heartbeat is kritisch queue/lease-gedrag, maar de PR voegt geen test of verificatie toe voor de 0-row ownership-lost branch, terminale clone-fouten of de vroege heartbeat vóór `getFullJobContext`. Gezien de actieve runner-docs split-brain expliciet als veiligheidsrisico benoemen, mist hier minimaal een gerichte runner/MCP-integratietest of reproduceerbare verify-notitie. ## Review-log Actieve productdocs gebruikt: `architecture/overview`, `runbooks/agent-guidance`. De multi-worker design-doc is gevonden als draft en alleen als context gebruikt.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-docker!53
No description provided.