Repository navigation
Conversation
7a76b53 to
c4b71bf
Compare
A terminal failed workflow that still exposes pending ready work cannot be resumed in place: the backend re-finalizes it as failed without dispatching. The preceding-frame rewind only helps when the timeline has an earlier frame. - read the run state from top-level `data.state` / `data.status` as well, so a terminal failed run reported in that shape is detected instead of resumed blindly - extract the replacement-lineage submission into one helper and reuse it for a new `terminal-pending-non-rewindable` recovery when there is no frame to rewind to Regression coverage: top-level `state`/`status` run snapshots, single-frame and empty timelines transferring to a fresh `ufz-recovery-*` lineage, and a guard that a render-failed run still rewinds to the latest frame and resumes in place. Refs #272 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Second commit:
|
Two review findings, both verified against the vendored smithers 0.31 sources.
Rewinding to the latest timeline frame is a no-op: jumpToFrame returns early
without touching the run row when the target equals the latest frame, and only
the non-latest path calls updateRun({status:"running", errorJson:null}). So
frame selection must key on pending work, not on whether the failure was also
reported as a render failure, or a render failure that leaves pending work
rewinds to latest, changes nothing, and re-sticks.
The replacement run id is a deterministic hash of the original, and `up`
without --resume exits 4 with RUN_EXISTS. A generation that created the
replacement run and died before the new lineage was persisted therefore wedged
every later generation on the same id forever. Adopt the orphan by resuming it.
Regression coverage: preceding-frame rewind for a render failure that still has
pending work, latest-frame rewind when it does not, and RUN_EXISTS adoption.
Refs #272
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Converting to draft — the premise of this PR does not survive reviewTwo independent reviews ran on Verified, and fatal to this approach
R43 evidence checked directly
Also credited from review: the fresh-lineage path is unreachable for R43 (frames are persisted on every driver render, so a 2-hour run has a long history and What I have kept
The real mechanism and the fix direction are now recorded in #275, with the verified facts separated from the remaining hypothesis and the exact measurement that would confirm it. Recommend #272 be resolved via #275. R43 remains preserved and was never stopped or restarted. |
|
Closing unmerged. The premise is refuted by the author's own withdrawal: Three pieces are independently correct and are now tracked in #324 for salvage off current main: the Tracked in #327. |
…and #278 (#338) Recovers the four pieces of #273/#278 that survived review, onto current main, without their refuted premises. - Adopt the deterministic replacement lineage when a fresh submission reports RUN_EXISTS. An earlier recovery generation can create the replacement run and die before the new lineage is persisted; every later generation then recomputes the same id and wedges on exit 4. - Drop the rewind to the latest timeline frame. jumpToFrame returns early with zero mutation when the target equals the latest frame (time-travel/src/jumpToFrame.js:812-824) and up --resume already un-terminalizes a failed run, so the timeline read and the rewind were two subprocesses per generation that changed nothing. - Fall back to a top-level data.state / data.status in smithersSnapshotRunState, for snapshot shape variants that carry no runState or run wrapper. - Add smithersSnapshotUnverifiedDependencies, which reads a dependent prepare: failure off the run row. Proven against R43's real error_json; the recovery built on it is #288's job. The refuted premises are deliberately left out: no rewind to an earlier frame, no verifier reset, no artifact quarantine. Co-authored-by: Claude <noreply@anthropic.com>
Summary
failed, one completed task, one pending task, no failed task rowsValidation
pnpm --filter @ultrafuzz/runtime test -- runtime.test.tspnpm --filter @ultrafuzz/runtime buildpnpm --filter @ultrafuzz/runtime exec prettier --check src/smithers.ts test/runtime.test.tsgit diff --checkR43 Evidence
R43 is preserved on the old immutable image. It reached all property-lens outputs, then repeated
terminal-run-non-resumablewithproperty-specification-faninstill pending/ready. A fresh image/run will be launched after this merges.Greptile Summary
The PR extends failed-workflow resume recovery to detect pending tasks, rewind to an earlier usable frame, and transfer non-rewindable runs to a deterministic replacement lineage.
RUN_EXISTS.Confidence Score: 5/5
The PR appears safe to merge.
No blocking failure remains.
Important Files Changed
Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[Inspect failed workflow] --> B{Failed task rows?} B -->|Yes| C[Retry failed tasks] B -->|No| D{Pending workflow work?} D -->|No| E[Normal resume handling] D -->|Yes| F{Earlier timeline frame?} F -->|Yes| G[Rewind to preceding frame] F -->|No| H[Submit replacement lineage] H --> I{RUN_EXISTS?} I -->|Yes| J[Adopt replacement with resume] I -->|No| K[Use fresh replacement] C --> L[Detached resume] G --> L J --> M[Persist replacement run ID] K --> MReviews (4): Last reviewed commit: "fix(runtime): target a real frame and ad..." | Re-trigger Greptile
Context used: