Target Version
3.0-dev。复核基于 origin/3.0-dev 提交 a75fc8721b99e5c0b4421d0c58b5618bbe71ff31(PR #57 )。该 PR 加强了 Redis 熔断、成员快照版本校验和 L1/L2 防旧回填,但 MySQL 写后失效的 durable repair 仍缺失。
Evidence
common/dao/data_redis.hpp:922-958 在 Redis 异常时返回 unknown version/unstable snapshot,warm_if_version 使用 Lua 防止旧 warm 覆盖新版本;这是有价值的读取侧防护。
conversation/source/conversation_server.h:209,296,320,388,427 仍在 MySQL 成员变更后调用 invalidate_members_cache_。
conversation/source/conversation_server.h:897-901 不检查失效结果。
common/dao/data_redis.hpp:1027-1038 的 Members::invalidate 返回 void,Redis/Lua 异常只记录日志;没有 pending repair、重试所有者或成功响应后的收敛证据。
Add/remove 增量方法同样吞掉异常;读取侧 unknown-version 防护不能替代 MySQL commit 后丢失的版本推进。
当前 Reliability 仅注入 Redis 整体故障,未覆盖 Remove/quit/dissolve 在 MySQL commit 后 Redis 失效失败、恢复及多实例旧 L1 收敛。
Problem or Goal
让成员变更后的缓存失效失败成为可检测、可重试、可收敛的状态。权限收紧操作不得因为 Redis 失效丢失而在长 TTL 内继续信任已知旧成员快照。
Scope
为成员变更产生 durable pending invalidation/repair,并定义所有者、幂等键、顺序和完成条件。
Redis 恢复后推进版本、清除 L2,并让各实例 L1 在有界时间内失效。
Transmite 在 pending/unknown 状态使用安全 MySQL/RPC 校验或 fail-closed。
覆盖 Add/Remove/quit/dissolve/role change。
复用 PR feat(cache): harden Redis resilience and multilevel caching #57 的 breaker、unknown-version 与防旧 warm 能力,不重复实现通用熔断。
Non-goals
不要求 Redis 与 MySQL 分布式事务。
不把成员列表双写成两个真相源。
不把所有缓存改为强一致。
不修改普通用户资料缓存。
Acceptance Criteria
Test-first Plan
在现有 Reliability 层增加 RL-CACHE-01 并运行:
make -C tests test-reliability TEST_RUN=TestRL_CACHE_MembershipInvalidationRepair
预期 RED 是 Remove/quit 已提交后,被移除用户仍能凭旧缓存发送,且 Redis 恢复后无自动 repair。最小 GREEN 是 durable repair 与 pending 状态下的安全授权;随后运行 Conversation、Transmite、Security、缓存回归和 BVT。
Risk and Security
这是授权边界。过度 fail-open 会延长越权窗口,过度 fail-closed 会阻断合法发送;repair 必须防重复、乱序和惊群,日志/指标不得暴露完整成员列表。
Architecture Impact
Yes。Conversation 的 MySQL 写后新增可恢复失效边界,Transmite 增加 pending/unknown 授权处理;MySQL 仍是成员真相源。
Core-flow Impact
Yes。改变成员写、缓存版本、授权降级与恢复流程。
Required Skill Updates
更新 technology stack,记录成员缓存一致性与降级契约。
更新 repository map,登记 repair 状态与 worker 所有权。
更新 core flows,补充成员写、失效、授权和恢复。
更新 case catalog,登记 RL-CACHE-01 与 Security 场景。
如形成通用安全降级规则,同步安全 Skill 的直接引用资料。
Target Version
3.0-dev。复核基于
origin/3.0-dev提交a75fc8721b99e5c0b4421d0c58b5618bbe71ff31(PR #57)。该 PR 加强了 Redis 熔断、成员快照版本校验和 L1/L2 防旧回填,但 MySQL 写后失效的 durable repair 仍缺失。Evidence
common/dao/data_redis.hpp:922-958在 Redis 异常时返回 unknown version/unstable snapshot,warm_if_version使用 Lua 防止旧 warm 覆盖新版本;这是有价值的读取侧防护。conversation/source/conversation_server.h:209,296,320,388,427仍在 MySQL 成员变更后调用invalidate_members_cache_。conversation/source/conversation_server.h:897-901不检查失效结果。common/dao/data_redis.hpp:1027-1038的Members::invalidate返回 void,Redis/Lua 异常只记录日志;没有 pending repair、重试所有者或成功响应后的收敛证据。Problem or Goal
让成员变更后的缓存失效失败成为可检测、可重试、可收敛的状态。权限收紧操作不得因为 Redis 失效丢失而在长 TTL 内继续信任已知旧成员快照。
Scope
Non-goals
Acceptance Criteria
Test-first Plan
在现有 Reliability 层增加
RL-CACHE-01并运行:make -C tests test-reliability TEST_RUN=TestRL_CACHE_MembershipInvalidationRepair预期 RED 是 Remove/quit 已提交后,被移除用户仍能凭旧缓存发送,且 Redis 恢复后无自动 repair。最小 GREEN 是 durable repair 与 pending 状态下的安全授权;随后运行 Conversation、Transmite、Security、缓存回归和 BVT。
Risk and Security
这是授权边界。过度 fail-open 会延长越权窗口,过度 fail-closed 会阻断合法发送;repair 必须防重复、乱序和惊群,日志/指标不得暴露完整成员列表。
Architecture Impact
Yes。Conversation 的 MySQL 写后新增可恢复失效边界,Transmite 增加 pending/unknown 授权处理;MySQL 仍是成员真相源。
Core-flow Impact
Yes。改变成员写、缓存版本、授权降级与恢复流程。
Required Skill Updates
RL-CACHE-01与 Security 场景。