Skip to content

Commit b643906

Browse files
Merge remote-tracking branch 'origin/main' into release/2026-04-29
# Conflicts: # CHANGELOG.md
2 parents 7d5652b + fa27583 commit b643906

11 files changed

Lines changed: 1497 additions & 160 deletions

File tree

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
name: heartbeat-real-stack
2+
3+
# Real-stack heartbeat E2E across Linux + Windows + macOS. Stands up a
4+
# localhost fake checkpoint server, constructs the SDK through its
5+
# public API, verifies (a) the OS-native stamp file appears, (b) the
6+
# checkpoint endpoint received exactly one ping, (c) a second
7+
# invocation does NOT re-fire (warm-cache regression).
8+
9+
on:
10+
push:
11+
branches: [main]
12+
pull_request:
13+
branches: [main]
14+
15+
env:
16+
AXONFLOW_TELEMETRY: 'off'
17+
18+
jobs:
19+
real-stack:
20+
name: real-stack ${{ matrix.os }}
21+
runs-on: ${{ matrix.os }}
22+
strategy:
23+
fail-fast: false
24+
matrix:
25+
os: [ubuntu-latest, windows-latest, macos-latest]
26+
27+
steps:
28+
- uses: actions/checkout@v4
29+
30+
- name: Set up Java
31+
uses: actions/setup-java@v4
32+
with:
33+
distribution: 'temurin'
34+
java-version: '21'
35+
cache: 'maven'
36+
37+
- name: Set up Python (for harness driver)
38+
uses: actions/setup-python@v5
39+
with:
40+
python-version: '3.11'
41+
42+
- name: Build SDK jar
43+
# bash on every OS — PowerShell on Windows mangles -D... arguments,
44+
# splitting `-Dmaven.javadoc.skip=true` into ".javadoc.skip=true" as
45+
# a phase. The bash shell on Windows runners (Git Bash) handles -D
46+
# quoting consistently with Linux/macOS.
47+
shell: bash
48+
run: mvn -B -DskipTests package -Dmaven.javadoc.skip=true
49+
50+
# Compile smoke + run real-stack E2E in a single shell so the
51+
# classpath separator (`:` on Linux/macOS, `;` on Windows) is
52+
# native to the shell and consistent across javac + java steps.
53+
- name: Compile + run real-stack heartbeat E2E (cold + warm)
54+
shell: bash
55+
run: |
56+
set -e
57+
SDK_JAR=$(ls target/axonflow-sdk-*.jar | grep -v sources | head -1)
58+
mvn -B dependency:build-classpath -Dmdep.outputFile=cp.txt -Dmdep.includeScope=runtime
59+
DEPS=$(cat cp.txt)
60+
# bash on Windows runners (Git Bash) handles ':' as the path
61+
# separator inside the shell process, but `java` and `javac`
62+
# are native Windows binaries that need ';'. Detect and rewrite.
63+
if [[ "$RUNNER_OS" == "Windows" ]]; then
64+
CP_SEP=';'
65+
else
66+
CP_SEP=':'
67+
fi
68+
mkdir -p tests/heartbeat-real-stack/build
69+
javac -d tests/heartbeat-real-stack/build \
70+
-cp "${SDK_JAR}${CP_SEP}${DEPS}" \
71+
tests/heartbeat-real-stack/SmokeJava.java
72+
CP="tests/heartbeat-real-stack/build${CP_SEP}${SDK_JAR}${CP_SEP}${DEPS}"
73+
python tests/heartbeat-real-stack/run_real_stack.py java -cp "$CP" SmokeJava

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,7 @@ local.properties
9999

100100
.codex/
101101
.claude
102+
103+
# Heartbeat real-stack smoke build dir
104+
tests/heartbeat-real-stack/build/
105+
tests/heartbeat-real-stack/cp.txt

CHANGELOG.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,24 @@ All notable changes to the AxonFlow Java SDK will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8-
## [7.0.0] - 2026-04-29 — DO_NOT_TRACK removal
8+
## [7.0.0] - 2026-04-29 — DO_NOT_TRACK removal + 7-day delivered heartbeat
99

10-
Major release. The breaking change is the removal of `DO_NOT_TRACK` as an AxonFlow telemetry opt-out `AXONFLOW_TELEMETRY=off` is now the canonical and only opt-out signal. Companion releases on the same day: TypeScript v7.0.0 / Python v7.0.0 / Go v7.0.0 (with `/v7` module path migration).
10+
Major release. Two headline changes: removal of `DO_NOT_TRACK` as an AxonFlow telemetry opt-out (`AXONFLOW_TELEMETRY=off` is now the canonical and only opt-out signal), and a move from "one ping per `new AxonFlow()`" to a 7-day delivered-heartbeat contract that better matches active-customer signal across both long-running services and short-lived CLI tools / Lambdas. Companion releases on the same day: TypeScript v7.0.0 / Python v7.0.0 / Go v7.0.0 (with `/v7` module path migration).
1111

1212
### BREAKING
1313

1414
- **`DO_NOT_TRACK` is no longer honored as an AxonFlow telemetry opt-out.** Use `AXONFLOW_TELEMETRY=off` instead. `DO_NOT_TRACK` was deprecated because it is commonly inherited from host tools and developer environments (CLIs like Codex and Claude Code inject it unconditionally), which makes it an unreliable expression of user intent for AxonFlow telemetry.
1515

1616
- **(Test API)** Package-private `TelemetryReporter.isEnabled` and `TelemetryReporter.sendPing` overloads no longer accept a `String doNotTrack` parameter. The remaining `String axonflowTelemetry` parameter is the sole opt-out signal accepted by the testability surface.
1717

18+
### Changed
19+
20+
- **Telemetry now follows the 7-day delivered-heartbeat contract** instead of firing on every `new AxonFlow()` construction. The SDK emits at most one anonymous heartbeat per environment every 7 days during SDK activity. A stamp file at the OS-native user cache dir tracks last successful delivery; mtime is the source of truth across process restarts. Failed POSTs do NOT advance the stamp — a transient network error does not silence telemetry for 7 days. An in-memory 1-hour cache caps `Files.getLastModifiedTime` calls on hot request paths; a `ReentrantLock`-guarded in-flight flag coalesces concurrent threads so only one ping fires under load. `AXONFLOW_TELEMETRY=off` is re-evaluated on every gate run. Restricted environments where no cache dir is available (e.g. AWS Lambda with no `HOME` / `LOCALAPPDATA`) fall back transparently to the previous "one ping per construction" behavior.
21+
1822
### Fixed
1923

2024
- The one-line `DO_NOT_TRACK=1 is deprecated...` `logger.warn` is no longer emitted. Removing the warning eliminates log noise that previously appeared on every telemetry decision when `DO_NOT_TRACK=1` was set.
2125

22-
2326
## [6.2.0] - 2026-04-28 — listLLMProviders() + LLMProvider source-compat
2427

2528
Minor release. New LLM-provider listing API closes the parity gap with the Python + Go SDKs; the rest of the cycle restores `LLMProvider` source-compatibility for callers using the 7-arg primitive shape. Coordinated cycle: TypeScript v6.2.0 / Python v6.9.0 / Go v6.0.0 (major: see SDKCompatibility breaking type change in that release) ship same day.

0 commit comments

Comments
 (0)