Skip to content

fix: require redrive reuse authority for replay time - #291

Merged
rmcdaniel merged 2 commits into
mainfrom
fix/215-redrive-reuse-proof
Nov 6, 2026
Merged

rmcdaniel merged 2 commits into
mainfrom
fix/215-redrive-reuse-proof

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Nov 6, 2026 •

Copy link
Copy Markdown
Member

When a redriven timer precedes resume_step_sequence but both reuse fields are missing, ctx.replay_now() currently returns the successor's insertion time. For the retained timer example this changes the original 00:00:06 into 00:05:00, falsely presenting a proved business clock.

Require reuse authority from the validated resume boundary even when the fields are absent. Recognizable redrive headers that cannot be bound, including conflicting kind aliases, also keep scalar time unavailable. Valid ordinary and post-resume results retain their own consumed time; child clocks, legacy results, cancellation, existing errors and frozen histories are preserved.

Adds focused prefix/header/marker controls and one malformed-history corpus fixture. The unchanged successor checker rejects it with its existing resume-step error; the registry explicitly classifies it as refusal evidence and links a valid successor.

Validation:

  • 35 targeted redrive controls pass; Ruff and mypy pass.
  • The identical official corpus consumer on accepted 6950edac runs 105 cases with one behavioral failure: expected unavailable, observed 00:05:00. Final candidate 0fff23d8 passes all 105, with no collection/import errors on either revision.
  • Corpus policy passes: replay inventory 108→109, codec inventory remains 43; prior fixtures and validators unchanged.
  • Final-head full source suite: 5,734 passed, three optional skips and 130 integration tests deselected. All 21 hosted checks pass, including Python 3.10–3.15, integration and protected target-branch qualification; direct Sonar PR issue inventory is zero.

Related: durable-workflow/.github#215. This is an unreleased source correction; the broader clock conformance work remains open.

@rmcdaniel rmcdaniel added the agent:sdk-python Work by the sdk-python repo agent label Nov 6, 2026
@rmcdaniel
rmcdaniel marked this pull request as ready for review November 6, 2026 05:23
@sonarqubecloud

sonarqubecloud Bot commented Nov 6, 2026

Copy link
Copy Markdown

@rmcdaniel
rmcdaniel merged commit 3634612 into main Nov 6, 2026
21 checks passed
@rmcdaniel
rmcdaniel deleted the fix/215-redrive-reuse-proof branch November 6, 2026 05:37
@rmcdaniel

Copy link
Copy Markdown
Member Author

Merged source correction: 3634612367a2bcd6445c67e667d034bf911b5828, tree f83e6638aafa486234182539d15a46db32d23583, ordered parents 6950edac2568d1e243d458234e85280325157ae4 + 0fff23d88e13061726042a9ea568c67ed866f7ae.

Pre-resume scalar success now requires its original reuse authority even when both reuse fields are missing. Unbound redrive headers and conflicting kind aliases cannot turn insertion time into business time. Legacy results/errors/cancellation, valid ordinary and post-resume time, child-resolution time and frozen evidence are preserved.

Validation and original-head evidence:

  • Final local suite: 5,734 passed, three optional skips, 130 integration tests deselected; 35 targeted redrive controls, Ruff and mypy pass.
  • Same official 105-case corpus consumer on immutable accepted 6950edac: exactly one behavioral failure, expected unavailable versus observed successor 00:05:00; final 0fff23d8 passes all 105. Neither run has collection/import errors. New fixture SHA-256 641be3fcc1a639335c4f2b2c9158ee5972946140b8f1244caec9a3e50c65c7ba; its unchanged Core-checker rejection and explicit nonqualifying registry entry prevent it being mistaken for producer qualification. Replay inventory 108→109; codec inventory stays 43.
  • All 21 exact-head PR checks pass. Original CI42168572217, including Python 3.10–3.15 and integration127731329581, is successful; direct Sonar PR issue inventory is zero.
  • Actual main: all five original workflows completed successfully, with 19 successful checks and one declared portal-deploy skip. Original CI42169445849 and integration127733684626 passed; teardown independently reads success. No main check is failed, canceled or pending.

The original main portal42169445878 completed successfully: build127733552036 passed, deploy127734014784 was skipped. Artifact13480567066 has ZIP SHA-256 8689abaea1f4e3a4b07295fffa103777fa523cabcae7d4e6c837b95d8989cce5, tar SHA-256 99d4f31f879fc911fd5d25bc090af09b4b310dc353be3cb159c43d5338ab7d08, 92 regular files and 45 API-source rows independently matched to exact main Git bytes. Audit is source-preview, docs=SDK=3634612, version2.15.0, published wheel null; inventory SHA-256 d3e1c5c65663929a80bd1a5265146af3adca32df8a62c3c0ec464de1496a83eb.

At 05:38:59Z, five anonymous live-byte comparisons matched the existing stable deployment: audit, landing, SDK reference, Client and Worker pages. Published presentation remains d3e72974, SDK source dc47958c, package2.14.1. This source merge did not publish a release or deploy the preview.

Cleanup: remote feature ref independently returns404, local feature branch is removed, source worktree is detached at accepted main and shared main is clean. Owned local source-test and check-watch processes have exited. SDK Python retains this change's public source diagnostics through 2026-11-13 06:00UTC, then removes them. Broader central #215 source/published conformance and its named authority gaps remain open.

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

Labels

agent:sdk-python Work by the sdk-python repo agent

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant