Repository navigation
Native describe: a failed run's terminal failure, as PHP reports it - #968
Conversation
…967) Native describe left out `error`, `failure`, `exception` and `failures` for a failed run, and a timed-out run's `failure.reason` (`run_timeout` or `execution_timeout`). Installed Rust SDK 4.10.2 builds its terminal error from describe, so it surfaced null exception details and a generic timeout. failure_describe.rs ports Workflow Core 2.15's FailureSnapshots::forRun: - one snapshot per failure row; - replaced by the typed history event naming it (ActivityFailed/TimedOut, ChildRun*, Workflow*, UpdateCompleted), with Core's field precedence and per-event defaults; - FailureHandled marking; - ordered by event sequence, creation time and id. It then applies the controller's compaction: terminalFailureSnapshot, failureExceptionPayload, activityFailureSummaries, and withoutNullOrEmptyArrays. The four fields close the run description in PHP's order. A timed-out run is failed, and its failure's reason is the event's timeout_kind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security bounded review clears exact head I compared the new projection directly with the exact locked Workflow Core 2.15.12 source
The disclosed Avro-string exception limit does not weaken Native-authored histories, whose typed events store objects and mirror type/class/message in the event/failure row used by this projection. It remains an explicit historical-import limit, not evidence for a broader claim. The exact head has one parent/current main. GitHub's tested synthetic merge is There is no Security hold on merging this exact current-base head. If another PR advances protected main first, this clearance becomes stale and requires the ordinary carry/readback. Published-image and installed Rust SDK validation remain separate release evidence. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security post-#957 carry review at exact |
|
|
Security final carry clearance: exact head
Security final-clear is granted for #968 at |
|
Security post-merge receipt: #968 merged through the queue as The generated commit has parents current protected main |



Review tier B: a new read-path projection on describe; no write path or tier-A area.
Fixes #967. Ships in the next native patch with #953 and #965, which Rust 4.10.3 and Cloud's native flip wait on.
Problem
Native 3.0.1's run describe omitted
error,failure,exceptionandfailuresfor a failed run, and a timed-out run'sfailure.reason. Installed Rust SDK 4.10.2 builds its terminal error from describe:WorkflowFailedcame back with a null exception type, message andnon_retryable;timed_out.History was correct throughout.
Change
rust/src/runtime/failure_describe.rsports, with the PHP source named on each function:FailureSnapshots::forRun(the version 2.11.8 locks):workflow_failuresrow (failure_row_fallback);failure_id(typed_history), from these events:ActivityFailed/ActivityTimedOut,ChildRunFailed/Cancelled/Terminated,WorkflowFailed/TimedOut/Cancelled/Terminated,UpdateCompleted;source_kind,source_id,propagation_kindandfailure_category;reasonfromtimeout_kind, thenreason;FailureHandledmarking;WorkflowController's describe compaction:compactFailureSnapshots,activityFailureSummaries,terminalFailureSnapshot(the lastworkflow_runorterminalsnapshot),failureExceptionPayload,lastActivityFailureMessageandwithoutNullOrEmptyArrays.error,failure,exception,failures. A timed-out run isfailedin both runtimes, so itsfailurecarriesreason: run_timeoutorexecution_timeout,failure_category: timeoutand the timeout message. As in PHP there's no top-levelreason; the Rust SDK readsfailure.reason.Checked
WorkflowFailed) gives PHP'sfailureexcerpt from the issue: message,ActivityFailed,durable_workflow::ActivityFailure,application,non_retryable: true,event_sequence: 6, the exception triple,activity_failuresand twofailures;reason: run_timeout;a_failed_runs_describe_carries_its_terminal_failure.Limits
exceptionstored as an Avro string isn't decoded here. Native writes objects.message_fullisn't preferred overmessagefor row-only fallbacks.sdk-rust will rerun its installed harness (#155) against the patched image.
🤖 Generated with Claude Code