Skip to content

Changelog — page 5

New features, improvements, and fixes in the Fluxzero SDK.

GitHub

1.292.20 (2026-10-05)

Bug Fixes
  • testing: await self-tracking registration before dispatch (GitHub)

    Coordinate asynchronous fixture discovery with handler registration so a concurrent first message cannot pass the consumer before its handler exists. Preserve initialized handlers and reentrant discovery, and retain failed registration outcomes without retrying partial work.

Tests
  • testing: reuse the maintenance SDK test worker (GitHub)
GitHub

1.292.19 (2026-10-05)

Bug Fixes
  • identity: prevent concurrent provider initialization deadlock (GitHub)

    Move shared default-provider discovery to a field-only parent interface so concurrent first use cannot form a class-initialization cycle. Preserve ServiceLoader selection, concrete providers and inherited field access.

  • release: retain original UTC dates in release titles (GitHub)

    Preserve version visibility and publication dates across release creation, reruns and recovery.

  • release: retain UTC publication dates in maintenance titles (GitHub)
Dependency updates
  • bump ch.qos.logback:logback-classic from 1.6.4 to 1.6.5 (GitHub)

    ch.qos.logback:logback-classic: 1.6.4 -> 1.6.5 changelog

GitHub

2.15.0 (2026-10-04)

Features
  • modeling: preserve current assertions through apply interception (#455) (GitHub)

    @InterceptApply now supports assertCurrent = AssertCurrent.DEFAULT, ENABLED or DISABLED. When enabled, the current input is checked within the same commit attempt before interception, even if the interceptor replaces, splits or suppresses it. Effective outputs retain their normal legality checks.

    Deferred current-input assertions keep their payload context and see the final composed state: the end of the atomic Model operation (including automatic deletion), or the existing handler-completion boundary for Aggregate/Entity. Model assertion reads participate in conflict detection and retries.

    Existing applications retain their current behavior. Enable the new default with fluxzero.defaults.version=2026.10.04 or set fluxzero.interceptApply.assertCurrent=true. Explicit interceptor settings take precedence. Unchecked legacy apply and replay are unchanged. This feature requires only the SDK update; no Runtime upgrade or wire-format change is needed.

    Java/Kotlin agent guides, developer documentation and Javadocs describe replacement chains, split ordering, suppression, deferred checks, overrides and concurrency.

  • modeling: preserve current assertions through apply interception (GitHub)

    Allow each interceptor to validate its current input within the same commit attempt, including replacements, splits and suppression. Retain deferred checks against the final state and protect Model assertion reads against conflicts.

    Keep existing defaults and unchecked/replay paths intact. Enable the new default from 2026.10.04, with application and interceptor overrides.

GitHub

2.14.1 (2026-10-04)

Bug Fixes
  • modeling: load current boundaries for cascading assertions (#456) (GitHub)

    A lagging child cache can hide a changed parent, accepting a closed scope or rejecting a reopened one. Establish the storage boundary before loading known targets with matching cascade rules, while preserving active commit boundaries and unaffected paths.

Documentation
  • tracking: clarify consumer error policy recovery (#453) (GitHub)

    Recommend the logging default and explain explicit restart, retry filtering and repeatable effects across API guidance and Java/Kotlin examples. Consumer behavior and API signatures remain unchanged.

GitHub

2.14.0 (2026-10-04)

Features
  • modeling: cascade legality rules across known descendants (#452) (GitHub)

    Declare a shared business rule once on a Model and apply it to that Model and its locally known descendants. For example, a closed Project can prevent further changes to its Tasks and their children:

    @AssertLegal(cascade = true)
    void assertOpen() {
        if (closed) {
            throw new IllegalCommandException("This project is closed.");
        }
    }

    Normal payload and context injection remains available. Use allowedClasses to select payload families, @Parent(validateAncestors = false) to stop one inheritance route, or @Apply(ancestorValidation = AncestorValidation.DISABLED) to permit a particular child mutation.

    The SDK checks all enabled known parent routes, including both sides of a move and automatically deleted children. Ancestor reads participate in atomic conflict validation: RETRY reevaluates and guarded ACCEPT attempts use FAIL to prevent stale permission. Replay does not execute these assertions.

    This feature is opt-in and SDK-side; writers need the relevant Model classes and rules. It adds no new Runtime protocol requirement. The developer guide and Java/Kotlin agent guides explain timing, exceptions, concurrency and performance.

  • modeling: guard known descendants with cascading assertions (GitHub)

    Allow Model-owned legality rules to guard known parent routes with explicit relationship and Apply exceptions. Protect validation reads across compound changes, automatic deletions and concurrent reparenting; reject guarded ACCEPT conflicts instead of retaining stale permission.

GitHub

2.13.0 (2026-10-04)

Features
  • modeling: preserve document metadata and expose contract diagnostics (#449) (GitHub)

    Preserve source document metadata during migrations, expose bounded Model contract diagnostics, and define snapshot retention as a cleanup target.

  • modeling: expose bounded contract diagnostics (GitHub)

    Model read failures now carry useful contract and operation context while retaining their existing exception superclass and original cause. Explicit, bounded, namespace-scoped diagnostics help identify missing or incompatible local contracts without claiming replay compatibility or importing types automatically. Existing functional exception handling remains unchanged.

Bug Fixes
  • search: preserve stored metadata during document migration (GitHub)

    Higher-revision @HandleDocument replacements now retain the metadata from the exact stored document, including through upcasting. Returning a Message explicitly replaces payload and the complete metadata map; document identity and indexed-time rules remain unchanged. Custom serializers can retain source attribution with DocumentMessageReader.retainSource. Metadata-free documents use a lightweight path that avoids rebuilding document entries.

Performance Improvements
  • search: avoid rebuilding metadata-free document entries (GitHub)

    Scan stored document paths before reconstructing metadata and skip discarded strings without allocating them. Reuse the original parser when metadata exists so duplicate ordering and source attribution remain intact.

Documentation
  • modeling: define snapshot counts as cleanup targets (GitHub)

    Snapshot count documentation now describes maxSnapshotCount as a cleanup target: concurrent writes may temporarily retain extra snapshots, which a later bounded write cleans up. Unlimited retention and snapshot durability remain unchanged.

  • search: clarify custom serializer source attribution (GitHub)

    Explain explicit source transfer when serializers reconstruct document envelopes and distinguish replacement payload and metadata from ignored Message envelope fields.

Tests
  • modeling: wait for reindex contract assertions (#451) (GitHub)

    Retry pending projection and cutoff assertions and propagate unrelated failures before guarded reindex checks proceed.

  • modeling: wait for reindex contract assertions (GitHub)

    Retry pending projection and cutoff assertions instead of silently accepting them. Propagate unrelated failures so guarded reindex checks cannot proceed before their prerequisites hold.

GitHub

2.12.0 (2026-10-04)

The new reindex and completion requests require Runtime 2.6.0 or newer. Upgrade Runtime before applications use them.

Features
  • modeling: reindex current Graph sources with AWAIT completion (GitHub)

    Graph.reindex() refreshes one Model node's canonical search source from its current committed state. It can backfill a missing source when complete event history is retained, and it preserves Model history, relationships, heads and business events. Historical or staged Graph values are ignored.

    A bounded consumer's fixed maxIndexExclusive uses durable source storage-time evidence to skip already refreshed nodes before replay or another write. Choose the cutoff after old writers and pending materializations have drained; retain the same cutoff across retries and restarts. Descendants require separate calls.

    With AWAIT completion, reindex waits until affected stored Graph projections—including ancestors—are queryable, even when the source write is skipped. Other completion modes retain asynchronous derived work.

    The new reindex and completion requests require Runtime 2.6.0 or newer. Older Runtimes reject unsupported requests rather than silently weakening the completion contract. Upgrading Runtime first avoids temporary reindex failures during application rollout.

    Reindex source transactions can temporarily delay ordinary namespace commits. Bound concurrency for bulk migrations; the projection wait itself holds no Model write lock.

GitHub

1.292.18 (2026-10-04)

Documentation
  • tracking: clarify consumer error policy recovery on 1.x (#454) (GitHub)

    Recommend the logging default and document the recovery boundaries of retrying and throwing policies. Align the maintained guides and legacy Java/Kotlin manuals with existing 1.x behavior.

GitHub

Document migration metadata preservation

Higher-revision @HandleDocument replacements now preserve metadata from the exact stored document, including through upcasting. Returning a Message explicitly replaces the payload and complete metadata map; existing document identity, timestamp precedence and deletion behavior remain unchanged.

Metadata-free documents use a lightweight scan that avoids rebuilding document entries. Custom serializers that create new envelopes or decoded messages can preserve source attribution with DocumentMessageReader.retainSource; the extension contract is documented in Javadoc.

This is the SDK 1.x maintenance backport of the fix released in SDK 2.13.0. It retains the 1.x serialization implementation and does not introduce Model diagnostics or other 2.x features.

Full changelog: https://github.com/fluxzero-io/fluxzero-sdk-java/compare/1.292.16...1.292.17

GitHub

2.11.0 (2026-10-03)

Graph-returning document handlers now migrate canonical Model nodes by default. Upgrade all Runtime projectors to 2.5.7 or newer before running migration workers, and pause those workers during mixed-Runtime rollout.

Features
  • modeling: migrate canonical nodes from returned graphs (GitHub)

    Graph-returning @HandleDocument handlers now migrate verified current canonical Model nodes by default, including projection mode NONE. Use graphMigration = GraphMigrationTarget.PROJECTION to retain projection-only migration. This default changes immediately in 2.x, without a defaults-version gate.

    Deploy all Runtime projectors on Runtime 2.5.7 or newer before starting or resuming schema migration workers. Pause existing schema migration workers while old and new Runtime instances coexist. The previous Runtime accepts the same source-rewrite protocol but still performs broad type rebuilds and does not understand the additional schema fence.

    Handler completion confirms canonical node storage; derived projections follow durably, including for AWAIT Models. Schema migration preserves Model history and business state and is idempotent per node, rather than atomic across the entire Graph.

GitHub

2.10.1 (2026-10-03)

Documentation
  • guides: renew agent-led building and developer documentation (#445) (GitHub)

    Align onboarding with the product cloud and make builder journeys, tooling and developer tasks easier to find. Add consistent guide presentation while retaining existing page URLs and programming examples.

Chores
  • modeling: mark Aggregate for removal in SDK 3.0 (#446) (GitHub)

    Mark Aggregate as deprecated for removal in SDK 3.0 while retaining its existing behavior in 2.x. Direct new domain state to independent Models and require deliberate migration of existing Aggregate data.

    Align Javadoc, developer guides and agent documentation. Keep Member supported and non-deprecated, including within Stateful handlers.

GitHub

2.10.0 (2026-10-03)

Features
  • modeling: support current document values in historical graphs (#444) (GitHub)

    Use the current DOCUMENT-only value for the same canonical ID when its historical value is unavailable, including recreated identities, while preserving historical relationships and proven absence. Keep mutation reads strict.

    Expose immutable strict(boolean) views and an isStrict() getter, with a standalone application property and no defaults-version threshold. Preserve existing behavior with older Runtimes so either component can be upgraded first; the new historical reads become available when Runtime metadata support is deployed.

GitHub

2.9.5 (2026-10-03)

Bug Fixes
  • proxy: default HTTP2 response headers to 16 KiB (#442) (GitHub)

    Give HTTP2 a separate 16 KiB response-header ceiling so small HPACK buffers fit the shared pool. Apply it independently of the defaults date, retain an explicit override, and preserve HTTP1 and incoming header limits.

GitHub

2.9.4 (2026-10-03)

Chores
  • remove Maven Central publishing (#440) (GitHub)

    Remove the retired Central publication path and its CI-only support. Keep signed Fluxzero Packages publication and the existing release gates intact.

GitHub

2.9.3 (2026-10-03)

Bug Fixes
  • modeling: support context parameters in graph change handlers (GitHub)

    Recognize one unqualified Graph alongside Message and Metadata in any order so complete changes reach all affected roots. Preserve ordinary selection for explicit payloads, qualified graphs, and multiple graphs.

Tests
  • modeling: isolate cold alias reads from cache refreshes (GitHub)

    Disable automatic model caching in the cold-read I/O contract so independent refresh work cannot affect the exact request count.

  • scheduling: observe transport calls before acknowledgement waits (GitHub)

    Separate transport invocation from the future wait so blocked supplier setup cannot satisfy the acknowledgement boundary.

  • publishing: await response cleanup before checking timeout removal (GitHub)

    Drain the owned response worker after result completion so dependent cleanup has finished before inspecting the timer queue.

GitHub

2.9.2 (2026-10-03)

Bug Fixes
  • modeling: retain unlimited snapshots and reconstruct cold predecessors (GitHub)

    Treat negative Model snapshot limits as unlimited while preserving zero, positive and Aggregate retention. Reconstruct historical predecessors lazily when a snapshot or bounded cache has no in-memory predecessor, keeping the original Graph boundary and explicit erasure semantics.

GitHub

1.292.16 (2026-10-03)

Bug Fixes
  • proxy: default HTTP2 response headers to 16 KiB (#443) (GitHub)

    Give HTTP2 a separate 16 KiB response-header ceiling so small HPACK buffers fit the shared pool. Apply it independently of the defaults date, retain an explicit override, and preserve HTTP1 and incoming header limits.

GitHub

1.292.15 (2026-10-03)

Chores
  • remove Maven Central publishing from 1.x (#441) (GitHub)

    Remove the retired Central publication path and its CI-only support. Keep signed Fluxzero Packages publication and the existing release gates intact.

GitHub

2.9.1 (2026-10-01)

Bug Fixes
  • serialization: retain transport context on payload replacement (GitHub)

    Keep received correlation, segment and index when transforming a message payload. Snapshot only transport fields while lazily serializing the replacement with its own type and revision; complete logical replacements retain their separate envelope semantics.

  • reflection: treat missing JSON properties as absent (GitHub)

    Distinguish missing JSON fields from explicit null values while returning no value for either. Prevent sentinel nodes from becoming routing keys or blocking parameter-source fallback.

Documentation
  • spring: clarify missing-property condition matching (GitHub)
  • api: document remaining public method contracts (GitHub)

    Describe existing null, failure, lifecycle, and completion behavior across SDK and shared helper methods so callers can discover their contracts in Javadoc. Preserve implementation and API signatures.

  • agents: restore source-verified manual coverage (GitHub)

    Restore application-facing concepts from the legacy Java and Kotlin manuals without promoting obsolete APIs. Keep migration and typed-fixture guidance in focused graph articles, and use explicit role-aware queries instead of the unsupported silent-handler fallback recipe.

Code Refactoring
  • scheduling: rename expired-task submission (GitHub)

    Name executor delegation explicitly because the configured worker pool may run tasks inline. Preserve execution order and completion behavior.

Chores
  • remove legacy project manuals [skip ci] (GitHub)

    Retire duplicate manual sources now that docs/agents is canonical. Stop creating legacy Java/Kotlin ZIPs while preserving release notes and graph artifacts; existing published releases stay unchanged.

GitHub

2.9.0 (2026-10-01)

Changes
  • Default Model.searchable to false and clarify search propagation (#433) (GitHub)

© 2026 Fluxzero