Target Version
3.0-dev,复现基线为 bbf4bb42b2cd85c07edcb3bf736a83298fa7b62c,其 merge-base 为 a75fc8721b99e5c0b4421d0c58b5618bbe71ff31。
Evidence
- 命令
cd tests && go test -tags=func ./func/... -run '^TestFN_WS_(RevokedTokenRejected|Reconnect)$' -v -count=1 中,TestFN_WS_Reconnect 在 tests/pkg/fixture/ws.go:26 等待 10 秒后报告用户未变为 ONLINE;同次 TestFN_WS_RevokedTokenRejected 通过。
- Push 的 10008/9001 端口在失败期间持续监听,WebSocket 握手成功。
- 临时隔离 Redis 中出现对应用户的
im:presence:device:{user_id}:default_device hash;测试进程退出、连接关闭后其状态为 OFFLINE,说明 Push 生命周期写入路径曾执行,但 Presence 查询未在门限内观测到 ONLINE。
- 单独运行
TestFN_WS_RevokedTokenRejected 的直接有效令牌控制组可保持 WebSocket 连接,排除了所有令牌被 admission 统一拒绝。
Problem or Goal
使 Go Functional 层的 WebSocket 在线就绪观测与 Push/Presence 的实际状态收敛一致,避免有效连接已建立但 waitForWSOnline 持续读取 OFFLINE 的不确定失败。
Scope
- 调查 Push 写入、Presence 聚合读取、L1 缓存和测试 cleanup 之间的状态/时序。
- 明确
waitForWSOnline 应观察的权威状态与有界等待契约。
- 增加可重复的 Go Functional 回归,覆盖首次连接、关闭和不同 device id 重连。
- 若确认缓存失效缺陷,做最小一致性修复并补充指标。
Non-goals
Acceptance Criteria
Test-first Plan
RED:在完整栈运行 cd tests && go test -tags=func ./func/... -run '^TestFN_WS_Reconnect$' -v -count=20,保存至少一次 did not become online within 10s 及对应 Redis 状态证据。GREEN:定位权威状态或缓存失效边界后重跑相同命令,并运行 Presence/WS Functional 子集。
Risk and Security
风险是错误调整缓存或 TTL 导致在线状态抖动、跨实例陈旧或 Redis 压力增加。不得通过无界轮询、移除缓存上限或记录用户/token 标识规避测试失败;需要有界等待和不含敏感数据的聚合指标。
Architecture Impact
No,除非调查证明需要改变 Push/Presence 状态所有权或缓存拓扑;若发生必须先更新 Issue 合同并取得范围批准。
Core-flow Impact
Yes。涉及 WebSocket 生命周期到 Redis Presence 状态及聚合读取的一致性和缓存可见性。
Required Skill Updates
.agents/skills/chatnow-orienting/references/core-flows.md
- 若修改测试门禁:
.agents/skills/chatnow-testing/references/framework.md
Target Version
3.0-dev,复现基线为
bbf4bb42b2cd85c07edcb3bf736a83298fa7b62c,其 merge-base 为a75fc8721b99e5c0b4421d0c58b5618bbe71ff31。Evidence
cd tests && go test -tags=func ./func/... -run '^TestFN_WS_(RevokedTokenRejected|Reconnect)$' -v -count=1中,TestFN_WS_Reconnect在tests/pkg/fixture/ws.go:26等待 10 秒后报告用户未变为 ONLINE;同次TestFN_WS_RevokedTokenRejected通过。im:presence:device:{user_id}:default_devicehash;测试进程退出、连接关闭后其状态为 OFFLINE,说明 Push 生命周期写入路径曾执行,但 Presence 查询未在门限内观测到 ONLINE。TestFN_WS_RevokedTokenRejected的直接有效令牌控制组可保持 WebSocket 连接,排除了所有令牌被 admission 统一拒绝。Problem or Goal
使 Go Functional 层的 WebSocket 在线就绪观测与 Push/Presence 的实际状态收敛一致,避免有效连接已建立但
waitForWSOnline持续读取 OFFLINE 的不确定失败。Scope
waitForWSOnline应观察的权威状态与有界等待契约。Non-goals
Acceptance Criteria
TestFN_WS_Reconnect在同一稳定栈上连续运行 20 次无 ONLINE 观测超时。Test-first Plan
RED:在完整栈运行
cd tests && go test -tags=func ./func/... -run '^TestFN_WS_Reconnect$' -v -count=20,保存至少一次did not become online within 10s及对应 Redis 状态证据。GREEN:定位权威状态或缓存失效边界后重跑相同命令,并运行 Presence/WS Functional 子集。Risk and Security
风险是错误调整缓存或 TTL 导致在线状态抖动、跨实例陈旧或 Redis 压力增加。不得通过无界轮询、移除缓存上限或记录用户/token 标识规避测试失败;需要有界等待和不含敏感数据的聚合指标。
Architecture Impact
No,除非调查证明需要改变 Push/Presence 状态所有权或缓存拓扑;若发生必须先更新 Issue 合同并取得范围批准。
Core-flow Impact
Yes。涉及 WebSocket 生命周期到 Redis Presence 状态及聚合读取的一致性和缓存可见性。
Required Skill Updates
.agents/skills/chatnow-orienting/references/core-flows.md.agents/skills/chatnow-testing/references/framework.md