Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/tests export-ignore
15 changes: 10 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ project follows [Semantic Versioning](https://semver.org/).

## [Unreleased]

## [3.10.0] - Unreleased
## [3.10.0] - 2026-11-07

### Upgrade notes

Expand Down Expand Up @@ -46,11 +46,10 @@ project follows [Semantic Versioning](https://semver.org/).
before publishing that task's completion or failure. Public `tick()`,
activity scheduling, cancellation, local failures, cooperative mode, custom
transports, telemetry and metrics retain synchronous behavior. Opting in
changes when completion errors become visible. These source features still
require published-package/runtime and load qualification under #293; no
throughput improvement or default change is claimed.
changes when completion errors become visible. No throughput improvement or
default change is claimed.

- An unreleased schedule-to-start histogram for workflow/activity dispatch uses
- A schedule-to-start histogram for workflow/activity dispatch uses
the runtime's capability-gated `ready_age_ms` claim metadata (shared metrics
revision 2, central #233). Valid zero is retained; missing, unsupported or
malformed ages are omitted. Existing instruments keep their names and tags.
Expand Down Expand Up @@ -108,6 +107,12 @@ project follows [Semantic Versioning](https://semver.org/).

### Fixed

- Composer distribution archives no longer include the test tree, avoiding the
`tests/Fixtures` and `tests/fixtures` directory collision when vendor files
are copied to a case-insensitive filesystem. Source checkouts keep the
complete test corpus; runtime code, `resources/`, `docs/` and `examples/`
remain in the archive.

- Static shared, control and worker credentials are validated in their original
form before role selection and fallback, including framework configuration
and Laravel process handoffs (#307). Invalid UTF-8, leading/trailing Unicode
Expand Down
2 changes: 1 addition & 1 deletion docs/portal/build/workflows-activities.md
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,7 @@ heartbeats. Prepared local activities use supervised callback processes.

## Inspect retry budget and the owning workflow

The unreleased `ActivityContext::activityExecutionId` property contains the
The `ActivityContext::activityExecutionId` property contains the
logical `activity_execution_id` received with the claim. Ordinary and
cooperatively supervised remote callbacks expose that same execution identity
across retry attempts, while `activityAttemptId` identifies each attempt.
Expand Down
2 changes: 1 addition & 1 deletion docs/portal/getting-started/client-setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ The workflow ID is the stable instance identity. The run ID identifies one execu
## Read complete lists and histories

`listWorkflows()` and `workflowHistory()` each return one bounded page. The
following iterator methods are unreleased:
following iterator methods read every page lazily:

```php
foreach ($controlClient->iterateWorkflows(status: 'running', pageSize: 100) as $execution) {
Expand Down
4 changes: 2 additions & 2 deletions docs/portal/operate/metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ result, a retry decision, a deadline or task authority.
| `durable_workflow_worker_poll_duration_seconds` | histogram | `s` | same as above |
| `durable_workflow_worker_tasks` | counter | `1` | `task_kind`, `task_queue`, `outcome` |
| `durable_workflow_worker_task_duration_seconds` | histogram | `s` | same as above |
| `durable_workflow_worker_task_schedule_to_start_seconds` (unreleased) | histogram | `s` | `task_kind`, `task_queue` |
| `durable_workflow_worker_task_schedule_to_start_seconds` | histogram | `s` | `task_kind`, `task_queue` |

Each request, poll or processing observation increments its counter by one and records one nonnegative
duration with the same tags. A client observation covers one logical request,
Expand All @@ -65,7 +65,7 @@ describe this worker process, not durable execution counts, workflow completion
or schedule-to-start latency. A missing observation does not mean zero work or
a healthy process.

## Schedule-to-start timing (unreleased)
## Schedule-to-start timing

The revision-2 dispatch histogram records only workflow and activity tasks that
this worker actually dispatches. The runtime must explicitly advertise Boolean
Expand Down
16 changes: 7 additions & 9 deletions docs/sdk-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ that the visible examples still match those runnable files.

## Activity execution identity

The unreleased `ActivityContext::activityExecutionId` is the nullable logical
`ActivityContext::activityExecutionId` is the nullable logical
execution identity supplied by an activity claim. `workflowId` and `runId`
identify its owning workflow/run; `activityAttemptId` remains attempt-specific.
Use a caller-owned business key when logical identity is unavailable. The SDK
Expand All @@ -318,7 +318,7 @@ run guard and fail rather than silently targeting a successor.

## Control-plane administration and discovery

`listWorkflows()` and `workflowHistory()` each read one page. The unreleased
`listWorkflows()` and `workflowHistory()` each read one page. The
iterator API follows the Server's continuation tokens lazily:

```php
Expand Down Expand Up @@ -588,14 +588,13 @@ task kind, consecutive attempt, selected delay, and typed server exception.
Authentication failures, malformed responses, and generic server errors remain
fatal.

## Completion-carried polls (unreleased)
## Completion-carried polls

Unreleased main can request the next task on a task completion when the runtime
SDK 3.10.0 can request the next task on a task completion when the runtime
advertises the matching capability: `workflow_task_completion_activity_poll`,
`activity_completion_workflow_poll`, or `workflow_task_completion_workflow_poll`.
The Worker reserves a free slot for that task kind. Workflow carriers request
only workflow tasks; when both carriers are sent, activity dispatch has priority.
These paths still require qualification with the published runtime and SDK.

An embedded lease uses the ordinary payload, history and lease-supervision path
without sending or recording another poll. A lease reported without its answer
Expand All @@ -607,7 +606,7 @@ Grant freshness includes the original completion transit and
time spent waiting to dispatch. Shutdown finishes a known delivered lease before
returning. Runtimes without the capability keep the ordinary polling path.

## Completion pipelining (unreleased, opt-in)
## Completion pipelining (opt-in)

`Worker::create($client, $taskQueue, enableCompletionPipelining: true)` allows
managed `run()` to overlap a completion response with useful work on one
Expand All @@ -633,9 +632,8 @@ Opting in changes when a completion refusal becomes visible: useful work on the
next leased task may have run before the refusal arrives. Worker registration
or authentication refusal prevents that task's publication. An identity-bound
lost claim is released as usual; other deferred failures remain errors. Shutdown
settles a known leased task and creates no further prefetch. This source feature
still requires published-package/runtime qualification and realistic load
evidence. No throughput improvement or default change is claimed.
settles a known leased task and creates no further prefetch. No throughput
improvement or default change is claimed.

## Activity runtime lease maintenance

Expand Down
Loading