Skip to content

Canonicalize regression evidence identity across supported representations #76

Description

@rmcdaniel

Status Summary

The shared regression-corpus validator fingerprints representation details instead of one canonical execution identity in two supported paths. A golden-history replay case can be rewrapped as replay-regression-v1 with the same workflow input, history, and expected commands yet receive a different semantic digest. Codec wires are fingerprinted from Base64 text, while the advertised canonical check accepts distinct padded spellings that decode to the same bytes. Either representation-only change can increase a guarded corpus count without adding a new reproducer.

How to fix

Normalize every supported replay format to the same consumer-executed workflow/input/history/command/expected shape before duplicate comparison. Normalize codec wires to decoded bytes (or reject any spelling that does not round-trip to canonical Base64), including malformed-frame golden evidence. Keep protocol/runtime metadata out of duplicate identity unless an official consumer proves that it changes execution behavior. Propagate the same normalization to every participating repository-local validator.

Acceptance Criteria

  • Rewrapping an existing golden-history case as replay-regression-v1 is rejected as duplicate semantic evidence.
  • Distinct Base64 strings that decode to the same bytes cannot count as distinct codec evidence.
  • Every accepted wire field, including malformed-frame golden cases, is valid canonical Base64.
  • Adversarial tests cover both bypasses while genuinely new replay behavior and wire bytes still grow their respective corpora.
  • Existing official PHP, Python, Rust, server, and workflow corpora continue to validate and execute through their normal consumers.

Delete when

Delete when all participating target branches use the canonical identity rules, representation-only additions fail qualification, and focused cross-format/canonical-wire regression tests pass.

Required source targets

durable-workflow/.github@main
durable-workflow/sdk-php@main
durable-workflow/sdk-python@main
durable-workflow/sdk-rust@main
durable-workflow/server@main
durable-workflow/workflow@v2

Metadata

Metadata

Assignees

No one assigned

    Labels

    authority:githubGitHub is the authoritative lifecycle record for this workbeta:blockerMust be resolved before the first 2.0 betacompletion:evidence-requiredClose only after all explicit acceptance and operational evidence is publiccompletion:evidence-verifiedAcceptance, fixed version, and required operational evidence are publicly verifiedkind:cross-repositoryWork spans more than one public repositorypriority:P0Immediate release or data-integrity riskrepo:github-control-planeOwned by the public organization control planestatus:doneDerived from the authoritative closed issue state

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions