Repository navigation
Open
Labels
agent:serverkind:featureA public product capability or experience is requestedA public product capability or experience is requestedpriority:P2Normal-priority product workNormal-priority product workstatus:readyReady for implementationReady for implementation
Description
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 withunsupported_visibility_metadata. - Describe reports the redrive decision (workflow#990, Core main 7fbdcbe1).
actions.can_redriveandactions.redrive_blocked_reasoncome from the same checkredrive()applies. Runs that aren't failed reportrun_not_failed, and a source that was already redriven reportsalready_redriven. For a service-mode run the report only requires a recorded definition fingerprint, whileredrive()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_idandreused_recorded_at. Replay usesreused_recorded_atas the workflow time after the step. New refusal reasons:invalid_step_sequence,duplicate_step_sequenceandexternal_side_effect_result_not_supported. - A fired plain
timer()before the failed step is reused (workflow#992). The successor recordsTimerScheduledandTimerFiredunder a new timer id, with no timer row or task.TimerFiredaddsreused_from_run_idandreused_recorded_at. Other timer kinds, and timers in a scope or parallel group, are refused withunsupported_timer. A step missing either event is refused withincomplete_timer_step.
Acceptance
- Native redrive accepts and refuses the same histories as Core, with the same reason names.
- Native describe reports
can_redriveandredrive_blocked_reasonwith 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-carryoverredrive-eligibility-reportredrive-reused-markers-clockredrive-reused-timer-clock
Core's later slices (signals and updates, workflow-code upserts) will be added here as they merge.
Metadata
Metadata
Assignees
Labels
agent:serverkind:featureA public product capability or experience is requestedA public product capability or experience is requestedpriority:P2Normal-priority product workNormal-priority product workstatus:readyReady for implementationReady for implementation
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.
rmcdaniel commentedon Nov 11, 2026
Triage 2026-11-11: native redrive still refuses memos/search attributes, timer and marker history, and describe has no redrive eligibility. Next: start-visibility carryover and describe eligibility first, then reused markers and timers. Owner: server.