Skip to content

recipe-run can hang indefinitely without diagnostics or cleanup #503

@chubes4

Description

@chubes4

Problem

A current-main Studio Web live eval timed out after 30 minutes while waiting for wp-codebox recipe-run --json to finish. The eval wrapper was killed by the shell timeout, but the child wp-codebox recipe-run processes remained orphaned and continued running with no stdout/stderr evidence and no finalized artifact bundle.

This blocks using WP Codebox as the proof harness for Studio Web demos because a stalled live browser probe provides no actionable failure payload and leaks long-running processes.

Reproduction evidence

Repo/state:

  • Studio Web worktree: /Users/chubes/Developer/studio-web@proof-current-main
  • Studio Web main commit: 2f777a8 (Merge pull request #353 from chubes4/fix/preview-phase-metadata-smoke)
  • Generated recipe: /Users/chubes/Developer/studio-web-eval-runs/current-main-proof/artifacts/live-2026-06-02T17-15-05-572Z/local-restaurant-launch/studio-web/recipe.json
  • Artifact root: /Users/chubes/Developer/studio-web-eval-runs/current-main-proof/artifacts/live-2026-06-02T17-15-05-572Z/local-restaurant-launch/studio-web/wp-codebox-artifacts

Command run by the eval:

node scripts/website-generation-eval.mjs live \
  --scenario local-restaurant-launch \
  --adapter studio-web \
  --artifacts-dir /Users/chubes/Developer/studio-web-eval-runs/current-main-proof/artifacts \
  --output /Users/chubes/Developer/studio-web-eval-runs/current-main-proof/evidence.json \
  --wp-path /Users/chubes/Studio/intelligence-chubes4 \
  --workspace-root /Users/chubes/Developer

Observed result:

  • Shell timeout killed the wrapper after 30 minutes.
  • No final evidence.json was written.
  • Runtime artifact directory existed, but contained no collected files/logs:
    • wp-codebox-artifacts/runtime-mpwweehw-y7v8j3/files/
    • wp-codebox-artifacts/runtime-mpwweehw-y7v8j3/logs/
  • The underlying wp-codebox recipe-run parent/child processes were still running after wrapper timeout:
    • node /Users/chubes/Developer/wp-codebox/packages/cli/dist/index.js recipe-run ... --json
    • /Users/chubes/.nvm/.../node --experimental-wasm-jspi --experimental-wasm-stack-switching /Users/chubes/Developer/wp-codebox/packages/cli/dist/index.js recipe-run ... --json
  • kill did not stop them; kill -9 was required.

The generated recipe dry-run succeeds, so this is not a fixture/recipe-shape failure:

wp-codebox recipe-run \
  --recipe /Users/chubes/Developer/studio-web-eval-runs/current-main-proof/artifacts/live-2026-06-02T17-15-05-572Z/local-restaurant-launch/studio-web/recipe.json \
  --artifacts /Users/chubes/Developer/studio-web-eval-runs/current-main-proof/manual-dry-codebox-artifacts \
  --json \
  --dry-run

Desired outcome

wp-codebox recipe-run --json should fail with bounded diagnostics instead of hanging indefinitely.

Acceptance criteria

  • Browser-probe/recipe-run has a bounded timeout or watchdog for stalled Playground/browser operations.
  • On timeout, WP Codebox emits a structured JSON failure result with the stalled command, elapsed time, active phase if known, and any available runtime/browser logs.
  • Runtime artifact collection still writes diagnostic files/logs when a run times out.
  • Child Playground/Node processes are disposed when the parent command exits or is interrupted.
  • A smoke/regression test covers an intentionally stalled recipe or browser probe and proves the process exits with diagnostics.

Downstream impact

Studio Web current-main live eval cannot currently prove the demo path because the harness can hang without evidence. Dry-run plumbing passes, but the live local-restaurant-launch run does not produce a final failure envelope.

AI assistance

  • AI assistance: Yes
  • Tool(s): OpenCode (openai/gpt-5.5)
  • Used for: Ran the current-main Studio Web proof eval, inspected the generated recipe/artifacts/processes, and drafted this upstream blocker from observed evidence.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions