Skip to content

v4.12.15

Choose a tag to compare

@acn-ericlaw acn-ericlaw released this 23 Sep 01:37
· 36 commits to main since this release
Immutable release. Only release title and notes can be modified.

Version 4.12.15, 9/22/2026

The lock-step round with the engines: the pack moves from 4.12.1 to 4.12.15, the number the Java engine and the
Rust port ship in the same round (conv-ports-adopt-java-release-number — a version names content, not a
cadence). Interop evidence for this release: the four-runtime OpenTelemetry certification drive of 2026-09-22 —
this host's forwarder and llm.stream node under both engines' edges, one connected trace per request, confirmed
in the backend UI (docs/test-reports/otel-dynatrace-certification.md). Off by default; nothing to configure.

Added

  • The OpenTelemetry trace forwarder (mercury_composable.otel), the lock-step twin of the
    engines' opentelemetry-forwarder extension: with otel.forwarding=true the host hands
    every distributed-trace dataset it emits to the engines' extension route
    distributed.trace.forwarder, where the built-in forwarder maps it to one OpenTelemetry
    span carrying the host's exact W3C ids and exports it over OTLP/HTTP (protobuf) - the same
    otel.* keys, span mapping, per-export credential headers, retry policy and failure
    diagnostics as the Java and Rust forwarders. No OpenTelemetry SDK and no new dependency:
    the encoder is the Rust port's hand-written OTLP writer, ported. Off by default.
  • The distributed.trace.forwarder extension route itself: a function an application
    registers under that name receives every emitted dataset (delivered without a trace, so
    the forwarder's own execution emits none) - the engines' zero-tracing forwarder contract.

Changed

  • The forwarder's span kind now follows the engines' connected-span-tree rule: the record whose
    service is http.request - an engine edge's round-trip record - is the SERVER span, and every
    function execution is INTERNAL (a record's from no longer decides the kind). A host's own
    records are function executions, so a backend now shows them as INTERNAL hops under the
    calling engine's edge span.

  • The demo AI nodes' default Gemini model is the stable alias gemini-flash-latest: the dated
    gemini-3.6-flash id is no longer served (404 on a current key) - the alias moves with the
    provider's current flash model. llm.model / params.model still pin a specific id.

  • The demo application.yml carries the otel.* keys switched off, wired to the
    OTLP_API_ENDPOINT, OTLP_AUTH_HEADER and OTLP_TOKEN environment variables, so
    -Dotel.forwarding=true at run time is enough to export to a backend.