monad-developers / monad-developers/ultrafuzz

Modal worker does not retry an exhausted generated preparation task

Open
#747 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

deferred-post-v0.1
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:

  1. Select node:attempt-one with validated preparationId: prepare:attempt-one.
  2. Make normal inner resume fail.
  3. Make the diagnostic return one blocker: { kind: "retries-exhausted", nodeId: "prepare:attempt-one" }.
  4. Make retry-task succeed only when --node-id prepare:attempt-one is used.
  5. 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.