Skip to content

Latest commit

 

History

History
493 lines (425 loc) · 28.2 KB

CHANGELOG.md

File metadata and controls

493 lines (425 loc) · 28.2 KB

Changelog

2.8.0 - Unreleased

  • Prepare optional embedded OpenTelemetry spans and log correlation across durable admission, tasks, activities, retries and recovery. Applications own providers, sampling, exporters and shutdown. Tracing is disabled by default.
  • Keep bounded observability context separate from business payloads, command equality and lease authority. Native catalogs and service wire adoption are separately qualified.
  • Require OpenTelemetry API 1.10.1 or later in the 1.x line when that optional API is installed, excluding the older incompatible baggage parser.

2.7.1 - 2026-10-20

  • Chunk long activity retry and workflow-task delays to the queue driver's dispatch ceiling, using the existing timer transport mechanism. SQS receives a delay of at most 900 seconds per wakeup.
  • Defer early workflow-task deliveries without taking a lease, running user code, consuming execution attempts or appending history. Preserve original task availability, retry history and workflow deadlines. Queue drivers without a delay cap retain their exact delays.

2.7.0 - 2026-10-20

  • Deliver eligible signals accepted during a remote workflow task before its successful terminal decision. Retain original deadlines and ordered message delivery through cold replay.
  • Carry eligible received instance-scoped signals with unapplied accepted updates across continue-as-new, preserving identities, payloads and command order. Run-scoped signals keep their selected run.
  • Close signals a terminal run did not apply with an explicit rejected status, reason, timestamp and linked history event. Keep the original durable acceptance receipt unchanged.
  • Keep missing legacy declarations unknown. A receipt alone cannot establish a handler or authorize continuation handoff; unresolved signals close explicitly.
  • Upgrade all direct database readers before recording SignalRejected. Older Core history enums cannot parse the new event; drain old readers during the upgrade and do not roll them back onto affected histories.

2.6.3 - 2026-10-19

  • Exclude retention-pruned runs from missing run-summary drift and lag metrics. Retained runs still count in the drift report's total run count.
  • Skip marked pruned runs in every projection rebuild mode, including explicit run and instance selection. Genuine missing projections remain eligible for repair. Unmarked legacy absence is not assumed to be deliberate pruning.

2.6.2 - 2026-10-18

  • Reuse small unchanged JSON history payloads on the default Eloquent model to avoid decoding them again on each read. Cached entries are limited to 4 KiB of JSON and 128 recursive values. Larger payloads use the ordinary cast, without a new workflow data or admission limit.
  • Preserve configured models, custom casts and JSON decoders, payload mutation, raw stored bytes and model serialization. This change does not enable retained workflow execution or establish a production performance gain.

2.6.0 - 2026-10-18

  • Deliver cooperative cancellation to a caller waiting for an owned Nexus service workflow to complete. The caller waits for the target's cleanup and resumes at its original service-call boundary.
  • Preserve the original call, cancellation lineage and cleanup deadline through duplicate requests and cold replay. Calls returning an existing workflow do not acquire cancellation authority over it.
  • Service-mode callers require a compatible runtime and SDK with the nexus_cooperative_cancellation capability. Upgrading this package alone does not update a pinned Server image or SDK.

2.5.15 - 2026-10-13

  • Preserve unclaimed database-queue jobs when SQLite refuses a reservation write and the original root transaction has fully rolled back. Laravel's worker reports the error and reselects work without failing the workflow before its handler runs.
  • Install the guard for the default SQLite database connector on affected Laravel 12/13 versions. Preserve custom connectors, queue managers, other database drivers and existing handling of invalid jobs or uncertain transaction outcomes.
  • Restart queue workers after upgrading. Already failed workflows remain failed.

2.5.12 - 2026-10-11

  • Enforce a Nexus service call's original deadline during admission, background repair and terminal transitions. Duplicate requests, retries and catalog edits preserve the original budget. Late target completion cannot replace the caller's typed timeout.
  • Validate relative and absolute deadline policies and preserve UTC microsecond precision. The migration backfills deadlines from original stored acceptance times and rejects unsupported historical policies with the affected call ID. Back up the database and replace old application and worker processes before applying the migration.

Unreleased

  • Check for the engine's tables on the configured workflows.storage.connection instead of the application's default connection when gating the V2 task watchdog, worker-compatibility heartbeats, and the v1 watchdog. With a dedicated storage connection those gates were always false, so expired leases were never repaired and activity timeouts never enforced. Behaviour on the default connection is unchanged.

2.5.7 - 2026-10-10

  • Reuse a workflow's first patch or version decision for repeated calls without recording duplicate markers. Continue validating every call's supported range.
  • Replay duplicate markers from older releases without changing their history positions or the recorded clock values observed by retained calls. Executor, query reconstruction and fiber replay share this compatibility behavior.

2.5.5 - 2026-10-10

  • Preserve complete terminal cancellation and termination diagnostics when a reason contains a literal NUL. History and failure rows use the same lossless JSON string literal on every supported database, while Avro keeps the original reason. Ordinary messages and SDK cancellation results retain their behavior.

2.4.6 - 2026-10-06

  • Keep an explicitly supplied run authoritative during task compatibility resolution, including when its marker is null. Avoid the redundant run relationship lookup and lazy-loading violations reported in #636. Preserve task-marker precedence and the fallback for callers that do not supply a run. Thanks to @vanducng for the report, fix and regression tests in #637.

2.2.20 - 2026-09-29

  • Require patched Laravel 12.69.0 or 13.30.0 minimums for the current framework lines. The existing legacy upgrade policy tracks the debug-page XSS advisory on Laravel 9 through 11, where an upstream patch is unavailable.
  • Preserve UTC archive instants when hydrating workflow runs and their summaries in applications with a non-UTC timezone. Archive commands read the UTC clock explicitly, and archive timestamps retain microseconds and their original metadata across repeated commands.

2.0.17 - 2026-09-22

  • Resolve a committed caller-supplied workflow identity from a current MySQL read when a concurrent start wins after the caller's repeatable-read snapshot. Duplicate-start policy, durable-type validation, and transaction rollback remain intact.

2.0.16 - 2026-09-21

  • Recover missing or stale history-budget summaries without sorting large payloads or exhausting MySQL's regular-expression work limit. Exact byte counts and first-valid parallel-group fan-out are preserved.
  • Select worker history-page keys before loading payloads, keeping large inline values out of MySQL's sort buffer without changing page size, order, or leases.

2.0.15 - 2026-09-21

  • Let readiness callers preserve original schema-inspection exceptions through WaterlineEngineSource::status(throwOnInspectionFailure: true). Temporary database connection failures can then be distinguished from genuinely missing tables. Default Waterline diagnostics and engine selection are unchanged.

2.0.14 - 2026-09-12

  • Isolate deterministic workflow clock values from caller mutation. Deriving a deadline with Workflow::now()->addHour() no longer advances workflow time or expires the deadline immediately. Mutating a timestamp supplied to the fiber context cannot change its stored time either. History-based clock advancement, timestamp precision, timezones, and mutable or immutable Carbon types remain unchanged.

2.0.13 - 2026-09-11

  • Reduce repeated database lookups during full timeline, wait, and timer projection, and reuse activity and timer metadata within a summary pass. Existing model hooks, configured tables and connections, duplicate-key recovery, and history-based repair remain intact. This reduces repeated projection overhead without changing durable history or execution semantics.

2.0.12 - 2026-09-10

  • Preserve fractional timestamp precision when selecting due schedules. SQLite schedules now dispatch during their original due second instead of waiting for a later tick; fractional deadlines remain exact on supported databases. Future deadlines are not dispatched early, and repeated ticks preserve the original occurrence identity without starting it twice.

2.0.11 - 2026-09-09

  • Preserve activity deadlines after an expired worker lease is repaired. Pending and repaired activities cannot start another attempt after an elapsed deadline, and the normal timeout sweep can settle the expired current attempt. Schedule-to-close timeouts remain terminal across worker restarts without accepting a late completion or running an extra activity effect.

2.0.10 - 2026-09-09

  • Recognize Laravel's native mariadb database driver in backend readiness and capability reporting. MariaDB no longer appears unsupported when configured with its own driver instead of mysql. Both driver paths retain real-database locking and history checks; the native driver also exercises readiness and replay.

2.0.9 - 2026-09-09

  • Terminal activity timeouts restore their recorded exception type during replay, allowing workflow catch and finally blocks to recover and clean up. This also covers local activities and existing persisted timeout histories; applications do not need an exception mapping to resume them.

2.0.8 - 2026-09-08

  • Concurrent embedded child completions persist their outcomes before checking the parallel barrier, preventing a lost parent wake-up under MySQL repeatable reads. Existing repair paths recover stranded parents from durable child terminal history without rerunning completed children.
  • A child that handles an activity failure and completes no longer propagates historical failure metadata as its result. Genuine terminal failures retain their own failure identity across embedded and service-mode completion paths.
  • Parent-notification errors roll back the workflow task for repair instead of appending a workflow failure after completion. This does not rewrite existing histories that already contain contradictory terminal events.

2.0.7 - 2026-09-08

  • Activity metadata projections no longer download or decode external arguments and results merely to inspect lifecycle state. Summary, task, wait, and parallel child checks preserve typed history and attempt metadata without payload-sized memory allocations. Explicit decoded activity views retain their existing behavior.

2.0.6 - 2026-09-08

  • Nexus service-call history projects started, completed, failed, and cancelled events without failing workflow-task completion. Timeline entries retain the service-call identity and summarize the operation without exposing its payload.

2.0.5 - 2026-09-06

  • Early queue delivery no longer exhausts activity or timer transport attempts. Fractional-second wakeups round up without changing durable deadlines; early wakeups use fresh jobs while business retry limits remain unchanged. Long SQS timers relay through capped 900-second dispatches.

2.0.4 - 2026-09-06

  • Durable finally cleanup survives ordinary workflow-task suspension and discarded replay Fibers. Cleanup activities, timers, and memo writes retain normal success/failure replay behavior without running during local teardown.

2.0.3 - 2026-09-02

  • Schedule ticks share bounded due-work and buffered-drain batches across namespaces while preserving oldest-first order within each namespace.

2.0.2 - 2026-09-01

  • Workflow 2.0.2 reports its stable package identity through the platform conformance API, allowing published-package verification after the 2.0 launch.

2.0.1 - 2026-09-01

  • Workflow 2.0.1 keeps PHP exception traces Avro-portable when argument capture is enabled, preserving each frame's durable fields while omitting object and resource values that cannot cross the public payload boundary.

2.0.0 - 2026-09-01

  • Workflow 2.0.0 promotes the fully qualified release-candidate runtime to the stable 2.0 line without changing its durable execution behavior.

2.0 prerelease history

  • Workflow 2.0.0-rc.55 treats the official stable-v1 Y and Base64 serializer settings as nonblocking migration diagnostics while v1 runs drain, without changing the Avro-only codec used for all new v2 payloads.

  • Workflow 2.0.0-rc.54 validates service-mode parallel groups in the durable yielded-command sequence domain, so signal-resumed condition waits retain flat and nested mixed-group identity across cold replay and worker replacement.

  • Workflow 2.0.0-rc.53 preserves durable rejection reasons in history-export command rows whose request payload is stored externally, matching run-detail audit output while keeping accepted-command payload reasons private.

  • Workflow 2.0.0-rc.52 preserves the durable rejection reason on rejected signal command audit rows after a fresh read, including when the request payload is stored externally. Platform conformance suite 47 now pins the invalid-argument and unknown-signal audit shapes and their no-mutation invariants.

  • Workflow 2.0.0-rc.51 keeps retained protocol 1.18 local-activity attempt, heartbeat, and retry-policy objects open to additive worker fields while protocol 1.19 preserves the final closed report grammar. The package-owned rolling-upgrade metadata states the 1.19 attempts requirement and nested shape boundary explicitly so dependent current protocol mirrors can select the same negotiated behavior.

  • Workflow 2.0.0-rc.50 reconstructs portable local-activity attempts as a non-overlapping timeline using reported durations and retry backoff. Each heartbeat timestamp is derived from its attempt start, aggregate heartbeat state retains the chronologically latest report, and history snapshots now expose lifecycle-correct running, retry, and terminal states through cold persistence, export/import, and replay.

  • Workflow 2.0.0-rc.49 finalizes the portable local-activity command as an ordered record_local_activity.attempts report. Worker attempt identity is preserved independently of durable server attempt identity across every attempt-scoped history event, cold persistence, export/import, and replay. Reported heartbeat elapsed time now determines persisted heartbeat time instead of workflow-task completion time. Negotiated protocol 1.18 completions that predate attempt reports remain accepted as one terminal attempt, while protocol 1.19 selects the strict ordered report grammar.

  • Workflow 2.0.0-rc.48 makes SDK-reported local-activity attempt sequences authoritative. The command grammar rejects unordered, contradictory, or over-limit attempts and heartbeats, while service-mode completion projects each attempt and terminal failure into the same operator-facing records used by embedded execution. Worker-reported attempt identities remain scoped to their activity executions while server-owned ULIDs keep durable attempt and history references globally safe. Platform conformance suite 47 publishes this typed grammar without changing the retained protocol 1.18 bytes.

  • Workflow 2.0.0-rc.48 owns method-dependency resolution across supported Laravel versions, including contextual attributes, enum defaults, supplied class parameters, and self and parent parameter types. The v2 unit suite now publishes a machine-readable, branch-bound coverage summary and enforces a non-decreasing baseline against the complete production source inventory.

  • Workflow 2.0.0-rc.48 adds deterministic durable selection and structured concurrency for activities, child workflows, timers, signal waits, and condition waits. Persisted winner markers remain authoritative across cold replay, non-winning handles can continue, be awaited, or be cancelled, and service workers share the same protocol-gated selection identity and member key contract as the embedded Laravel runtime.

  • Workflow 2.0.0-rc.47 defines the host-facing workflow control plane around ordinary workflow operations. Protocol 1.18 adds authoritative local-activity command normalization and atomic attempt, heartbeat, retry, failure, timeout, cancellation, and result history so replay never repeats a recorded local side effect. Platform conformance suite 46 publishes the retained protocol 1.18 OpenAPI and AsyncAPI authorities for local activities, worker sessions, and sticky execution while preserving the immutable 1.17 artifacts. Reserved message-stream delivery uses a separate runtime-only interface implemented by the default control plane, while public signals remain unable to inject the reserved transport name. The release audit also dereferences every advertised current and retained worker-protocol resolver and verifies its SHA-256 digest before accepting the public conformance mirror.

  • Workflow 2.0.0-rc.45 preserves an SDK-authored condition-wait occurrence identity across open, satisfied, timed-out, and timeout-timer history. Signal- and update-driven physical re-evaluations retain that identity, so adjacent authored waits remain independent without inferring identity from condition keys or predicate fingerprints. Worker protocol 1.17 gates the occurrence field and registration capability so older Server nodes reject the command before execution instead of silently dropping its replay identity. Platform conformance suite 45 publishes the versioned 1.17 OpenAPI and AsyncAPI authorities and retains the prior 1.16 bytes.

  • Workflow 2.0.0-rc.44 separates the packaged history-export schema carrier path from its retained immutable origin. Runtime manifest validation and the published-package audit now enforce the same release, origin path, resolver, artifact, and digest tuple while continuing to verify resolver bytes against the current package carrier.

  • Workflow 2.0.0-rc.43 preserves canonical search-attribute type identity through worker completion, full and paginated history, database restart, and replay. Worker protocol 1.16 gates declared type metadata so older Server nodes reject it instead of silently inferring a different type, while legacy events without metadata retain an explicit unknown-type compatibility rule. Platform conformance suite 44 publishes the versioned 1.16 OpenAPI and AsyncAPI authorities and retains the prior 1.15 bytes.

  • Workflow 2.0.0-rc.42 makes non-indexed memo updates portable across service-mode workers. PHP workflow authoring emits the language-neutral Avro payload-envelope command and consumes only entry-matching memo history during execution, cold replay, and query replay. Memo history and the authoritative memo projection retain lossless Avro envelopes across database reloads, preserving numeric branches, binary values, and map identity. Memo patches are normalized independently of the current run state, while structural key and encoded-size limits are enforced on the merged memo so at-limit replacements remain valid. Integer-like top-level keys are rejected before a host runtime can coerce their portable map identity. History exports keep that envelope as the import authority while exposing a separate JSON-safe memo projection, so export/import preserves exact memo identity for operator readback and replay after a fresh database boundary. Platform conformance suite 43 retains the version-one export schema bytes while binding version two to the JSON-safe projection and lossless Avro memo authority at the candidate's retained Workflow release source.

  • Workflow 2.0.0-rc.41 removes the unsupported root Composer Dependabot update path for this lockfile-free library. GitHub dependency alerts remain enabled, automated security-fix pull requests remain disabled, and the scheduled per-major Composer audit continues to reconcile Laravel 9-13 with the accepted-risk policy.

  • Workflow 2.0.0-rc.40 raises the embedded runtime's Laravel minimums to 9.52.17, 10.48.29, 11.44.1, 12.61.1, and 13.12.0 so every supported major receives all available upstream fixes. Laravel 9-11 remain available for embedded upgrade and drain paths, but upstream has not patched their remaining active advisories; applications on those lines should move to Laravel 12.61.1 or Laravel 13.12.0 and newer. A scheduled per-major Composer audit now owns this library dependency instead of Dependabot trying to infer one installed version from the package's intentionally unlocked multi-major constraint.

  • Workflow 2.0.0-rc.39 keeps database-backed Watchdog chains on fresh delayed jobs, preserving queue affinity without accumulating attempts. A generation lease converges duplicate ticks and safely releases ownership when successor dispatch fails.

  • Workflow 2.0.0-rc.38 publishes worker protocol 1.15 as the current conformance authority. The package contract and retained OpenAPI and AsyncAPI specs now define the version-gated message-stream completion fields together.

  • Reserved runtime delivery now keeps durable message-stream input separate from user-authored one-shot signals. The Workflow package source advances to 2.0.0-rc.37 with worker protocol 1.15 for portable stream consumption.

  • Service-mode workflow tasks can now merge non-indexed memo metadata through the language-neutral upsert_memo command. The runtime records canonical replay identity and merged projection data, preserves memo across continue-as-new, enforces structural limits, and fences duplicate task completions.

  • Standalone child-workflow completion now applies the recorded parallel-group path before resuming the parent. Successful child-only and mixed groups wait for every member, serialize concurrent child closures on the parent run, and create a single replay task while preserving retry and fail-fast behavior.

  • Advanced the Workflow package source to 2.0.0-rc.36 for the service-mode child-completion barrier.

  • Standalone workflow-task completion now validates and records deterministic parallel activity, child-workflow, and timer metadata. Nested groups must be complete and sequence-aligned before transport, and timer waits now expose the same group/path diagnostics as activity and child waits.

  • Advanced the Workflow package source to 2.0.0-rc.34 for the service-mode parallel-group contract.

  • Advanced the Workflow package source to 2.0.0-rc.33. Laravel now container-constructs embedded v2 workflow and activity classes before the engine binds durable runtime context. A package-owned transition contract, isolated v2 queue default, upgrade-status command, supported-intersection matrix, and published-artifact smoke make the stable-v1 to embedded-v2 path executable without transferring v1 history.

  • Advanced the Workflow package source to 2.0.0-rc.32. History import now validates Avro codec declarations only at schema-owned payload rows and envelopes, preserving codec-looking memo and search-attribute data while real non-Avro payload declarations continue to fail closed.

  • Platform conformance suite version 41 makes the lifecycle-neutral worker protocol OpenAPI bytes the current conformance authority. The former beta-worded binding remains available only through its explicit historical identity, while protocol version 1.13 and every wire shape remain unchanged.

  • Advanced the Workflow package source to 2.0.0-rc.14 for the corrected conformance authority. Durable Workflow 2.0 remains a release candidate.

  • Platform conformance suite version 40 publishes the revision-bound CLI output-schema manifest and its complete JSON envelope plus JSONL record schema closure with HTTPS identities and SHA-256 byte bindings. The suite-39 revision remains retained with its original bytes.

  • Advanced the Workflow package source to 2.0.0-rc.13 for platform protocol catalog 16. Its conformance bindings resolve the catalog and protocol-spec bytes through immutable public documentation provenance. The aggregate recommended product tuple remains RC5 until independently published release-candidate artifacts pass exact-current qualification.

  • Historical command-contract gaps remain visible in operator metrics without warning fleet correctness once their runs are closed. Open runs still warn when operator command forms lack required safety data.

  • Projection repair can be limited to one namespace, and resolved wait snapshots now compare absent optional values consistently with projected nulls so repeated repair is idempotent.

  • Replaced the prerelease JSON-in-Avro wrapper with the fixed recursive durable_workflow.protocol.Value schema and standard Avro single-object framing. Native adapters now preserve booleans, signed 64-bit integers, finite doubles, bytes, UTF-8 text, lists, and string-keyed maps.

  • Added a backup-first prerelease-history migration that recursively rewrites inline and external wrapper copies in retained event snapshots. Replacement external objects receive verified hashes and sizes while original objects remain recoverable, and affected exported histories must replay before the migration reports success.

  • Removed the package-owned hosted control-plane and runtime-target contract. Embedded Laravel, independent self-hosted Server, and managed Cloud remain separate deployment choices; Cloud placement stays behind the namespace endpoint.

  • Platform conformance suite version 37 Rust signal/query scenarios install the exact synchronized durable-workflow =2.0.0-rc.5 crates.io artifact, with prior observed bindings preserved by source revision and digest.

  • Embedded and standalone activity heartbeats now use the same attempt-before-execution row-lock order as timeout enforcement. Accepted heartbeats renew the current attempt deadline, while stale scanner snapshots cannot time out live, replaced, or already-closed attempts.

  • Release recovery now accepts release-candidate plans only when they retain a coherent immutable beta qualification. The versioned recovery-consumer conformance contract and release-docs audit now cover the rc channel.

  • Release-plan recovery now consumes immutable, exact-version release-note preparation authority before publishing a newly recorded plan.

  • Explicit release recovery rejects terminally superseded plans before and after publication preflight while keeping completed-plan verification idempotent.

  • Standalone workers now receive accepted declared signals even when the host has no embedded workflow definition or local wait projection. Signal tasks retain command order ahead of queued updates, and QueueFake update completion uses the configured workflow-run model query. Accepted signal inputs are also persisted on their history event so public-history consumers observe the same values as workers and query replay.

  • Workflow-task claims and renewals now resolve workflows.v2.workflow_task_lease_seconds at runtime across remote, queued, timer, local-activity, and repair-driven execution paths. Embedded Laravel hosts retain an explicit 300-second default and may set DW_V2_WORKFLOW_TASK_LEASE_SECONDS before caching configuration.

2.0.0-alpha.179

Workflow 2.0.0-alpha.179 keeps the Durable Workflow 2.0 PHP package conformance claim aligned to platform conformance suite version 12. For this alpha, upgrade-path migration runtime coverage remains outside the release claim; claiming that category requires a versioned migration scenario manifest and published-artifact conformance evidence.

  • php artisan workflow:v2:replay-conformance now reports outcome: pass when every Workflow PHP replay shard scenario passes, so host replay conformance can compose the PHP shard with Python and server evidence without treating the shard itself as non-passing.