diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3e3a34d..3ff5ec0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,19 @@ All notable changes to the AxonFlow Java SDK will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [8.0.1] - 2026-05-08 — Drop telemetry `profile` field
+
+### Removed
+
+- **Telemetry `profile` field** — collided with existing governance
+ `AXONFLOW_PROFILE` env var (allowlist `dev|default|strict|compliance`).
+ The v1 telemetry validator only accepted `dev|prod|unknown`, so any
+ customer setting `AXONFLOW_PROFILE=strict` or `=compliance` for
+ governance enforcement would have had their telemetry pings rejected
+ with HTTP 400. Removing the field reverts `AXONFLOW_PROFILE` to its
+ single governance purpose. The `deployment_mode` dimension already
+ carries the topology signal `profile` was meant to add.
+
## [8.0.0] - 2026-05-08 — Decision history API + telemetry simplification
**Major release.** The headline feature is the new decision-history client
diff --git a/examples/explain-decision/pom.xml b/examples/explain-decision/pom.xml
index f778def..84b91f2 100644
--- a/examples/explain-decision/pom.xml
+++ b/examples/explain-decision/pom.xml
@@ -25,7 +25,7 @@
com.getaxonflow
axonflow-sdk
- 8.0.0
+ 8.0.1
diff --git a/examples/list-decisions/pom.xml b/examples/list-decisions/pom.xml
index 87c5214..e56608a 100644
--- a/examples/list-decisions/pom.xml
+++ b/examples/list-decisions/pom.xml
@@ -24,7 +24,7 @@
com.getaxonflow
axonflow-sdk
- 8.0.0
+ 8.0.1
diff --git a/pom.xml b/pom.xml
index b4cc631..ec88906 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.getaxonflow
axonflow-sdk
- 8.0.0
+ 8.0.1
jar
AxonFlow Java SDK
diff --git a/src/main/java/com/getaxonflow/sdk/telemetry/TelemetryReporter.java b/src/main/java/com/getaxonflow/sdk/telemetry/TelemetryReporter.java
index 633a87d..8d1e7db 100644
--- a/src/main/java/com/getaxonflow/sdk/telemetry/TelemetryReporter.java
+++ b/src/main/java/com/getaxonflow/sdk/telemetry/TelemetryReporter.java
@@ -235,13 +235,6 @@ static String buildPayload(
root.put("instance_id", UUID.randomUUID().toString());
- // v1 schema profile dimension. Free-form deployment classifier sourced from
- // AXONFLOW_PROFILE; "unknown" when unset. Analytics dimension only.
- String profileEnv = System.getenv("AXONFLOW_PROFILE");
- String profile =
- (profileEnv == null || profileEnv.trim().isEmpty()) ? "unknown" : profileEnv.trim();
- root.put("profile", profile);
-
// Stream classifier: sandbox-mode clients self-tag so analytics can distinguish dev/test
// pings from production. Production-mode (and other modes) omit the field entirely so the
// server defaults to "heartbeat" — preserving byte-identical wire shape relative to v7.x
diff --git a/src/test/java/com/getaxonflow/sdk/telemetry/TelemetryReporterTest.java b/src/test/java/com/getaxonflow/sdk/telemetry/TelemetryReporterTest.java
index 6e46abc..5ce9f89 100644
--- a/src/test/java/com/getaxonflow/sdk/telemetry/TelemetryReporterTest.java
+++ b/src/test/java/com/getaxonflow/sdk/telemetry/TelemetryReporterTest.java
@@ -77,7 +77,7 @@ void testPayloadFormat() throws Exception {
assertThat(root.get("runtime_version").asText()).isEqualTo(System.getProperty("java.version"));
// v1 schema: 2-arg buildPayload defaults deployment_mode to "unknown".
assertThat(root.get("deployment_mode").asText()).isEqualTo("unknown");
- assertThat(root.get("profile").asText()).isEqualTo("unknown");
+ assertThat(root.has("profile")).isFalse();
assertThat(root.get("features").isArray()).isTrue();
assertThat(root.get("features").size()).isEqualTo(0);
assertThat(root.get("instance_id").asText()).isNotEmpty();
@@ -164,7 +164,7 @@ void testCustomEndpoint(WireMockRuntimeInfo wmRuntimeInfo) throws Exception {
// v1 schema: deployment_mode classifies from sdk endpoint host; localhost
// resolves to self_hosted (the v1 allowlist removes the production label).
assertThat(body.get("deployment_mode").asText()).isEqualTo("self_hosted");
- assertThat(body.get("profile").asText()).isEqualTo("unknown");
+ assertThat(body.has("profile")).isFalse();
assertThat(body.get("instance_id").asText()).isNotEmpty();
// production-mode payloads still omit stream on the wire.
assertThat(body.has("stream")).isFalse();