Confirmed against main fe4b059 with AsyncMock describe/history responses, no runtime or credentials: status=failed plus a persisted WorkflowTimedOut event causes Client.get_result to return None. A real deadline is therefore indistinguishable from successful None output. Found during the timeout parity review for sdk-php#55; Rust already maps this terminal outcome explicitly.
Acceptance:
- Raise an exported WorkflowTimedOut SDK exception for WorkflowTimedOut history (execution_timeout and run_timeout).
- Keep the caller's polling TimeoutError distinct and unchanged.
- Preserve the selected run used to retrieve history and existing success/failure/cancellation/termination behavior.
- Add focused red/green tests and run Ruff, mypy and the unit suite.
This is a result-mapping correction, not a replay or wire-protocol change. Do not introduce transport compatibility for old prereleases.
Confirmed against main fe4b059 with AsyncMock describe/history responses, no runtime or credentials: status=failed plus a persisted WorkflowTimedOut event causes Client.get_result to return None. A real deadline is therefore indistinguishable from successful None output. Found during the timeout parity review for sdk-php#55; Rust already maps this terminal outcome explicitly.
Acceptance:
This is a result-mapping correction, not a replay or wire-protocol change. Do not introduce transport compatibility for old prereleases.