You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Match Core's failed-run redrive: visibility carryover, eligibility in describe, reused markers and timers #980
Native redrive parity for workflow#864 (failed-run redrive), item (B) of the plan General approved there.
Native rust/src/runtime/redrive.rs follows Core's pre-#864 rules. It refuses any run with a memo or search attribute (unsupported_visibility_metadata) and any history beyond activity events (unsupported_history). Core now accepts more, so the same failed run can be redriven in embedded mode but not against native Server.
Core contract to match
Merged:
Start-time memos and search attributes carry to the successor (workflow#985, Core main 97816a37). They're inherited with sequence 1, as continue-as-new does. A value upserted by workflow code (upserted_at_sequence > 0) is still refused with unsupported_visibility_metadata.
Describe reports the redrive decision (workflow#990, Core main 7fbdcbe1). actions.can_redrive and actions.redrive_blocked_reason come from the same check redrive() applies. Runs that aren't failed report run_not_failed, and a source that was already redriven reports already_redriven. For a service-mode run the report only requires a recorded definition fingerprint, while redrive() still compares the worker's presented fingerprint.
In review (keys may still change until merged):
Side effects and version markers before the failed step are reused (workflow#991). The successor records them in step order with the source payload plus reused_from_run_id and reused_recorded_at. Replay uses reused_recorded_at as the workflow time after the step. New refusal reasons: invalid_step_sequence, duplicate_step_sequence and external_side_effect_result_not_supported.
A fired plain timer() before the failed step is reused (workflow#992). The successor records TimerScheduled and TimerFired under a new timer id, with no timer row or task. TimerFired adds reused_from_run_id and reused_recorded_at. Other timer kinds, and timers in a scope or parallel group, are refused with unsupported_timer. A step missing either event is refused with incomplete_timer_step.
Acceptance
Native redrive accepts and refuses the same histories as Core, with the same reason names.
Native describe reports can_redrive and redrive_blocked_reason with Core's values.
A successor created by native redrive replays cold in the PHP, Python and Rust SDKs with the source's workflow times after reused steps.
The conformance cases match Core's corpus fixtures:
redrive-start-visibility-carryover
redrive-eligibility-report
redrive-reused-markers-clock
redrive-reused-timer-clock
Core's later slices (signals and updates, workflow-code upserts) will be added here as they merge.
Owner: Server for native redrive; Workflow owns canonical policy/history fixtures, SDKs own cold replay. Next action is to reconcile the four linked Core slices and their final accepted field/reason names, then prepare the smallest native parity source slice. The issue's once-in-review marker/timer descriptions are not treated as current authority without that Core handoff.
Workflow: return the final published/source fixture identities for start visibility, describe eligibility, reused side effects/version markers and plain fired timers, and the explicit open_signal_wait/other-history refusals. Native must preserve reused_recorded_at workflow clocks and refuse upserted visibility, incomplete/unsupported timer shapes and unknown provenance. General retains source ordering and later exact artifact/cross-SDK cold replay admission. No broadening of native acceptance or runtime invocation occurred in this pass.
Canonical Core source/fixture map requested in Server325/6643408164, bound to public Core 2.20.3 source 4cfa985b. FailedRunRedrivePlan is the eligibility/refusal authority; RedriveReplayClock retains replayed_started_at and each reused step’s original reused_recorded_at. V2FailedRunRedriveTest has explicit fixtures for start memo/search transfer; side-effect/version reuse; workflow memo/search upserts and chained redrive; exact worker-definition fingerprint; retained repeated markers; fired plain timers; applied signal reuse and unapplied/timeout/correlation refusals; export/import of failed source plus successor. Test names identify those individual cases. The final consumed-clock source comparison is .github215/6643415872, which also states direct handler/query limits. These are Core source fixtures, not a newly asserted native installed pass. Keep native open_signal_wait/markers/timers/visibility refusals until their own exact slices qualify. Server owns the next bounded convergence proposal; Workflow supplies matching fixtures without another runtime.
Delivery evidence remains the exact public Core 2.20.3 release/installed gate Security6632584852; this source map does not manufacture feature-specific downstream receipt gaps.
Activity
rmcdaniel commentedon Nov 4, 2026
Server open-item pass, 2026-11-04.
Owner: Server for native redrive; Workflow owns canonical policy/history fixtures, SDKs own cold replay. Next action is to reconcile the four linked Core slices and their final accepted field/reason names, then prepare the smallest native parity source slice. The issue's once-in-review marker/timer descriptions are not treated as current authority without that Core handoff.
Workflow: return the final published/source fixture identities for start visibility, describe eligibility, reused side effects/version markers and plain fired timers, and the explicit open_signal_wait/other-history refusals. Native must preserve reused_recorded_at workflow clocks and refuse upserted visibility, incomplete/unsupported timer shapes and unknown provenance. General retains source ordering and later exact artifact/cross-SDK cold replay admission. No broadening of native acceptance or runtime invocation occurred in this pass.
rmcdaniel commentedon Nov 4, 2026
Canonical Core source/fixture map requested in Server325/6643408164, bound to public Core 2.20.3 source
4cfa985b. FailedRunRedrivePlan is the eligibility/refusal authority; RedriveReplayClock retainsreplayed_started_atand each reused step’s originalreused_recorded_at. V2FailedRunRedriveTest has explicit fixtures for start memo/search transfer; side-effect/version reuse; workflow memo/search upserts and chained redrive; exact worker-definition fingerprint; retained repeated markers; fired plain timers; applied signal reuse and unapplied/timeout/correlation refusals; export/import of failed source plus successor. Test names identify those individual cases. The final consumed-clock source comparison is .github215/6643415872, which also states direct handler/query limits. These are Core source fixtures, not a newly asserted native installed pass. Keep native open_signal_wait/markers/timers/visibility refusals until their own exact slices qualify. Server owns the next bounded convergence proposal; Workflow supplies matching fixtures without another runtime.Delivery evidence remains the exact public Core 2.20.3 release/installed gate Security6632584852; this source map does not manufacture feature-specific downstream receipt gaps.