monad-developers / monad-developers/ultrafuzz
Modal worker does not retry an exhausted generated preparation task
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 85
- Forks
- 18
- Avg merge
- 11h 10m
- Merged PRs (30d)
- 194
Description
Summary
On release/v0.1.0, a Modal worker cannot recover a retained inner run when the selected cloud task's exact generated preparation task exhausted its retries.
The validated selected-task DTO explicitly binds all three task IDs:
id: node:<attempt>
preparationId: prepare:<attempt>
verifierId: verify:<attempt>
After normal resume re-emits the retained failure, selectedInnerTaskRetriesExhausted() accepts only a blocker whose node ID equals id. A blocker for the DTO-bound preparationId is treated as unrelated, so the worker rethrows the original resume failure and never invokes the already-bounded retry path.
This occurs before agent inference.
Minimal generic reproduction
Use only the existing temporary Git fixture:
- Select
node:attempt-onewith validatedpreparationId: prepare:attempt-one. - Make normal inner resume fail.
- Make the diagnostic return one blocker:
{ kind: "retries-exhausted", nodeId: "prepare:attempt-one" }. - Make
retry-tasksucceed only when--node-id prepare:attempt-oneis used. - Assert the worker resumes by retrying that exact DTO-bound preparation task.
Run:
pnpm --filter @ultrafuzz/modal exec vitest run test/node-provider.test.ts \
-t 'retries the exact generated preparation task for the selected inner task' \
--reporter=verbose
Observed:
1 failed | 204 skipped
cloud worker phase resume-workflow failed with code 1
The command log contains up and why, but no retry-task.
Expected behavior
The recovery selector should return the exact exhausted blocker ID only when it equals one of the validated selected-task DTO's id, preparationId, or verifierId. The retry command should target that exact returned ID. Every unrelated blocker must remain terminal.
Duplicate search
No issue matched the preparation-task retry-selection gap. Issues #745 and #746 cover earlier dependency relocation and handoff-identity boundaries, not selection of a DTO-bound generated prerequisite after resume.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with test/node-provider.test.ts and run the provided Vitest command using the existing temporary Git fixture. Trace the recovery selector after normal inner resume fails, focusing on the validated selected-task DTO and its id, preparationId, and verifierId. Done means the test passes, the exact exhausted DTO-bound ID is retried, and unrelated blockers remain terminal.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend, cloud, testing-qa
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 85/100