Skip to content

Remove Continue-As-New and InternalHandlerTimeout; rename FlowExecutionID to FlowRunID - #1541

Merged
longquanzheng merged 41 commits into
mainfrom
chore/remove-continue-as-new
Nov 10, 2026
Merged

longquanzheng merged 41 commits into
mainfrom
chore/remove-continue-as-new

Conversation

@longquanzheng

Copy link
Copy Markdown
Contributor

Summary

Removes Continue-As-New and InternalHandlerTimeout from the public API, server-zd, the five SDKs, dexcli, and Dex Web, and renames FlowExecutionID to FlowRunID. These are authorized breaking changes before launch.

  • Proto: the removed fields and enum values (including ContinuedAsNew, value 7) are deleted with their numbers and names reserved; renamed fields keep their numbers. Generated code is regenerated with the pinned protoc 35.1 (make generated-code-check is clean; TypeScript struct.ts equals main).
  • server-zd: removes Continue-As-New handling and the internal handler timeout. Visibility queries still reject ExecutionStatus = 'ContinuedAsNew' with INVALID_ARGUMENT.
  • SDKs (Go, Python, Java, TypeScript, Rust): remove TriggerContinueAsNew, the FlowConfig Continue-As-New threshold, InternalHandlerTimeout, and the search option for continued runs; rename to FlowRunID. Wait docs describe server-zd behavior (the server does not read a wait's request ID; per-Flow long-poll limit). Python FlowConfig must be built with keyword arguments.
  • dexcli: --follow-runs removed; dexcli api uses flowRunId. Dex Web: removes continued-run reads; Time travel fork links stay.
  • Changelogs: Breaking entries with migrations in every component changelog under docs/reference/<component>/changelog.mdx and each SDK CHANGELOG.md. Skills 1.0.11 (PATCH) drops the removed API.

Why

Issue #1072. Continue-As-New existed because the earlier Temporal backend limited history size; server-zd has no such limit, so the API, its options, and the "execution vs run" split have no meaning. The owner authorized removing them before launch rather than keeping dead surface area.

Persisted data compatibility

server-zd's persisted commands embed the API FlowConfig, so old logs, snapshots, and state carry FlowConfig tags 2 and 3 (the removed Continue-As-New fields; the old default threshold was written into every effective FlowConfig). Current code decodes old data and skips them as unknown fields.

  • server-zd/testdata/v1 is byte-identical to main and stays frozen. Golden replay of v1 reads the removed fields' original values from the logged commands, re-inserts them at their wire position (fixing byte counters), and compares strictly with the recorded state. Without the restore, 56 to 67 rows differ; with it, none.
  • server-zd/testdata/v2 is the newest-version baseline recorded after the removal. testdata/README.md now says to regenerate the newest version and keep v1 frozen, replacing the earlier "regenerate v1 in place before 1.0" rule.
  • Older-backend-error and pre-offload-choice log tests use the same restore, with byte-exact comparisons; negative tests prove that any other difference fails.

Review

Claude implemented and fixed; Codex reviewed twice (proto reservations, persisted-data proof, behavior, completeness).

doc-map: no change needed: the concepts Client page never described the removed internal handler timeout

Testing

  • server-zd: cargo test --workspace (2007 passed, including format_compat and golden replay of v1 and v2), clippy, fmt, make rust-rules-check, make copyright-check; make -C server-zd/integ compile and zdIntegTests (restored Async/Sync durability variants).
  • SDK unit and integration suites for Go, Python, Rust, TypeScript, Java; dexcli tests; Dex Web npm run check and build; cd docs && npm run check; skills checks.

Fixes #1072

@codecov

codecov Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.88889% with 5 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
sdk-go/dex/proto_mapper.go 63.63% 1 Missing and 3 partials ⚠️
sdk-typescript/src/client.ts 92.30% 0 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

The format-compat replays of the frozen pre-attempt-handout and
pre-offload-choice logs had been loosened to accept any Flow start
history row, child start outbox row, or run record that encoded
differently, plus self-generated replay expectations.

Read the removed FlowConfig fields 2 and 3 from each logged FlowStart
and child start with test-only prost messages, put them back into the
replayed run records, Flow start history rows, and child start outbox
rows, and move the history row metadata, history bytes, open segment
bytes, and state row bytes that count them. Decoding sites keep the
restored fields, so the comparisons are byte for byte again. A new test
rejects another removed field value and a Flow start without them.
Remove reads of the removed continuedStart and continuedToRunId history
fields: the Next run button, continued start details, the Flow continued
titles and lineage, continued Step options, the continued sticky worker
fallback, and the Execution graph previous-run link. Time Travel fork
links and run attempts are unchanged.
The Continue-As-New removal deleted Go integration tests that ran the
same scenarios with a step durability override. Restore them as async
and sync step durability variants so those paths stay covered.
Old deep links to the removed section now land at the next section.
Sync the Go SDK rewrite plan with the current Go SDK and rename the
run identifier in the Dex Web design. Mark the Web design's run
rollover sections as historical.
The checker test must contain the forbidden term to prove that the
checker rejects it. Keep the literal spellings that origin/main tested
and add a spaced variant for the multi-character separators.
The previous regeneration used the include files of protoc 36.2 while
CI pins 35.1, which changed the NullValue comment.
Restore the CloseStatus = 'CONTINUED_AS_NEW' rejection case and check that ExecutionStatus = and != 'ContinuedAsNew' fail with an unsupported value error, which the search backends map to INVALID_ARGUMENT.
The negative Continue-As-New threshold cases became copies of existing history_window_events cases. Test an unknown step_durability on the StartFlow and SubFlow paths instead, and drop the duplicate from the UpdateFlowConfig table.
Waiting past the last event of the completed run reports no event and the COMPLETED status.
Removing continue_as_new_threshold left the simulated UpdateFlowConfig command with an empty FlowConfig. Switch the run to ENABLED_FOR_ALL search so the command changes state the active Step type invariants check, and re-pin the regression seeds' main-stream digests.
Wait request IDs are never read by server-zd and there are no handler
generations. State that, and document the per-Flow long-poll wait cap.
Drop the unused _duration_seconds32 import from the Python clients.
Use the unreleased wording for the next release of each component, add
Reference links, and record the ExecutionStatus query rejection, CLI JSON
renames, and Python FlowConfig keyword construction. Mirror the SDK
entries in each SDK CHANGELOG.md.
Also give a CLI api call example field that a request actually carried.
The SDK Developer reference moved FlowConfig from the flows-and-steps
pages to each SDK's Flow page.
Restore the original v1 recording, which holds the FlowConfig fields 2
and 3 that #1072 removed, and record the current workload as v2. The
golden replay of v1 restores the logged removed fields and their byte
counters before it compares the state dump row for row; without the
restore 67 rows differ. v2 must not hold the removed fields.
… fields

run_record_with_fields re-encoded the whole RunRecord, so an unknown or
noncanonical field could vanish unnoticed. Require the record to encode
back to its bytes, apart from the removed FlowConfig fields, and test
that an unknown field fails.
pycln drops imports that the Continue-As-New removal left unused, black
joins the shortened search calls, and rustfmt joins the shorter Flow
status match in the Rust example helper.
@longquanzheng
longquanzheng force-pushed the chore/remove-continue-as-new branch from 43a5d63 to 23e3129 Compare November 10, 2026 23:20
@longquanzheng
longquanzheng merged commit 27b2dde into main Nov 10, 2026
68 checks passed
@longquanzheng
longquanzheng deleted the chore/remove-continue-as-new branch November 10, 2026 23:51
longquanzheng added a commit that referenced this pull request Nov 11, 2026
#1541 added SDK entries for 1.41 and 1.42, which will never be tagged:
the next shared release is 1.43.0. Fold the Go 1.41 Breaking items into
the Go 1.43 entry, rename the Python, TypeScript, Rust, and Java entries
to 1.43, and fix the version markers: Python FlowConfig is changed in
1.43.0, and the Go ErrorWithStack change already shipped in 1.40.2.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove Continue-As-New and InternalHandlerTimeout from the API and SDKs, and rename FlowExecutionID to FlowRunID

1 participant