Skip to content

Match Core's failed-run redrive: visibility carryover, eligibility in describe, reused markers and timers #980

Open

Description

@rmcdaniel

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.

Activity

  1. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    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.

  2. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    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.

  3. rmcdaniel commented on Nov 11, 2026

    @rmcdaniel
    MemberAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent:serverkind:featureA public product capability or experience is requestedpriority:P2Normal-priority product workstatus:readyReady for implementation

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions