feat!: v8.0 — decision history API + telemetry simplification#168
Merged
saurabhjain1592 merged 2 commits intomainfrom May 8, 2026
Merged
feat!: v8.0 — decision history API + telemetry simplification#168saurabhjain1592 merged 2 commits intomainfrom
saurabhjain1592 merged 2 commits intomainfrom
Conversation
Combined major release for the Java SDK. Bundles a new decision-history client API surface (`listDecisions` + runnable explain example, both landed since v7.1.0) with a telemetry contract simplification that removes silent customer-side suppression paths. After this lands: - `AXONFLOW_TELEMETRY=off` is the SOLE opt-out for SDK telemetry — same pattern as HashiCorp checkpoint, Docker, Datadog Agent. - Sandbox-mode clients now fire telemetry, tagged `stream="sandbox"` so they're distinguishable from production heartbeat in analytics. - `AxonFlowConfig.Builder.telemetry(Boolean)` and `AxonFlowConfig.getTelemetry()` removed — the config-level kill switch is gone. Why combined into a major: the telemetry contract had two redundant levers (env var + programmatic field) and one silent-suppression path (mode-based default-off). Cleanup is technically a breaking change, so it must ride a major version bump. We bundled the decision-history feature work (#166, #167) into the same major instead of releasing a v7.2.0 right before a v8.0.0 — fewer customer-facing version transitions. Signed-off-by: Saurabh Jain <saurabhjain1592@gmail.com>
Signed-off-by: Saurabh Jain <saurabhjain1592@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Combined major release for the Java SDK. Bundles a new decision-history client API surface (
listDecisions+ runnable explain example, both landed since v7.1.0) with a telemetry contract simplification that removes silent customer-side suppression paths.After this lands:
AXONFLOW_TELEMETRY=offis the sole opt-out for SDK telemetry — same pattern as HashiCorp checkpoint, Docker, Datadog Agent.stream="sandbox"so they're distinguishable from production heartbeat in analytics.AxonFlowConfig.Builder.telemetry(Boolean)+AxonFlowConfig.getTelemetry()are removed — the config-level kill switch is gone.Why combined into a major
The telemetry contract had two redundant levers (env var + programmatic field) and one silent-suppression path (mode-based default-off). Cleanup is technically a breaking change, so it must ride a major version bump. We bundled the decision-history feature work (#166, #167) into the same major instead of releasing a v7.2.0 right before a v8.0.0 — fewer customer-facing version transitions.
Migration
If you were calling
config.getTelemetry(): drop the call site;AXONFLOW_TELEMETRY=offis the only telemetry knob.Dependency note
This PR's runtime-e2e test (
runtime-e2e/sandbox_telemetry_stream_tag/) depends on getaxonflow/axonflow-enterprise#2005 (server-side stream allowlist) being deployed. Pre-deploy the row will be taggedstream=heartbeatregardless of payload (server hardcodes), and the test's stream-tag assertion fails. The unit tests + behavioral correctness in this PR are independent and pass standalone.Test plan
Unit + build
./mvnw test— all 1236 tests pass on the v8 changes (unit + integration: heartbeat E2E, short-lived process regression, telemetry endpoint type, MCP, audit, plan, HITL, etc.)../mvnw -DskipTests compileclean.bash -n runtime-e2e/sandbox_telemetry_stream_tag/test.shclean.scripts/lint-no-mocks-in-runtime-e2e.sh runtime-e2e/sandbox_telemetry_stream_tag/clean (no forbidden mock patterns).Runtime proof (3-rule DoD, HARD RULE #0)
The runtime-e2e file exists and satisfies the mechanical CI gate, but the test has not yet been executed against the deployed Lambda. Per HARD RULE #0, runtime proof is the rule, not the file's existence. The proof is gated on:
deploy-checkpoint.yml.runtime-e2e/sandbox_telemetry_stream_tag/test.shagainst the live Lambda. Expected: an audit row taggedsdk=java/8 stream=sandboxlands in DynamoDB and CloudWatch within ~10s.I will not request merge of this PR until those two items are checked. Pre-deploy I'm declaring "tests exist + unit-test parity is correct"; full runtime proof comes after #2005 deploys.
Release tagging (gated on user authorization)
v8.0.0on the merged commit.Per the project's release-approval rule, you authorize each release individually. DO NOT TAG OR PUBLISH is set on this PR until explicit approval.
Self-review
Hunk-by-hunk review on every modified file. Five-question protocol applied:
pom.xml+examples/{explain-decision,list-decisions}/pom.xml— single<version>7.1.0</version>→<version>8.0.0</version>. Verified by grep that no other7.1.0literals remain in*.xml/*.java. README example deps bumped from4.0.0(already-stale install snippet) to8.0.0.src/main/java/com/getaxonflow/sdk/AxonFlowConfig.java— three coordinated removals: fieldprivate final Boolean telemetry, accessorgetTelemetry(), builder methodtelemetry(Boolean)+ the matchingBuilder.telemetryfield. Verified by grep that no production code references either symbol post-deletion.src/main/java/com/getaxonflow/sdk/telemetry/TelemetryReporter.java— class doc rewritten with v7→v8 history.isEnabledcollapsed from(mode, configOverride, hasCredentials, axonflowTelemetry)four-arg shape to single-argisEnabled(String axonflowTelemetry).sendPingoverloads simplified —Boolean telemetryEnabled+boolean hasCredentialsparameters dropped.buildPayloadadds thestream="sandbox"field ONLY whenmode.equals("sandbox")— production-mode payloads are byte-identical to v7.x because the field is omitted entirely (JacksonObjectNode.putis only called in the sandbox branch). Verified bytestPayloadFormat(assertsroot.has("stream") == falsefor production) andtestPayloadStreamTagSandbox(assertsstream="sandbox").src/main/java/com/getaxonflow/sdk/AxonFlow.java— single call-site update.invokeHeartbeatno longer deriveshasCredentials(param removed fromisEnabled) and no longer readsconfig.getTelemetry()(accessor removed). Down to: readAXONFLOW_TELEMETRYenv, pass toisEnabled(String), pass result toHeartbeatState.maybeSendHeartbeat. Doc-comment retained around the heartbeat gate.src/test/java/com/getaxonflow/sdk/telemetry/TelemetryReporterTest.java— major refactor:testTelemetryDefaultOffForSandbox,testTelemetryDefaultOnForProductionWithoutCredentials,testTelemetryDefaultOnForEnterpriseWithCredentials,testTelemetryConfigOverrideEnable,testTelemetryConfigOverrideDisable,testAxonflowTelemetryPrecedence,testSandboxModeDefaultOff,testSandboxModeExplicitEnable,testConfigDisableInProduction— all asserted v7.x mode-or-override semantics that no longer exist.testTelemetryOnByDefault(table-driven, asserts ON fornull/""/"on"/"anything-not-off"),testPayloadStreamTagSandbox(sandbox payload carriesstream="sandbox"),testPayloadStreamTagProductionOmitted(production omitsstream),testPayloadStreamTagOtherModesOmitted(enterprise/staging/empty/unknown omitstream), and the headlineshouldFirePingWithStreamSandboxInSandboxModecovering both "ping fires" + "payload carries stream tag" via WireMock.sendPingcalls updated to the new signature(mode, sdkEndpoint, debug, axonflowTelemetry, checkpointUrl).src/test/java/com/getaxonflow/sdk/telemetry/TelemetryReporterShortLivedTest.java— single signature update, droppedBoolean.TRUE+ twoboolean falsearguments. Test still provessendPingblocks until round-trip completes (≥150ms when mock has a 200ms fixed delay) — the synchronous-delivery contract is unchanged.runtime-e2e/sandbox_telemetry_stream_tag/— new directory;test.sh+README.md. Real ping against deployed checkpoint Lambda, no mocks. Lint-clean perlint-no-mocks-in-runtime-e2e.sh. The bash script doesmvn install -DskipTestsof the local SDK to~/.m2, then a tiny consumer pom +SandboxRuntimeProof.javaresolvingcom.getaxonflow:axonflow-sdk:8.0.0, constructsMode.SANDBOXagainstlocalhost:65530(intentional-unreachable so we exercise heartbeat ping but no platform call), waits 2s, thenaws logs filter-log-eventsforevent_stored sdk=java/8ANDstream=sandbox.CHANGELOG.md— new v8.0.0 entry above v7.1.0. Headline names the feature theme (decision history API); telemetry change kept concise at the bottom underRemoved. Migration guide walks through.telemetry(Boolean)builder removal +getTelemetry()accessor removal +TelemetryReportertestability-surface signature change.README.md— install snippet bumped from4.0.0to8.0.0(pre-existing stale documentation, fixed in this PR). Telemetry section gained a clarifying paragraph aboutAXONFLOW_TELEMETRY=offbeing the sole opt-out as of v8.0.Risk
.telemetry(false)on the builder — the call site will fail to compile. Migration is a one-liner: delete the call, setAXONFLOW_TELEMETRY=offin the env if they wanted off. We have no telemetry on actual.telemetry()use; the audit found 0 production-code + 0 test-code in-tree usages of the builder method (cleanest of the four SDK migrations).Removed.Linked