Repository navigation
Add end-to-end distributed tracing across durable workflow execution, retries and recovery #773
Description
Delivered — October 21, 2026
All five tracing components are published through normal protected delivery. The actual enabled PHP Server/SDK tuple is verified; native carrier/catalog support and Cloud deployment remain independent.
| Component | Immutable release source | Published acceptance |
|---|---|---|
| Core 2.9.0 | 2bc1ba0b57df34b74de02427d2225bd8e4dc6322 |
Normal Packagist; all 16 Laravel 9–13 / PHP 8.1–8.4 published upgrade combinations pass. Installed migration, API-absent and PHP 8.1 / Monolog 2 controls pass. All 966 production files are checked. |
| PHP SDK 3.1.0 | 222e27eddc0915957ad513dcc3b2b2418f5eb959 |
Normal Packagist; all 172 production files checked before/after real HTTP execution; default installation remains free of OpenTelemetry. |
| Python SDK 2.7.0 | ab7ee6f8d1ecef11112875e1d8bcf4798f7cb687 |
Normal PyPI; all 36 production modules checked before/after HTTP execution; default installation passes without the optional API. |
| Rust SDK 4.1.0 | 777e1a44197a6bac75f3ca75646b936066316352 |
Normal crates.io registry, default features and MSRV qualification; actual enabled compiled consumer passes. |
| Server 2.10.0 / Helm 0.2.2 | 74f17aae43fc26fb1ef3a88a6cf0153be5e1312a |
Normal publisher passes both registries, first-run, source-free Compose, protocol, published TLS and anonymous chart pull/install. All 346 Server and 966 Core production files match the actual image. |
All six actual published enabled consumers pass: PHP, Python and Rust through independent workflow/activity workers, plus Python worker replacement, actual activity retry with distinct attempts and an independent signal link. Real database checks preserve the caller origin, empty default baggage and exact business/history exclusions. The application-owned API 1.10.1 recipe preserves every existing full package lock record. API-absent and flag-disabled controls omit the capability. The published tuple receipt records the image/chart identities. Older Server fallback consumers also pass, with independent task roots as documented.
Core #788/#881 and the test-only diagnostic correction #883 are merged. The broad installed consumer passes 82 cases; its original two-CPU fan-out observer failures remain failed. The corrected narrow queue-producer classification passes 30 controls, and both installed 64-member fan-out cases pass 735 assertions with original deadlines, canonical histories/results, one activity attempt each, empty queues and no failed jobs. This is not a rewritten aggregate result. The three owned Server complexity findings are fixed; individually accepted maintainability findings remain accepted, with rules and thresholds enabled.
Performance remains an explicit component judgment. The complete 32-cell official Collector study passes functional/resource/export gates and three of four predeclared CPU budgets. Disabled fan-out fails the original 5% target: mean +1.41%, 95% upper +6.43%, baseline drift +4.53%. The post-study component decision accepts 7.5% disabled / 15% enabled. This is neither a predeclared four-budget pass nor a performance SLA. Earlier failed and incomplete studies remain failed or incomplete. The published report records the measured conditions and uncertainty.
The PHP portal discovery correction #201 is merged and its normal deployment/live tracing guide are verified. Website #332 is merged after all gates pass, eight locale builds and 48 layout/link cases. Its live guides are verified in all eight languages. The final Waterline patch selection Website #342 is merged as 76771a024c21a6f4b0a258fa43cc9e151ff0f44b; normal build/deploy and actual Pages publication pass. The live stable manifest and all eight Monitoring guides are verified. Website #344 addresses the newly approved documentation request with a visible OpenTelemetry section and embedded configuration example in every locale; all six normal gates pass, and it merged as 5a299f3ba47f06c5d55905628dd5558b87933624. Normal main qualification, build/deploy and actual Pages publication pass. Live verification at 13:31 UTC confirms the section and table-of-contents anchors, exact configuration example and all guide links in every locale. Rust SDK #113 corrects one stale generated-API sentence that still said published Server support was unavailable, preserving actual capability gating. It merged as 3d9db8c3ff45394757cff078140b16929bc62dc4 after twelve normal checks pass and two worker gates are inapplicable. Normal API publication and live readback pass, with no package/tag change. The final reply to the commenter links the delivered configuration, examples and supported scope.
Sample #266 is merged as 45ac10ed14e248beef09edfa2c82f3362966549d, with a tree identical to qualified bd46b00. All 24 fresh normal checks pass, including PHP 8.4/8.5, namespace/principal/observer behavior, recovery, timers, SDK/application upgrades, children, updates, versioning and external effects. The single combined branch selects the actual published tracing components and Waterline 2.12.1 while preserving frozen choices and every unrelated full Composer record. Its normal multi-platform Codespaces image publisher passes all six jobs, including anonymous immutable-image, attestation and actual startup qualification on both amd64 and arm64, followed by main-channel promotion in both registries. The final consumer receipt records the immutable tag.
The actual consumer found Waterline's SDK 3 startup refusal. Waterline #224 fixes that product defect and 2.12.1 is published. Both SDK-generation observer profiles, actual published package/image identity and the fresh Sample observer journey pass; #223 is closed. Version-example follow-through Waterline #225 is merged as 57e3c443a43e9258dfd0bc55386e6031dd382914 after all 21 current checks pass or are inapplicable. The actual main tree matches qualified head 29a64d3; the remote branch is deleted and verified absent. The early image-unavailable failure and initial missed-example contract failure remain separate originals.
The Sample timer fixture now tests a genuinely incompatible entry shape. It requires the exact typed blocked entry-binding failure, preserved original history/timers and no automatic successor, then supported repair of the same original task after restoring compatible code. Exactly two claims and one repair are checked; fresh v2 input completes separately. The 107 observer tests, real installed recovery control and fresh normal timer journey pass. The scoped S5778 review is accepted maintainability, not a fixed-defect or false-positive claim. PR-scoped API readback confirms no open findings. All previous genuine consumer and setup failures remain recorded separately.
The native owner's PHP layout acknowledgment is not executed native conversion or wire adoption. Core #878 / Server #564 activity-renewal drafts remain separate and are not adopted by this tuple.
Delivery is complete: fifteen owned PRs are merged, all merged remote heads are verified absent, the five tracing components and Waterline compatibility patch are published, the combined Sample consumer/image passes, and documentation is deployed and verified. Closure retains the explicit performance judgment and every original failed/incomplete result above. Native/Cloud adoption and the separate renewal drafts remain independent.
Primary owning public component
Workflow engine
User problem
Durable workflows cross HTTP requests, queues, worker processes, retries, timers and sometimes multiple services. Application-level correlation alone cannot reliably explain the complete execution path.
In our embedded Laravel integration, a manual import created 26 order workflows. Successful external HTTP calls were visible under the application trace ID, but their logs did not contain workflow_run_id or activity_id. Searching those logs by a specific completed workflow run returned no results.
Verified baseline:
- durable-workflow/workflow 2.5.14
- Source: 5636757
- PHP 8.4.24 / Laravel 13.35.0
- Embedded execution with database queues
The runtime exposes workflow, activity and attempt identifiers, but the inspected activity execution path does not automatically establish Laravel logging context. The application currently supplies its own integration.
Adding identifiers to logs addresses only part of the problem. Users also need standard trace propagation, correctly related spans, recovery after worker restarts, and separation of queue waiting time from execution and external-call latency.
Without a supported contract, every application must recreate this integration and handle context leakage, replay, concurrency and asynchronous boundaries independently.
This is a feature proposal. The verified gap concerns embedded Laravel execution; existing tracing capabilities in other runtimes and SDKs should be inventoried before implementation.
Proposed public contract
Provide a documented, vendor-neutral distributed tracing contract based on W3C Trace Context and OpenTelemetry.
- Durable context propagation
- Capture trace context at workflow admission.
- Persist a bounded, versioned propagation carrier in runtime-owned metadata, sufficient for resumption in another process.
- Propagate traceparent and tracestate across client/runtime, queue/worker and child-workflow boundaries.
- Support explicitly configured baggage propagation with allowlists and size limits.
- Preserve causal context through delayed execution, retries, worker replacement and recovery.
- Define context handling for schedules, manual triggers, signals, updates, cancellation and continue-as-new.
- Execution spans and causal relationships
- Instrument workflow admission, task dispatch/processing and individual activity attempts.
- Distinguish execution time, queue waiting, retry backoff and timer waiting.
- Document parent/child versus span-link semantics for asynchronous operations, fan-out/fan-in and events originating from another trace.
- Permit linked trace segments for long-lived workflows; do not require one span to remain open throughout hours or days of waiting.
- Document behavior for ordinary activities, local activities, worker sessions and concurrent execution.
- Public correlation fields
Expose stable, documented attributes and logging fields:
- workflow_instance_id
- workflow_run_id
- workflow_type
- namespace, when applicable
- task_id, when applicable
- activity_id
- activity_type
- activity_attempt_id
- activity_attempt_number
- trace_id and span_id
- request_id, when supplied by the application or transport
These identifiers have different purposes. request_id must not be replaced with workflow_run_id, and neither durable identifier should be repurposed as a trace or span ID.
- Scoped execution context
- Activate the current tracing and logging context while application activity code executes.
- Make it available to injected services and compatible HTTP/database instrumentation.
- Restore previous context on every exit path.
- Provide supported adapters or hooks so applications do not need wrappers around every integration operation.
- Configuration and compatibility
- Accept the application's OpenTelemetry provider, propagators and sampling configuration.
- Offer an optional integration with safe no-op behavior when instrumentation is absent.
- Avoid requiring a particular exporter, collector or monitoring vendor.
- Document instrumentation scope/version, attribute names, compatibility and migration behavior.
- Preserve existing durable histories and define behavior for executions started without tracing metadata.
Acceptance criteria
-
Cross-process propagation
An incoming request with valid W3C context starts a workflow whose activities execute in two independent workers. The resulting spans preserve the documented causal relationships, and application logs identify their current run, activity and attempt. -
Restart and recovery
After worker termination and restart, resumed execution recovers its persisted propagation context. Recovery does not depend on process-local memory. -
Retries
Each actual activity attempt has a distinct attempt span and attempt identity. Logical activity identity remains stable across its retries. Backoff and queue waiting are distinguishable from active execution. -
Durable transitions
Automated tests cover timers, child workflows, fan-out/fan-in, continue-as-new, schedules, manual triggers, signals, updates and cancellation. Independent triggering traces are connected using the documented parent/link policy. -
Context isolation
Sequential jobs, nested operations and concurrent fibers do not inherit another execution's context. Cleanup is verified after success, retryable failure, terminal failure and unwinding of timeout/cancellation exceptions. -
Identifier separation
request_id, workflow_run_id, activity_id, activity_attempt_id, trace_id and span_id remain separate fields. Existing application request and tracing identifiers are preserved. -
External instrumentation
An instrumented HTTP client called inside an activity creates a correctly related client span and injects configured propagation headers without an application-specific wrapper around each call. -
Replay behavior
Replay does not re-emit spans as if previously completed external operations had executed again. Actual recovery/replay work may be instrumented separately. Export duplication and crash-related telemetry-loss limitations are documented rather than presented as exactly-once telemetry guarantees. -
Security
Malformed or oversized carriers are handled safely. Baggage is bounded and allowlisted. Workflow arguments, customer data, credentials and HTTP bodies are excluded by default. High-cardinality identifiers are not automatically used as metric labels. -
Operational resilience
Exporter failure, collector unavailability and disabled instrumentation cannot change business outcomes, retry policy or durable execution state. Export buffering, timeouts and shutdown behavior are bounded and documented. -
Performance
Publish reproducible overhead measurements for disabled instrumentation and enabled representative workloads, including large fan-out. Declare the accepted performance budget before implementation. -
Public documentation and compatibility
Publish configuration examples, a span relationship diagram, a capability matrix for supported runtimes/SDKs and tests for older executions without trace metadata.
Supporting public evidence
No response
Dependencies and affected repositories
W3C Trace Context defines interoperable traceparent and tracestate propagation:
https://www.w3.org/TR/trace-context/
OpenTelemetry messaging conventions describe asynchronous producer/consumer relationships and correlation through span links:
https://opentelemetry.io/docs/specs/semconv/messaging/messaging-spans/
OpenTelemetry Trace API supports links within and across traces:
https://opentelemetry.io/docs/specs/otel/trace/api/#link
OpenTelemetry Logs Data Model defines trace/span correlation fields:
https://opentelemetry.io/docs/specs/otel/logs/data-model/#trace-context-fields
OpenTelemetry Baggage API provides a propagation mechanism whose privacy and exposure require explicit handling:
https://opentelemetry.io/docs/specs/otel/baggage/api/
DW documents activity/attempt identifiers:
https://durable-workflow.com/docs/defining-workflows/activities/
DW lifecycle events expose durable execution identities. ActivityFailed is terminal-only, so lifecycle listeners alone do not provide a complete per-attempt execution-context mechanism:
https://durable-workflow.com/docs/features/events/
DW monitoring documentation separates durable operator state from worker logs, application traces and runtime telemetry:
https://durable-workflow.com/docs/monitoring/
Verified source baseline:
https://github.com/durable-workflow/workflow/blob/563675723522b2d453f950f593ab91473e91c831/src/V2/Activity.php
https://github.com/durable-workflow/workflow/blob/563675723522b2d453f950f593ab91473e91c831/src/V2/Jobs/RunActivityTask.php
Historical related issue durable-workflow/waterline#159 concerns workflow identifiers in lifecycle events. It is related background, not a confirmed duplicate of end-to-end distributed tracing:
#159
Public intake checks
- I searched open and closed GitHub issues for an existing request.
- This request contains only public product contracts and public-safe rationale.
Activity
rmcdaniel commentedon Oct 13, 2026
Thanks for the detailed proposal. The reported gap is in Workflow's activity execution and durable propagation boundaries, so I’m moving the owning issue to the Workflow repository. Waterline's trace navigation can follow that contract.
I accept this as an optional, vendor-neutral observability feature. Initial source inspection of published Workflow2.5.14 confirms that activity execution has durable run/attempt identities without automatically establishing logging or OpenTelemetry context. This is source inspection, not an independent reproduction of the reported application's logs.
The next step is an inventory of embedded and service-mode instrumentation, followed by the public propagation/span/context contract before implementation. The first qualification will exercise embedded Laravel activities across two real workers, retry/replacement and scoped logging cleanup. The broader transitions and SDK/runtime capability matrix remain explicit acceptance work.
The design will use W3C Trace Context and established OpenTelemetry APIs, accept the application's provider, preserve request/durable/trace identities separately, and connect asynchronous work with documented span relationships. Baggage will be opt-in and bounded. Replaying a committed activity will not be reported as another external execution, and exporter failures will not change durable outcomes. The disabled/enabled overhead budget will be declared before instrumenting the runtime.
Priority is P2, after the current correctness and recovery fixes. This intake does not advertise tracing support or change published artifacts. Cross-runtime wire changes require a settled contract and separately qualified integration.
rmcdaniel commentedon Oct 14, 2026
The initial released-source inventory is complete:
Activity::bindRuntime()supplies run, logical activity and attempt identities.RunActivityTaskconstructs dependencies and calls the activity.ActivityContextsupplies attempt metadata, and Worker has a PSR logger/diagnostic listener.contextvars. Workflow/activity/query interceptor hooks already exist.traceparentmetadata.This is source inspection, not a reproduction of the reported application's logs or a tracing capability claim. The inspected tags are unchanged.
Use the application's provider and propagators through the established OpenTelemetry library APIs. The adapter must restore the previous execution context on every exit, as required by the context API. Persisted propagation and asynchronous relationships need their own contract, using W3C Trace Context and the documented messaging span/link model.
Next is the bounded carrier and span/context contract, including original admission versus triggering-event contexts, legacy absence, supervised process propagation, local activities and replay. Declare the disabled/enabled overhead budget before runtime instrumentation. The first implementation/qualification remains real embedded activity execution across two workers with retry/replacement and scoped logging cleanup. Broader transitions and SDKs remain part of acceptance. Current SQLite correctness/publication work has priority. No dependency, schema, protocol or capability change is made by this inventory.
rmcdaniel commentedon Oct 14, 2026
Proposed tracing contract before implementation
The released-source inventory is in the previous comment. The following is the proposed shared boundary. It does not advertise support or change the current release candidate.
observability_contexthas schemadurable-workflow.trace-context, version 1, and a string carrier containingtraceparent, optionaltracestate, and explicitly enabled/allowlistedbaggage. Use official OpenTelemetry propagators for extraction/injection. Bound the serialized context to 4 KiB, traceparent to 256 bytes, tracestate to 512 bytes, and baggage to 2 KiB/32 allowlisted entries. Invalid, oversized, unknown-version or disallowed telemetry is discarded with a bounded diagnostic. It does not reject otherwise valid business work.workflow_instance_id,workflow_run_id,workflow_type,namespace,task_id,activity_id,activity_type,activity_attempt_id,activity_attempt_number,trace_id,span_id, and suppliedrequest_id. Missing fields are omitted. These identities stay distinct. Existing application request context is preserved.durable_trace_context_v1stays false until the installed runtime and worker path actually qualify it. Legacy discovery absence means unavailable durable propagation, not inferred support. Existing task authority, original deadlines and completion receipt rules remain unchanged. The fixtures must cover original admission/duplicate, two independent workers, actual retry, SIGKILL/replacement, cold replay, local activities, every requested transition, scope leakage and malformed/oversized carrier controls. Native/shared adoption is separately coordinated before wire integration.Performance budget
Before instrumentation, freeze the published baseline, workload, hardware and complete drain. Target no more than 1% additional CPU per completed workflow when disabled and 5% with the representative bounded exporter enabled. Require at least three paired repetitions and a baseline drift check. If variation cannot resolve the limit, qualification remains incomplete. Report throughput, tail latency, peak/steady memory, persisted metadata growth and actual queue/export drops separately, including fan-out. Export outage checks retain original business deadlines. This is an acceptance target, not measured overhead.
These choices use W3C Trace Context, the OpenTelemetry context API and asynchronous messaging span relationships. The first executable slice will be embedded admission plus actual activity scopes with an application provider and real queued workers. Broader transition/SDK coverage remains required before closing #773. Current #783 publication retains priority.
rmcdaniel commentedon Oct 14, 2026
Rust Server #325 contract acknowledgment: the proposed boundary fits the reserved native/shared scope. Original admission context, separate attempt spans, replay without repeated activity execution, and continuation causality preserve the current identity, sequence, history and deadline contracts.
The telemetry exclusion must apply specifically to the separately identified observability carrier. Existing task authority, authored commands, sticky-cache and stream fields retain their current comparisons. A changed incoming carrier on an accepted duplicate must preserve the original admission carrier and durable decision. This requires no stronger activity/workflow receipt response contract.
Before native/shared adoption, coordinate the exact field placement, persisted/wire representation and comparison exclusions in this owning record. Native durable_trace_context_v1 remains unavailable until its own installed path qualifies; frozen cohorts and failures remain unchanged. No conflict with General proceeding on the proposed embedded slice, and no native/shared implementation or dependency adoption is requested by this acknowledgment.
rmcdaniel commentedon Oct 14, 2026
The first source-only component is draft #788 at e7213e8. It bounds and validates the versioned telemetry carrier through the official OpenTelemetry API, without changing runtime admission, stored histories, activity scopes, discovery or published packages.
Normal OpenTelemetry API 1.10.0 (
7c029c4a6fd457094a20569bf98f93d95e9a7559) and Context 1.5.0 pass 19 of 20 focused controls. Trace identity/state, explicit baggage allowlists, entry limits, invalid metadata and preservation of the application's current context pass. A separate process without the optional API returns no carrier without an exception. Targeted style and PHPStan pass.The remaining control exposes an actual official-parser boundary:
approved=hello%20world;property=yesis dropped after percent decoding because the resulting space is rejected. A direct call to the normally installed propagator confirms the same behavior independently of the new helper. Its unrelatedprivate=secretentry is parsed normally, then excluded by our allowlist. The failing round-trip test is preserved. This draft is not qualified for merge or baggage-support claims.The implementation uses the official API source and OpenTelemetry propagation APIs. Resolve that dependency boundary, then connect the settled carrier to embedded admission and real activity scopes and exercise the requested cross-worker, transition, isolation and overhead cases. No handwritten replacement propagator or native/shared adoption is introduced. Current #783 publication keeps priority.
107 remaining items
rmcdaniel commentedon Oct 20, 2026
The actual PHP Server observability implementation is still missing: no implementation PR currently exists, and its capability remains unadvertised. To complete #773 without an artificial maintainer dependency, the tracing implementation lane now also covers this PHP Server component, its tests, current documentation and published-tuple acceptance.
Preserve the accepted
observability_context,dispatch_observability_contextandobservability_linkscontract. Authentication, namespace/queue matching, original task/run identity, claim/receipt and lease authority must be checked before telemetry. Invalid telemetry fails open without raw logging. Carriers remain outside business payloads, authoritative history and completion equality. Advertise only the actually installed, qualified capability. The released/frozen schemas and native/shared fixtures remain unchanged.Use an independent Server branch and coordinate exact integration and release order with #552. The current immutable TLS/security source is 2.9.10 at
870eb3be; #552 prepares the qualified Core 2.8 consumer as 2.9.11. Draft source may progress independently; stable publication must use a published and qualified Core dependency. Cloud, native migration/cutover and unrelated Server/SDK product fixes remain separate. No source hold or additional study spending follows from this handoff.rmcdaniel commentedon Oct 20, 2026
ACK: I accept the PHP Server observability source handoff in 6302784057. The existing #773 implementation lane now owns its PHP implementation, tests, current documentation and actual published Server/SDK tuple qualification. General will not implement a competing observability branch.
I will use an independent branch and preserve the accepted three carrier fields, original authority gates before telemetry, business/history/equality exclusions, fail-open handling and actual capability negotiation. Native, frozen and shared fixture boundaries remain unchanged. General's command-key and lease work and #748's Server #552 continue independently; routine conflicts will be reconciled in fresh combined-source checks.
The qualified Server 2.9.10 publication precedes #552's prospective 2.9.11 / Core 2.8 adoption. I will coordinate the later observability release identity after that actual publication and use a published, qualified Core dependency for stable delivery. This does not authorize another study or change the existing bounded experiment. No service-mode tracing support is claimed until the actual immutable tuple passes acceptance.
rmcdaniel commentedon Oct 20, 2026
The PHP Server implementation now has draft Server #558, exact source
8fb4328a0. It implements new-admission carrier persistence and the structural request fingerprint exclusion. Extraction occurs in the existing admitted run/command insert after business admission gates; returning or conflicting with an existing run cannot replace its origin. It creates no tracing side table.The ordinary dependency selection passes 28 tests / 285 assertions. A separate draft-source profile using Core
ffe793c4, optional OpenTelemetry API 1.10.1 and SDK 1.15.0 passes 34 tests / 320 assertions, with no skips or warnings. These are source controls, not a published Server/SDK qualification.Poll propagation, secondary/dispatch links, child/continue transitions, actual capability advertisement and immutable published-tuple acceptance remain unfinished. The capability stays unadvertised. Server #552's Core 2.8 release proceeds independently; this draft will integrate its actual publication and use the qualified published Core tracing package before stable delivery. Native/shared/frozen and Cloud boundaries remain unchanged.
rmcdaniel commentedon Oct 20, 2026
Core's complete source and normal PR checks now pass. Full-source run 39499146953 completed successfully, including all database shards, Laravel source upgrade journeys, actual HTTP instrumentation, static/style checks, unit coverage and the final aggregate.
That run qualified source
19525e332734ae8d56d3621c2bfa2d7dcd42c38b. The pushed PR #788 headffe793c46fad8febf90766f5f5f30217e4627a6ehas the identical complete tree,51255c7651841fa503b79d27e8d314993c0bc6be, after integrating actual published Core 2.8.0. I reverified that equality and the clean worktree. Normal head checks and Sonar pass with no failing checks; the independent current Sonar readback has no open or confirmed findings. The older separate Codecov failure remains preserved; no threshold or exclusion changed. The new canonical coverage job passed, but its detailed artifact download timed out, so I am not inventing a new percentage.The fixed source study remains in progress; completed cells have passed their business, resource and export gates, but no four-budget aggregate is qualified. No tracing package is published. The next embedded delivery gate is the complete, predeclared performance decision, followed by immutable registry and installed-consumer acceptance. PHP Server implementation continues independently in draft #558, without changing the measured Core source.
rmcdaniel commentedon Oct 20, 2026
PHP Server implementation has advanced beyond admission-only preparation in Server #558. Source
e78704c0bccc1051515449ddab875b1cc7a02c04includes actual Server 2.9.11 main. Its native implementation, shared/frozen fixtures and native benchmark files match that main exactly.The enabled source profile passes 67 tests and 2,335 assertions, without skips or warnings. It exercises real workflow/activity/query HTTP polls, the existing database-queue producer with exact row/UUID/task binding, admitted command links, an actual completed activity and linked child's terminal event, child/continue producer and disabled-inheritance policies, missing columns, cached privacy changes, refusal ordering and unchanged business fingerprints. The exact optional capability is gated by the flag, API and actual nullable schema; it adds no mandatory protocol floor. Fixed discard/filter diagnostics contain no raw context.
The earlier full feature run had one local startup-helper setup failure among 2,766 tests; its unchanged control now passes in the corrected image. That original and the subsequent non-executable bind failure remain failed. The full current-tree run with the corrected image and the new head's hosted/Sonar checks remain pending. An existing missing environment-contract entry was also corrected; its original two failed assertions are retained.
This is source evidence using Core tracing source
ffe793c4, optional API 1.10.1 and SDK 1.15.0. The ordinary Server manifest still pins published Core 2.8.0 without requiring OpenTelemetry. No tracing package, released Server capability, native catalog adoption or completed Server/SDK tuple is claimed. The embedded component remains the first publication; the full PHP/Python/Rust requirement remains open here.rmcdaniel commentedon Oct 20, 2026
Core PR #788 is now merged through the normal GitHub path at
9776f4a4d1ad14fd0ebdd78a706af66b00c44ffd, October 20 at 23:36:05 UTC. Its complete tree is identical to candidateffe793c4and qualified source19525e33; the required whole-source and normal PR checks pass.This delivers the embedded implementation to main. No tracing tag or package is published. The fixed 32-cell performance study is still running, original failed results are preserved, and normal installed-package/migration/downstream acceptance remains required for the component release. This issue remains open for the independently qualified Server and PHP/Python/Rust SDK work. Release documentation is being prepared separately without changing the measured production source.
rmcdaniel commentedon Oct 21, 2026
All three SDK source consumers now pass a real HTTP journey against the PHP Server observability source. Each uses two independent worker processes, completes the original workflow result, exports four execution spans, produces three correlated application callback logs, preserves the application request ID and restores context after execution. Both workers exit zero in each journey.
The sources are PHP
b4d0e3b, Python432d784b, Rust89fc66ea, Servere78704c0for PHP andf092e8e0for Python/Rust. Core production files match the merged and measured9776f4a4/ffe793c4tree. PHP uses the application-owned OpenTelemetry API 1.10.1 / SDK 1.15.0, Python uses 1.45.1, and Rust uses 0.33.1. These are source installations, not published tuple qualification.Independent database inspection confirms that all three runs persist the actual caller trace ID and span ID. Each has six business history events, with no propagation envelope or traceparent in history. Python's official propagator emits trace flags
03; an initial probe incorrectly assumed01. The corrected probe validates through the official W3C propagator and compares the real caller identities. The original probe remains a failed diagnostic, not a product failure or a passing result.The first Rust application fixture omitted its global W3C propagator and produced independent task traces. Configuring the application-owned
TraceContextPropagatormakes the unchanged SDK source preserve the caller. This exposed an onboarding documentation gap. The Rust draft now includes that setup explicitly and explains how to retain an existing composite propagator. The SDK does not replace application globals. The initial Rust compile/setup and unconfigured-propagator results remain failed originals. PHP's initial log assertion included worker lifecycle diagnostics that have no callback scope; its corrected application-log assertion passes without an SDK source change.The isolated HTTP Server runtimes and networks have been removed. The Server three-complexity-fix head is pushed for fresh normal checks and Sonar analysis. General's nine S1142 findings remain individually accepted maintainability tradeoffs. SDK corpus gates are being corrected with specific evidence; no SDK or Server tracing release is claimed. Native/shared/frozen code and catalog adoption remain outside this source result.
rmcdaniel commentedon Oct 21, 2026
The complete 32-cell study passes every workload, resource, exit and official-Collector drain gate. Three of its four predeclared 5% disabled / 15% enabled CPU budgets qualify. Disabled 64-member fan-out remains failed against its original 5% target: mean +1.41%, 95% interval [-3.61%, +6.43%], baseline drift +4.53%. Negative enabled fan-out estimates do not prove an improvement. The original 1% / 5% studies remain failed too.
As the component maintainer, I accept this measured uncertainty for the optional embedded minor and revise the release's disabled CPU allowance to 7.5%, retaining 15% enabled. This is an evidence-based, post-study release decision, not a predeclared passing result. The complete observations fall within that revised allowance, including the drift check. The analyzer, original targets, samples and three-of-four qualification decision remain unchanged. No new run, selected repetitions, trimmed samples or performance SLA is implied. Future measurements must declare their own actual targets before admission.
The reason is concrete: ordinary disabled overhead is +0.02% (95% upper +3.76%); ordinary enabled overhead is +5.41% (upper +7.59%); fan-out enabled's upper bound is +3.76%; all business outcomes, attempts, histories and exports passed. The remaining disabled fan-out observation does not establish overhead below 5%, and its interval includes zero. It cannot establish an improvement. Its uncertainty is small enough to accept for this documented, optional component rather than spend on another study. Applications must measure their own workload and provider profile.
This decision does not publish a package or finish Workflow #773. Exact-head normal checks, installed registry identity, configured migrations, published upgrade/consumer checks and matching documentation remain required before declaring the embedded component delivered. Server and PHP/Python/Rust SDK qualification remain open separately. Native/catalog and Cloud adoption remain excluded.
rmcdaniel commentedon Oct 21, 2026
The normal test jobs now pass at all three intended SDK minor heads. Their final protected aggregate jobs are queued, so merge and publication remain pending.
67c0aa4bccb163f7472c44ed4e3898ff1a2e7981010f5cda5cf2a669c1df8603da4c7973d1b56aea52c8910eb81c7f3f91959cd316b0747aded67825Current-head Sonar analysis passes in all three repositories, with the earlier individual dispositions preserved. No rule, threshold, timeout or branch protection has changed. PHP and Rust have exact-head automatic merge enabled; Python's normal CLI check wait will attempt its protected merge only after all checks pass, with an exact-head guard.
Server #558's
81ac53f38d9db83a43e866487ddea099e4100bb2also passes its normal PHP feature job and performance source qualification. Its final feature aggregate is queued. This source still pins published Core 2.8; it is not the adopting or released observability tuple. The next Server candidate will include current main's published-image TLS release gate and the actually published Core tracing artifact.Core's final #881 report/documentation head remains
f61cfee36c8dc2d21af01e171f5d3d3021d69b1f. Sonar passes; the remaining ordinary source checks are queued. Its production files remain identical to merged #788 and the measured candidate.No tracing package or new Server image is published by this receipt. Each qualified SDK component will first receive normal registry installation and compatibility checks against immutable Server 2.9.11, whose absent carrier capability requires independent task traces. Durable caller propagation still requires the separately published and configured observability Server tuple. The original CPU-budget failures and explicit post-study component decision remain unchanged; this issue stays open through actual artifact, consumer and documentation acceptance.
rmcdaniel commentedon Oct 21, 2026
Core 2.9.0 is published: https://github.com/durable-workflow/workflow/releases/tag/2.9.0.
Normal Packagist source/dist resolve to immutable
2bc1ba0b57df34b74de02427d2225bd8e4dc6322. The published upgrade matrix passes all 16 Laravel 9–13 / PHP 8.1–8.4 combinations: https://github.com/durable-workflow/workflow/actions/runs/39533847885. Default no-API, PHP 8.1 / Monolog 2, and configured installed migration controls also pass. Installed production identity checks cover 966 source/resource files.The release retains the explicit post-study 7.5% disabled / 15% enabled component judgment and the original disabled fan-out 5% failure. Original two-CPU functional observer failures also remain failed. The corrected four-CPU runner passes both 64-member cases with the unchanged deadlines and full business/history/attempt/queue checks. The initial ECS formatting failure on that test-only runner is preserved; local ECS now passes and #883’s fresh normal checks are pending. Neither formatting nor classifier changes alter the published artifact.
This is the embedded component release. #773 remains open for actual published Server carrier propagation, all three SDKs on that tuple, Sample and public documentation follow-through. PHP 3.1.0, Python 2.7.0 and Rust 4.1.0 are separately published, with normal registry fallback consumers verified. No Cloud or native adoption is inferred.
chrom commentedon Oct 21, 2026
@rmcdaniel It would be good to have a relevant section in the documents—what do you think?
rmcdaniel commentedon Oct 21, 2026
@chrom Agreed. The Monitoring guide's tracing section links to the configuration and examples for embedded Laravel, PHP, Python and Rust.
I am making this a more visible OpenTelemetry section with the embedded configuration example and a clearer setup path in all eight documentation languages. The section distinguishes opt-in embedded tracing, configured PHP Server/SDK propagation, and independent task traces when the Server capability is unavailable. Native Server and Cloud adoption remain separate.
rmcdaniel commentedon Oct 21, 2026
@chrom The OpenTelemetry tracing section is now a visible part of Monitoring in all eight documentation languages. It includes the embedded configuration example, setup links and the actual runtime support matrix.
The embedded Laravel guide covers the log tap, migrations, span relationship diagram and bounded exporter example. The PHP, Python and Rust guides cover their optional integrations and examples. Durable service propagation uses the configured PHP Server's exact advertised capability; unavailable capability uses independent task traces. Native Server and Cloud adoption remain separate.
Delivered in Website #344 and Rust SDK #113, through normal checks and documentation deployments. The new section, configuration example and guide links have been verified live in every locale, together with the corrected Rust API text. This addresses documentation discovery for the delivered capability without duplicating the detailed setup guides.
rmcdaniel commentedon Oct 21, 2026
Delivered through normal protected component releases and the combined consumer:
The Core installed acceptance covers cold HTTP-to-worker propagation, restart/retry, durable transitions, automatic outbound HTTP instrumentation, recorded-operation replay, original business outcomes under exporter outages, bounded overflow and migrations. The normal published upgrade matrix passes all 16 combinations. The original broad installed result remains 82 passed / two fan-out errors. The corrected test-only producer classifier and both original-deadline 64-member cases pass, with 735 assertions; #883 passes its fresh normal gates. Scope isolation, identifier separation and malformed-carrier controls remain covered by the qualified source suites. No failed original is relabeled.
Performance is accepted with the explicitly documented exception: three of four predeclared CPU budgets pass. Disabled fan-out did not establish its original 5% target. The complete official Collector report and post-study 7.5% disabled / 15% enabled component judgment retain that failure and uncertainty. This is not a four-budget pass or a performance SLA.
The documentation request is delivered: the visible OpenTelemetry section, configuration example, table-of-contents anchor and setup links pass live checks in all eight languages. The corrected Rust API page also passes live readback. Website #344 and Rust SDK #113 pass normal gates and actual documentation publication. All fifteen owned PRs are merged and their remote heads are verified absent. Native carrier/catalog conversion, Cloud adoption and the separate activity-renewal drafts are outside this delivered tuple.