diff --git a/docs/module-data-flow.html b/docs/module-data-flow.html
index 2f5efb97..b59acfc2 100644
--- a/docs/module-data-flow.html
+++ b/docs/module-data-flow.html
@@ -523,7 +523,7 @@ flowchart LR
| modules/core/session-core |
- 设备会话、命令下发抽象、SessionStore、CommandDispatcher 默认实现。SessionStore 支持 memory 和 redis 两种后端;生产默认使用 Redis 保存 sessionId、VIN 和 phone 三索引及 TTL,内存实现作为本地开发/无 Redis 降级,协议模块只依赖 SPI,不感知存储后端。 |
+ 设备会话、命令下发抽象、SessionStore、CommandDispatcher 默认实现。SessionStore 仅保留 Redis 后端;协议进程本地只保存真实 Netty Channel,Redis 保存 sessionId、VIN 和 phone 三索引及 TTL,协议模块只依赖 SPI,不感知存储细节。 |
设备连接、命令请求。 |
会话状态、命令分发结果、Redis 会话索引。 |
在线状态下行控制多实例会话索引 |
diff --git a/docs/operations/gb32960-service-split-runbook.md b/docs/operations/gb32960-service-split-runbook.md
index a5d04256..9e09e9b6 100644
--- a/docs/operations/gb32960-service-split-runbook.md
+++ b/docs/operations/gb32960-service-split-runbook.md
@@ -39,8 +39,8 @@ Authorization failures are rejected before the Kafka durability boundary and can
- Java 25 and Maven available on PATH.
- Local Kafka reachable at `127.0.0.1:9092`, plus Kafka CLI tools such as `kafka-topics` and optionally `kafka-console-consumer`.
-- Production GB32960/JT808 session state uses Redis by default. For local
- one-process smoke tests without Redis, set `SESSION_STORE=memory` explicitly.
+- Session state requires Redis. GB32960/JT808 ingest services keep live Netty
+ channels in-process, but session indexes and TTL metadata use Redis only.
- No repository-local Kafka bootstrap script or compose file was found during Task 8 verification on 2026-06-23.
If your shell needs an explicit JDK:
@@ -94,7 +94,6 @@ GB32960 ingest:
KAFKA_BROKERS=127.0.0.1:9092 \
GB32960_PORT=32960 \
HTTP_PORT=20100 \
-SESSION_STORE=memory \
java --sun-misc-unsafe-memory-access=allow \
-jar modules/apps/gb32960-ingest-app/target/gb32960-ingest-app.jar
```
@@ -105,7 +104,6 @@ JT808 ingest:
KAFKA_BROKERS=127.0.0.1:9092 \
JT808_PORT=808 \
HTTP_PORT=20400 \
-SESSION_STORE=memory \
java --sun-misc-unsafe-memory-access=allow \
-jar modules/apps/jt808-ingest-app/target/jt808-ingest-app.jar
```
diff --git a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java
index dd511cb8..c4682b82 100644
--- a/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java
+++ b/modules/apps/vehicle-history-app/src/test/java/com/lingniu/ingest/historyapp/MavenModuleProfileTest.java
@@ -127,6 +127,22 @@ class MavenModuleProfileTest {
.doesNotContain("车辆状态/日统计消费");
}
+ @Test
+ void productionDocsDoNotAdvertiseMemorySessionStore() throws Exception {
+ String runbook = Files.readString(repositoryRoot()
+ .resolve("docs/operations/gb32960-service-split-runbook.md"));
+ String moduleDataFlow = Files.readString(repositoryRoot().resolve("docs/module-data-flow.html"));
+
+ assertThat(runbook)
+ .contains("Session state requires Redis")
+ .doesNotContain("SESSION_STORE=memory")
+ .doesNotContain("without Redis");
+ assertThat(moduleDataFlow)
+ .contains("SessionStore 仅保留 Redis 后端")
+ .doesNotContain("SessionStore 支持 memory")
+ .doesNotContain("无 Redis 降级");
+ }
+
@Test
void rootPomDescriptionMatchesCurrentRuntimeStack() throws Exception {
Document pom = rootPom();