| document | kiwi-sdd |
|---|---|
| title | Kiwi 架构设计与 SDD 开发计划 |
| status | accepted-design |
| authority | sole-project-entry |
| version | 2 |
| updated_at | 2026-08-02 |
| baseline_repository | arana-db/kiwi |
| baseline_branch | main |
| baseline_ref | 9820162ebdf2d26aa6349e704efe8737b2e73e4a |
| wp0_pr_number | 414 |
| wp0_pr_base_ref | 0c4795ec716299598686fc7c5e0fac03a30e044d |
| wp0_pr_head_ref | e2bfc7deb481590a757f0034874b7f21a4a31aa2 |
| wp0_merge_parent_ref | cbcbadc27068634d851ab0ed63989d2214ab2408 |
| wp0_merge_ref | 9820162ebdf2d26aa6349e704efe8737b2e73e4a |
| wp0_exact_main_verification_ref | none |
| wp0_exact_main_verification_run | none |
| wp0_exact_main_verification_status | pending |
| github_snapshot_at | 2026-08-02 12:57:50 UTC |
| redis_oracle_tag | 8.8.1 |
| redis_oracle_ref | 77b6c308396c9700672390a210143a8496fb4b10 |
| required_runtime_mode | cache-off |
| executable_scope | M0-M6 |
| long_term_scope | M0-M10 |
| current_work_package | WP0 |
| current_work_package_status | implemented |
| current_plan | .planning/SDD.md#wp0 |
| current_issue | 413 |
| current_pr | 414 |
| next_safe_action | repair-post-merge-validation-under-416-then-verify-wp0 |
本文件是 Kiwi 项目唯一权威入口,统一回答以下问题:
- 当前系统实际是什么;
- 目标架构是什么;
- 哪些架构不变量不可破坏;
- M0 到 M10 如何演进;
- 当前允许执行哪些工作包;
- 每个工作包关联哪些 Requirement、Decision、Issue、Discussion 和 PR;
- 当前处于什么状态;
- 下一条安全动作是什么;
- 什么证据允许工作包、里程碑或系统门禁进入下一状态。
其他规划文件、专题设计、历史计划、Issue、Discussion 和 PR 都是本文件的来源、下属材料或验证证据,不得建立第二套项目状态、路线图或架构真相。
发生冲突时按以下顺序处理:
- 当前 exact-ref 源码、真实运行结果、可重复测试和 GitHub 实时状态决定当前事实。
- 本文件决定项目范围、架构方向、阶段状态、工作包依赖和下一安全动作。
- REQUIREMENTS.md 提供批准的 Requirement 注册表;本文件引用而不重新定义其优先级。
- DECISIONS.md 提供已批准 Decision 注册表;本文件将其映射到架构和工作包。
- 专题合同提供领域细节,但不得改变本文件的项目级边界。
- Issue 和 Discussion 提供问题、提案和讨论历史;只有进入本文件后才成为执行范围。
- 历史 specs、plans、周报和草稿只提供背景。
所有架构结论必须标明:
- Current:baseline_ref 对应源码已存在的事实;
- Target:本 SDD 批准的目标;
- Gap:Current 到 Target 的可定位差距;
- Work Package:负责闭合差距的工作包;
- Acceptance:允许宣布闭合的证据。
计划中的 Redis Oracle、TCL、Raft simulator、Hot Tier 或故障矩阵不得描述为当前能力。
工作包使用统一状态:
proposed
→ accepted-design
→ ready
→ in-progress
→ implemented
→ verified
→ accepted
→ released
旁路状态:
blocked
deferred
frozen
superseded
abandoned
含义:
- accepted-design:设计已批准,但未授权源码实施。
- ready:前置决策、Issue、计划和环境均已就绪。
- in-progress:唯一当前实施任务。
- implemented:代码或文档已进入指定引用,但尚未完成合并后验证。
- verified:已在 exact ref、指定平台和指定门禁上复验。
- accepted:Requirement、Issue、文档和残留风险已经对账。
- frozen:只允许维护设计和门禁,禁止生产实现。
WP0 是一次性的 planning-only bootstrap:它的交付物就是本 SDD,因此 WP0
章节同时承担 spec 和 implementation plan,current_plan 指向本文件内的 WP0
锚点。WP1-WP7 不适用该例外,进入 ready 前必须建立独立 spec 和 plan。
Kiwi 是一个以 Redis 8.8.1 exact tag 可观察语义兼容为目标的生产级 Rust Redis-compatible 数据库。RocksDB 保存完整、权威、可恢复的数据,OpenRaft 提供经过故障验证的强一致、高可用、成员变更、快照和恢复能力。
当前只执行 Cache OFF 的 M0 到 M6:
- M0:权威控制面、事实基线和恢复纪律;
- M1:Redis 8.8.1 Oracle 与兼容性基础;
- M2:RocksDB 权威状态、格式、拓扑和恢复;
- M3:Redis Core 可观察语义;
- M4:生产级单 Raft Group;
- M5:分布式故障和一致性证明;
- M6:系统稳定门禁。
M7 到 M10 进入长期架构,但不进入当前实现:
- M7:Embedded Redis Hot Tier 资格验证与实现;
- M8:Cache ON 正确性、故障和性能证明;
- M9:生产发行门禁;
- M10:Multi-Raft 和远期容量。
- M6 通过并由用户另行批准前实现 Embedded Redis Hot Tier。
- 当前实现真正的 Multi-Key、跨 Slot 原子性或 2PC。
- Multiple DB、Multi-Raft、resharding。
- VectorSet、全文索引、AI 数据库或 Agent Memory 主线。
- TOML 配置迁移。
- Small Object Compact Encoding。
- 重新引入通用 Engine facade。
- 为跳过 RocksDB native build 改变生产存储后端。
- 建立与现有 checkpoint/install-marker 平行的第二套恢复机制。
| 等级 | 来源 | 用途 |
|---|---|---|
| A | 当前 exact-ref 源码、已合并 PR、可复现测试 | 当前事实和验收 |
| B | 已批准 Requirement、Decision、规范性领域合同 | 目标和约束 |
| C | 边界明确的开放 Issue、未合并 PR | 候选工作项 |
| D | Discussion、RFC、Proposal | 设计输入,必须显式采纳 |
| E | 历史计划、旧周报、过期 Issue、草稿 | 背景,不形成当前任务 |
- Repository:arana-db/kiwi。
- Default branch:main。
- main:9820162ebdf2d26aa6349e704efe8737b2e73e4a。
- Open Issues:63;#415 是 WP1 Oracle provenance 实施 Issue,#416 是 WP0 合并后验证修复 Issue。
- Discussions:17,其中 1 个关闭,没有 accepted answer。
- PR #409:MERGED,对应 merge commit 0c4795ec716299598686fc7c5e0fac03a30e044d。
- Issue #407:CLOSED,关闭时间 2026-08-02T04:44:40Z。
- PR #412:MERGED,Head 9d1f83360eb52ed23b48b2e5cb1159c93e26e7af,merge commit cbcbadc27068634d851ab0ed63989d2214ab2408;Issue #143 已关闭。
- PR #414:MERGED,base 0c4795ec716299598686fc7c5e0fac03a30e044d,Head e2bfc7deb481590a757f0034874b7f21a4a31aa2,merge commit 9820162ebdf2d26aa6349e704efe8737b2e73e4a;Issue #413 已关闭。
- main@9820162ebdf2d26aa6349e704efe8737b2e73e4a 的 push CI run 30747510551 已完成但失败;唯一失败项是 planning SDD validation,其使用旧 baseline 累计了先合并的 PR #412 路径。
- PR #356:OPEN,Head f1f8d7539812efd4c6c5e99d540744976d4f6261,CONFLICTING/DIRTY,Windows build 和 LeakSanitizer 检查失败;VectorSet 不进入当前主线。
- PR #261:OPEN,Head fb092812234a54ad3757d35a62ad033136e422c7,GitHub 当前返回 mergeable/mergeStateStatus UNKNOWN,属于长期滞留 PR。
该快照只用于编制本版本。开始任一工作包、创建 PR、复审或验收前必须重新查询实时状态。
当前 63 个开放 Issue 按 SDD 用途分为:
| 分类 | 数量 | 处理 |
|---|---|---|
| 当前主路线 | 22 | 映射到 M0-M6 当前主路线的 WP0-WP7 工作包 |
| 需要源码复核、重新定界或产品决定 | 25 | 先审计或决策,不直接实施 |
| 已过期、被替代或与当前方向冲突 | 16 | 不进入当前实现,后续单独治理 |
Issue 数量和分类会变化,工作包只依赖明确列出的 Issue,不依赖总数。
| 主题 | Issue | SDD 用途 |
|---|---|---|
| Compaction | #88 | WP5 物理清理 |
| Compaction filter | #138 | WP5 filter 安装与生命周期 |
| Block cache | #143 | 支持轨道,PR #412 已合并,Issue 已关闭,待能力证据评估 |
| Error model | #315 | WP6 |
| Test strategy | #325 | WP1/WP6/WP7 |
| Raft apply Epic | #332 | WP4 Epic |
| Applied metadata | #334 | WP4 child |
| Apply marker | #335 | WP4 child |
| RESP write proposal | #336 | WP4 child |
| Apply routing validation | #337 | WP4 child |
| Deterministic TTL | #338 | WP5 primary |
| Applied frontier snapshot | #339 | WP5 child |
| Crash matrix | #340 | WP7 primary |
| StorageManifest | #342 | WP2 primary |
| Persisted topology | #343 | WP2 child |
| RocksDB architecture Epic | #347 | WP2/WP3 parent |
| Bounded executor | #351 | WP3 primary |
| Runtime cleanup | #352 | WP3 child |
| Native build Epic | #353 | 支持轨道 |
| Graceful shutdown | #408 | WP3 child |
| Real INFO state | #410 | WP7 related |
| SDD control plane | #413 | WP0 primary |
Issue #407 已关闭, PR #409 已合并。后续只对账剩余 TTL、generation、compaction、snapshot 和 replay 语义,不重复规划 DEL 基础实现。
先基于当前 main 和 Redis 8.8.1 Oracle 复现,再决定关闭、改写或拆 child Issue:
- #95、#117、#121;
- #127、#128、#129、#130、#131;
- #141、#142、#144;
- #195、#214、#215、#219、#220、#223、#252。
先做产品或架构决策,不直接实施:
- #106 Multiple DB;
- #192 MONITOR;
- #196 cross-slot atomicity;
- #205 skip RocksDB compilation;
- #230 Raft source research;
- #247 TOML;
- #368 Runtime RFC。
从当前 M0-M6 实现范围排除:
- #39、#42、#45、#47;
- #55、#57、#65、#66、#74、#90;
- #132、#133、#204、#213、#218、#341。
| 分类 | Discussion | 用途 |
|---|---|---|
| 当前设计输入 | #330 | Raft apply 工作分解 |
| 当前设计输入 | #331 | VectorSet 候选设计,当前 Frozen |
| 当前设计输入 | #344 | Storage 生产化候选项 |
| 当前设计输入 | #345 | Compact Encoding 预研,Deferred |
| 当前决定来源 | #346 | 当前不支持真正 Multi-Key |
| 当前设计输入 | #377 | Redis AI 候选方向,Frozen |
| 当前优先级参考 | #411 | Rust 与 kiwi-cpp 差距参考 |
| 历史背景 | #48、#49、#169、#176、#232、#235、#236、#241、#257 | 不进入当前实现 |
| 已过期 | #301 | 不再作为当前 Vector/FT 路线 |
Discussion 没有 accepted answer;除 #346 已被本 SDD 采纳为 D017 外,其余都不能单独定义当前产品行为。
当前 workspace 包含:
- storage;
- kstd;
- common/macro;
- common/runtime;
- net;
- resp;
- server;
- conf;
- cmd;
- executor;
- client;
- raft;
- tools/runtime-baseline;
- tools/compat。
历史 engine crate 已不在 workspace。主数据路径直接依赖具体 RocksDB,不存在第二生产存储后端。
flowchart LR
Client["Redis Client"]
Net["NetworkServer<br/>连接、RESP、认证、网络侧 admission"]
Channel["StorageClient<br/>有界 MPSC + oneshot"]
StorageServer["StorageServer<br/>存储 Runtime 调度"]
Cmd["Cmd::execute<br/>命令语义"]
Storage["Storage / Redis instances"]
RocksDB["RocksDB<br/>当前 6 个 CF"]
Client --> Net
Net --> Channel
Channel --> StorageServer
StorageServer --> Cmd
Cmd --> Storage
Storage --> RocksDB
当前事实:
- 进程创建 bootstrap、network、storage 三个 Tokio Runtime。
- 双 Runtime 只准确描述请求数据面。
- network 到 storage 的主 MessageChannel 有界。
- 活跃存储命令路径没有经过 CmdExecutor worker queue。
- 网络侧和 StorageServer 侧存在双阶段初始化或校验约束。
- standalone mutation 最终直接提交 RocksDB。
- cluster mutation 通过 BinlogBatch 和 append-log callback 进入 OpenRaft。
- Raft state-machine apply 使用直接 RocksDB batch,避免递归提交 Raft。
- RocksDB 是业务数据、类型、编码和 TTL etime 的唯一持久化权威。
- 主数据库固定使用六个 CF:default/meta/string、hash、set、list、zset-data、zset-score。
- CF 名称、index、comparator、compaction filter、batch 路由和 Raft checkpoint 列表分散硬编码。
- 当前没有统一 StorageManifest。
- ExpirationManager 是进程内索引,启动时不从 RocksDB 重建。
- CompactSpecificKey 当前只记录日志并返回成功,未执行真实物理清理。
- 生产节点使用独立 RocksDB Raft log store。
- RocksDB batch write 返回成功后才推进进程内 last_applied;该写入是否满足最终批准的 durability profile 尚未完成证明。
- Raft log、vote 和 committed state 使用普通 RocksDB write/put 后即确认完成,尚缺显式 stable-storage 语义证明。
- Snapshot install 已有 staged restore、pause、install marker、RocksDB reopen 和切换骨架。
- Snapshot archive 当前完整驻留内存。
- Snapshot metadata 允许未来版本,而 install marker 对未知版本 fail closed,策略不一致。
- RuntimeManager 当前先停止 storage runtime,再停止 network runtime。
- network、StorageServer、cluster gRPC 和 Raft bridge 的长期任务没有统一 supervisor。
- Storage 到 Raft bridge 使用无界 channel。
- Redis 8.8.1 compatibility manifest 当前只覆盖 ZMSCORE、SUBSTR、TOUCH、SCAN。
- CI 尚未形成完整 Oracle、raw RESP differential、TCL、deterministic Raft simulator、process crash matrix 和真实磁盘 upgrade/rollback 矩阵。
- Embedded Redis Hot Tier 当前没有生产依赖、loader、FFI 或 Cache ON 数据路径。
flowchart TB
subgraph External["外部边界"]
Client["Redis Client"]
Admin["运维 / 管理接口"]
Oracle["Redis 8.8.1 Oracle<br/>仅测试进程"]
end
subgraph NetworkPlane["网络与准入平面"]
Listener["Listener / Connection Supervisor"]
Resp["RESP2/RESP3 Parser / Encoder"]
Admission["认证、命令分类、背压、绝对 Deadline"]
end
subgraph CommandPlane["确定性命令平面"]
Contract["Command Contract<br/>参数、错误优先级、权限、Key/Slot"]
Operation["Deterministic Operation<br/>Read / Mutation / Admin"]
end
subgraph RuntimeBoundary["Runtime 边界"]
Gateway["Storage Gateway<br/>有界队列、取消、Deadline、指标"]
Scheduler["Storage Scheduler / Bounded Executor"]
end
subgraph ConsensusPlane["共识平面"]
ReadBarrier["Linearizable Read Barrier"]
Proposal["Raft Proposal"]
OpenRaft["OpenRaft"]
Apply["State-Machine Apply"]
end
subgraph StoragePlane["权威存储平面"]
Owner["Storage Owner"]
Manifest["StorageManifest"]
Rocks["RocksDB<br/>唯一权威状态"]
TTL["TTL / Generation / Lifecycle"]
Snapshot["Checkpoint / Snapshot / Restore"]
end
subgraph LifecyclePlane["生命周期和可观测性"]
Supervisor["Process Supervisor"]
Provider["Runtime / Storage / Raft State Provider"]
Info["INFO / Metrics / Health"]
end
subgraph Future["冻结能力"]
HotTier["Embedded Redis Hot Tier"]
MultiRaft["Multi-Raft / Resharding"]
end
Client --> Listener --> Resp --> Admission --> Contract --> Operation --> Gateway --> Scheduler
Scheduler -->|"standalone"| Owner
Scheduler -->|"cluster read"| ReadBarrier --> Owner
Scheduler -->|"cluster mutation"| Proposal --> OpenRaft --> Apply --> Owner
Owner --> Manifest
Owner --> Rocks
Owner --> TTL
Owner --> Snapshot
Supervisor --> Listener
Supervisor --> Gateway
Supervisor --> Scheduler
Supervisor --> OpenRaft
Supervisor --> Owner
Owner --> Provider
OpenRaft --> Provider
Supervisor --> Provider
Provider --> Info
Admin --> Info
Oracle -.测试比较,不进入生产依赖.-> Contract
Rocks -.M6 后且另行批准.-> HotTier
OpenRaft -.容量证据充分后.-> MultiRaft
Network
→ Command Contract
→ Storage Gateway
→ Storage Scheduler
→ Consensus / Storage
→ RocksDB
禁止:
- Storage 依赖 Network;
- RocksDB 依赖命令解析;
- Raft 持有 RESP connection;
- Oracle 进入生产 runtime;
- Hot Tier 成为权威存储;
- 通过全局单例、逃逸 Arc 或无 owner callback 建立隐式反向依赖。
| 组件 | 负责 | 不负责 |
|---|---|---|
| Network/RESP | 连接、partial I/O、协议、网络资源上界 | 业务状态和 RocksDB |
| Admission | 认证、分类、背压、请求预算、absolute deadline | 执行业务 mutation |
| Command Contract | 参数、错误优先级、权限、Key/Slot、能力声明 | 线程和物理存储 |
| Storage Gateway | network 到 storage 的唯一异步边界 | 命令语义 |
| Storage Scheduler | 有界调度、取消、deadline、并发控制 | 第二套业务模型 |
| OpenRaft | 日志、投票、提交、membership、一致性顺序 | Redis 命令错误语义 |
| State-Machine Apply | 确定性应用已提交 mutation | 吞掉 apply fatal error |
| Storage Owner | DB、instance、CF、gate、reopen、snapshot 生命周期 | 网络连接 |
| StorageManifest | 格式、CF、comparator、DataType、topology、版本 | 动态业务状态 |
| Lifecycle Supervisor | task owner、cancel、drain、join 和退出次序 | 命令语义 |
| State Provider | 输出实际 runtime/storage/Raft 状态 | 自建影子状态 |
| Redis Oracle | 兼容性实验和差异证据 | 生产请求和数据 |
| Hot Tier | 获批后的可丢弃读加速 | 权威数据、Raft Log、Snapshot |
Standalone:
- 单进程;
- network/storage 请求数据面隔离;
- mutation 通过 Storage Scheduler 直接进入 RocksDB atomic batch;
- 不创建生产 Raft proposal 快速路径;
- 仍使用相同 StorageManifest、TTL、Snapshot、shutdown 和兼容性合同。
Cluster:
- 当前目标是生产级单 Raft Group;
- 所有 client mutation 经过 OpenRaft;
- linearizable read 由当前 Leader 提供,并经过 OpenRaft
ensure_linearizable/ReadIndex,或经过批准且证明安全的 Lease read protocol; - Raft log store 与业务 RocksDB 生命周期分别管理,但由统一 supervisor 排序;
- snapshot、membership、leader transfer 和 reopen 进入 required gate。
Standalone 和 Cluster 不能形成两套 Redis 可观察语义、磁盘格式或 TTL 规则。Multi-Raft、resharding 和跨 Slot 原子性不属于当前部署模式。
下表定义目标架构不变量,不把目标能力写成当前事实。Current 记录本 PR
绑定 baseline_ref 的源码状态;Gap、Work Package 和 Acceptance 给出从
当前状态闭合到 Target 的责任和可重复证据。
| ID | Target invariant | Current | Gap | Work Package | Acceptance |
|---|---|---|---|---|---|
INV-01 |
所有架构和验收结论绑定 exact Git SHA。 | 本 SDD 和源码证据索引已绑定 baseline_ref。 | 后续实现、PR 和 exact-main 证据仍需逐次绑定最终 SHA。 | WP0-WP7 | 每个工作包记录 Base、Head、merge SHA 和 exact-main 验证 SHA。 |
INV-02 |
RocksDB 保存完整、权威、可恢复的业务状态。 | RocksDB 是当前业务数据权威。 | CF/格式 manifest、真实 close/reopen 和故障恢复证据未闭合。 | WP2、WP4、WP5、WP7 | manifest、durable apply、重启、损坏和 snapshot 恢复门禁全部通过。 |
INV-03 |
standalone mutation 直接写 RocksDB;cluster client mutation 必须先经 Raft;Raft apply 不得再次提交 Raft。 | standalone 与 cluster 路由已经分离,apply 有独立入口。 | cluster 全命令覆盖和反向绕过证明不足。 | WP4、WP6 | 路由矩阵和回归测试证明所有 mutation 只有一条合法路径。 |
INV-04 |
mutation 持久化成功后才能推进 last_applied。 | 当前只能证明 RocksDB batch write 返回成功后才推进进程内 last_applied。 | 原子性、批准的 durability profile、I/O failure 和崩溃窗口证据不足。 | WP4 | fault injection 证明 Durable 前不会推进 last_applied。 |
INV-05 |
Raft vote、log 和 committed state 只能在满足 OpenRaft 持久化合同后确认完成。 | 当前实现使用普通 RocksDB write/put 持久化 vote、log 和状态。 | sync 语义和 callback 完成点缺少完整故障证明。 | WP4 | OpenRaft storage suite、fsync profile 和故障矩阵通过。 |
INV-06 |
Linearizable Read 必须由当前 Leader 提供,并经过 OpenRaft ensure_linearizable/ReadIndex,或经过批准且证明安全的 Lease read protocol;单纯 leader 身份检查不构成读屏障。 |
network leader gate 只拦截非 leader write,read 没有 ReadIndex/Lease barrier。 | follower、leader transfer、partition 和 term 变化下可能读取 stale state。 | WP4、WP7 | 读屏障测试和线性一致性 history 通过。 |
INV-07 |
所有跨 Runtime 或跨长期任务队列必须有界。 | MessageChannel 有界;Storage→Raft 仍使用 unbounded channel。 | 需要统一容量、过载语义和指标。 | WP3 | 队列容量、queue-full 响应、压力和内存上界门禁通过。 |
INV-08 |
一个请求只使用一个 absolute deadline,排队和执行共享预算。 | pipeline 只有局部共享 timeout,其他阶段各自计时。 | admission、排队、Raft、apply 和响应尚未共享同一预算。 | WP3、WP4 | deadline 传播测试证明各阶段只消费剩余预算。 |
INV-09 |
所有长期任务必须有 owner、cancellation token、JoinHandle 和确定性 join。 | 多个长期任务仍由裸 tokio::spawn 启动。 |
owner、取消和 join 责任未统一。 | WP3 | lifecycle registry 和退出测试证明无 detached task。 |
INV-10 |
shutdown 必须先停止 admission,再 drain 依赖,最后关闭 RocksDB。 | 当前 manager 先停止 storage,再停止 network。 | 关闭顺序与依赖方向相反。 | WP3 | 并发 shutdown 测试证明 admission→drain→RocksDB 顺序。 |
INV-11 |
persisted etime 是 TTL 权威;内存索引只能是可丢失优化。 | etime 已持久化,expiration manager 是辅助索引。 | restart、compaction、generation 和 stale-index 证据不足。 | WP5 | 删除内存索引后重建、重启和 TTL differential 通过。 |
INV-12 |
所有 CF 消费者由同一可验证 manifest 闭合。 | CF 列表分散在创建、扫描、TTL、compaction 和 snapshot 路径。 | 没有单一 manifest 和消费者闭包检查。 | WP2 | manifest consumer-closure checker 和新增 CF 变异测试通过。 |
INV-13 |
未知 disk、snapshot、comparator 或 manifest 版本默认 fail closed。 | snapshot install marker 对未知 marker version fail closed,但 snapshot metadata 接受未来版本。 | 版本策略不一致。 | WP2、WP5 | 所有未知/未来版本负向测试一致拒绝。 |
INV-14 |
Snapshot build、install、普通 apply、reopen 和 shutdown 必须由同一 gate 建立顺序。 | 各路径有局部锁和 staged install。 | 缺少覆盖全部状态转换的统一 gate。 | WP3、WP5 | 并发 build/install/apply/reopen/shutdown 矩阵无竞态和旧状态可见。 |
INV-15 |
旧 Storage、Redis、DB、CF、iterator 或 snapshot handle 不得跨 reopen/swap 继续使用。 | reopen 和 install 会替换部分顶层对象。 | 跨层缓存 handle 的失效证明不足。 | WP2、WP5 | generation/handle 负向测试证明旧对象全部拒绝使用。 |
INV-16 |
每个 Binlog 必须有明确 db、instance、slot/group 和 generation 语义。 | db_id 固定为 0,slot 从 key 推导,instance 由本机 topology 推导,缺少 group/generation。 | replay、迁移和 stale generation 语义未定义。 | WP2、WP4、WP5 | 编码 round-trip、cluster replay 和 generation rejection 通过。 |
INV-17 |
Redis 兼容结论必须来自固定 Oracle、raw response 和最终状态的可复现实验。 | 已固定 Redis 8.8.1 tag/commit 和 provenance 合同。 | manifest、raw-frame differential 和独立重建尚未全部完成。 | WP1、WP6、WP7 | exact Oracle 重建 hash equality 与兼容矩阵通过。 |
INV-18 |
非幂等写结果未知时标记 SUBMIT_UNKNOWN,不盲目重试。 | 当前没有端到端 typed SUBMIT_UNKNOWN,相关失败压成通用错误。 | 断线、超时和提交后响应丢失仍可能混同普通失败。 | WP4、WP7 | fault history 区分 safe failure、success 和 SUBMIT_UNKNOWN。 |
INV-19 |
INFO 和 metrics 只消费真实 provider,不维护硬编码影子状态。 | INFO 仍包含硬编码版本、平台、PID、端口和 uptime。 | runtime、storage 和 Raft provider 未闭合。 | WP7 | provider contract 测试和真实进程 INFO/metrics 对账通过。 |
INV-20 |
M6 前 Embedded Redis Hot Tier 保持 frozen。 | D009 和当前 scope 已冻结 M7/M8 热层实施,生产路径中不存在 Hot Tier。 | 无实现 Gap;必须持续防止实现 PR 隐式解除冻结。 | WP7 | M6 gate、用户批准和新 Decision 同时存在后才可解除。 |
Accepted
→ Admitted
→ Queued
→ Executing
→ Completed
旁路:
Rejected(queue-full)
Cancelled(client-or-shutdown)
TimedOut(deadline)
SubmitUnknown(cluster-non-idempotent)
规则:
- 在网络准入时生成单一 absolute deadline。
- 入队、等待 gate、Raft proposal、apply 和 response 共享剩余预算。
- queue full 立即返回有类型的过载错误,不无限等待。
- deadline 到期不等于 mutation 未提交;cluster 非幂等写必须区分 safe-failure 和 SUBMIT_UNKNOWN。
Validated
→ Routed
→ Proposed
→ Committed
→ Applying
→ Durable
→ Applied
→ Replied
规则:
- commit 前不得改变权威业务状态。
- apply corruption、CF、slot、instance 或 I/O failure 是 state-machine fatal error,不是普通 Redis response。
- last_applied 在 Durable 后推进。
- callback 只有在相应 stable-storage 语义满足后完成。
- 客户端取消不能取消已经进入共识并可能提交的 mutation。
Live(generation=N, etime)
→ LogicallyExpired
→ Invisible
→ PhysicallyReclaimed
DEL:
Live(N)
→ Tombstoned/GenerationAdvanced(N+1)
→ Invisible
→ Reclaimed
规则:
- persisted etime 和 generation 决定可见性。
- 物理清理可以延迟,不能决定正确性。
- 旧 generation 的 collection data、异步任务和未来 cache fill 不得重新变为可见。
- Issue #407 和 PR #409 作为已完成 DEL generation 基础证据;WP5 只处理剩余跨类型、TTL、compaction、snapshot 和 replay 闭环。
Receiving
→ Staged
→ Validated
→ Paused
→ MarkerPersisted
→ OldStorageClosed
→ CheckpointSwapped
→ NewStorageOpened
→ MetadataCommitted
→ MarkerRemoved
→ Resumed
规则:
- archive 和 unpack 必须流式、有总字节、文件数、路径和展开比限制。
- unknown version 默认拒绝。
- 每个 marker 阶段必须定义重启恢复动作。
- collector 或 topology metadata 损坏只有在可证明重建时才能忽略,否则拒绝安装。
Running
→ Quiescing
→ DrainingNetwork
→ DrainingStorageAndRaft
→ StoppingBackgroundTasks
→ ClosingStorage
→ StoppingRuntimes
→ Stopped
顺序:
- 停止 accept 和 admission。
- 取消并等待连接任务。
- 关闭 request sender。
- drain StorageServer 和 Raft in-flight。
- 结束 snapshot、expiration、compaction、gRPC 和 bridge tasks。
- 关闭 Storage、Redis、DB、CF 和相关 handle。
- 停止 storage、network 和 bootstrap runtime。
超时后允许强制退出,但必须输出未完成阶段和 SUBMIT_UNKNOWN 风险。
WP2 的详细规格必须至少冻结:
- manifest schema version;
- Kiwi disk format version;
- DataType tag table;
- CF identity、name、index 和 role;
- comparator name、version 和 ordering contract;
- key/value encoding version;
- instance count 和 instance identity;
- slot/topology generation;
- RocksDB option compatibility identity;
- snapshot compatibility range;
- created_by 和 last_migrated_by;
- checksum。
新增或修改 DataType、CF 或格式时必须检查:
- DataType 解析和显示;
- ColumnFamilyIndex;
- descriptor 和 options;
- comparator;
- compaction filter;
- batch routing;
- infer_user_key;
- TTL;
- SCAN TYPE 和全局 enumeration;
- RANDOMKEY;
- manifest;
- checkpoint/snapshot;
- Raft replay;
- upgrade/rollback;
- cluster failover;
- backup/restore。
- old binary 打开 newer unsupported format:拒绝。
- new binary 打开 supported old format:只通过显式 migration。
- migration 必须可中断恢复,不能依赖内存状态。
- rollback 仅在兼容矩阵明确允许时进行。
- 未知 comparator 或 CF schema:拒绝启动。
- 所有矩阵使用真实磁盘目录和真实 reopen,不使用仍持有 DB 的对象替代。
至少区分:
- ProtocolError;
- AuthenticationError;
- CommandValidationError;
- WrongType;
- UnsupportedCommand;
- Overloaded;
- DeadlineExceeded;
- NotLeader / Redirect;
- SubmitUnknown;
- StorageUnavailable;
- StorageCorruption;
- DurabilityFailure;
- SnapshotRejected;
- ShutdownInProgress;
- InternalInvariantViolation。
客户端错误、可重试基础设施错误和必须终止 state machine 的 fatal error 不得共享模糊字符串分支。
必须显式配置并测试:
- connection count;
- unauthenticated buffer;
- RESP frame、bulk、nesting、node 和 parse-work 上限;
- network 到 storage queue;
- storage executor queue 和 concurrency;
- storage 到 Raft queue;
- snapshot archive 和 unpack;
- in-flight requests;
- per-request deadline;
- shutdown drain deadline;
- log、metric label 和 artifact 输出上限。
统一 State Provider 输出:
- runtime state、queue depth、rejection、deadline;
- storage open/closing/reopening、instance、format、CF、block cache;
- Raft node id、role、term、leader、commit、applied、snapshot、membership;
- lifecycle phase 和未 join tasks;
- compatibility profile identity;
- 当前 Cache OFF 状态。
INFO、metrics、health 和管理命令只消费该 provider。Issue #410 在 WP7 中实施。
- 外部输入可触发的生产路径不得使用 unwrap/expect 制造进程崩溃。
- 日志、metric label、错误和 evidence artifact 不得泄露凭据、原始敏感 payload 或内部地址。
- 第三方源码和行为基线固定 exact tag/commit,记录许可证、patch 和构建输入。
- Kiwi 自有源码保持 Apache-2.0。
- 未来 Redis-derived native library 按 AGPL-3.0-only 管理;组合发行不得声明 Apache-2.0-only。
- Embedded Redis Hot Tier 的许可证、ABI、loader、allocator、线程、多实例和发行必须在 M7 独立批准。
- RedisRaft 只作 clean-room 公共行为参考,不复制其内部实现或测试。
- 唯一普通 Redis Oracle:tag 8.8.1、commit 77b6c308396c9700672390a210143a8496fb4b10。
- Oracle 是独立测试进程,不保存 Kiwi 数据,不参与 Raft。
- 正式 provenance 要求 primary build 与 fresh-checkout verifier rebuild binary hash 一致。
- 正式 INFO server 证据只来自 verifier rebuild。
- 任一 cleanup、identity 或 hash 复核失败不得发布成功 provenance。
PR fast gate:
- manifest schema;
- targeted raw RESP transcript;
- affected command unit/integration;
- parser/partial-I/O regression;
- changed storage/Raft targeted tests;
- formatting、lint、diff check。
Nightly/full gate:
- Redis TCL external-server; -完整 raw RESP2/RESP3 differential;
- property/fuzz corpus;
- deterministic Raft seeds;
- process fault matrix;
- sanitizer;
- long-running and resource-bound tests。
Release/M6 gate:
- fresh environment rebuild;
- upgrade/rollback;
- backup/restore;
- real close/reopen;
- crash/power-loss model;
- 3/5 node histories;
- exact evidence bundle。
每个 skip 或 known difference 必须包含:
- owner;
- GitHub Issue;
- exact reason;
- introduced date;
- affected mode/platform;
- removal condition;
- last verified ref。
没有 Issue 的 skip 不能合并。
flowchart LR
M0["M0<br/>控制面与恢复"]
M1["M1<br/>Oracle"]
M2["M2<br/>RocksDB 权威"]
M3["M3<br/>Redis Core"]
M4["M4<br/>单 Raft Group"]
M5["M5<br/>故障证明"]
M6["M6<br/>稳定门禁"]
Approval["用户重新批准"]
M7["M7<br/>Hot Tier"]
M8["M8<br/>Cache ON"]
M9["M9<br/>Release"]
M10["M10<br/>Multi-Raft"]
M0 --> M1
M0 --> M2
M1 --> M3
M2 --> M3
M2 --> M4
M3 --> M4
M4 --> M5
M5 --> M6
M6 --> Approval --> M7 --> M8 --> M9 --> M10
M1 和 M2 可在边界清晰的独立工作包中有限并行。M4、M5 只以 Cache OFF 为 required 模式。M7-M8 在 M6 PASS 和用户重新批准前保持 frozen。M10 需要单 Group 容量和故障域证据。
flowchart LR
WP0["WP0<br/>单一控制面"]
WP1["WP1<br/>Oracle"]
WP2["WP2<br/>Manifest/Topology"]
WP3["WP3<br/>Runtime/Lifecycle"]
WP4["WP4<br/>Raft Durable Apply"]
WP5["WP5<br/>TTL/Snapshot/Compaction"]
WP6["WP6<br/>Redis Core Semantics"]
WP7["WP7<br/>Fault Matrix/M6"]
WP0 --> WP1
WP0 --> WP2
WP0 --> WP3
WP2 --> WP4
WP3 --> WP4
WP1 --> WP6
WP2 --> WP6
WP2 --> WP5
WP4 --> WP5
WP1 --> WP7
WP3 --> WP7
WP4 --> WP7
WP5 --> WP7
WP6 --> WP7
建议执行波次:
- Wave 0:WP0。
- Wave 1:WP1、WP2、WP3 使用独立 worktree 有限并行。
- Wave 2:WP4 和 WP6;两者不能共享实现分支。
- Wave 3:WP5。
- Wave 4:WP7 和 M6 Gate Review。
同一 worktree 和同一 current_work_package 仍只允许一个 in-progress 工作包。并行工作包必须有独立 Issue、spec、plan、branch、recovery 和 PR。
每个工作包都必须显式给出 Status、Primary Issue handling、Parent/Related、 Requirements、Dependencies、Scope、Non-goals、Acceptance criteria 和 Verification gates。下文中的“主要范围”“退出门禁”分别对应 Scope 和 Acceptance criteria;缺少任一字段时,工作包不得进入 ready。
状态:implemented。
目标:
- 建立本文件作为唯一入口。
- 清除 STATE、KANBAN、ROADMAP 的独立实时状态。
- 修正文档中的三 Runtime、真实请求链路、TTL 权威和当前验证能力。
- 建立 Issue、REQ、工作包、PR 和验证追踪。
主要范围:
- .planning/SDD.md;
- .planning/README.md;
- .planning/STATE.md;
- .planning/KANBAN.md;
- .planning/ROADMAP.md;
- CLAUDE.md;
- CONTRIBUTING.md;
- README.md;
- docs/INDEX.md;
- docs/prd.md;
- docs/architecture/redis-8.8.1-system-boundaries.md;
- docs/quality/quality-gates.md;
- docs/quality/system-stability-gate.md;
- .planning/DECISIONS.md;
- .planning/OPEN_QUESTIONS.md;
- .planning/REQUIREMENTS.md;
- docs/personas-and-user-stories.md;
- scripts/validate_sdd.py;
- .github/workflows/ci.yml;
- .github/pull_request_template.md。
Primary Issue handling:
- Primary Issue:#413。
- Issue #413 只覆盖单一 SDD 控制面、事实基线与交付追踪,不吸收 WP1-WP7 的运行时实施。
- 只有完整满足本工作包退出门禁的 PR 才能使用
Fixes #413或Closes #413;部分交付使用Refs #413或Related #413。
Parent / Related:N/A。
Implementation PR:#414。
Post-merge validation repair:#416。
合并证据:
- PR 固定区间:0c4795ec716299598686fc7c5e0fac03a30e044d..e2bfc7deb481590a757f0034874b7f21a4a31aa2;
- merge 固定区间:cbcbadc27068634d851ab0ed63989d2214ab2408..9820162ebdf2d26aa6349e704efe8737b2e73e4a;
- PR #414 于 2026-08-02T12:17:13Z 合并,Issue #413 随后关闭;
- main push CI run 30747510551 / job 91495496924 失败,原因是旧 baseline_ref 把先合并的 PR #412 的 7 个源码路径计入 WP0,而不是 WP0 产物本身失败。
- WP0 exact-main verification:status=pending,ref=none,run=none。
- 状态提升为 passed/verified 时,必须同时将 baseline_ref 推进到 verification ref 或其后的 main 提交;保留旧 merge ref 会使验收证据不属于已记录的 baseline main 历史。
Requirement:
- REQ-WORK-001 至 REQ-WORK-007。
依赖:
- PR base main@0c4795ec716299598686fc7c5e0fac03a30e044d 的源码事实基线;
- 2026-08-02T12:57:50Z 的 GitHub 快照;
- 无前置工作包;本节按 planning-only bootstrap 例外同时作为 WP0 plan。
非目标:
- 不修改 Runtime、Storage、Raft、协议、构建或测试行为;
- 不实现 WP1-WP7;
- 不实现未来的自动 PR traceability checker;
- 不以 PR #414 已合并或 Issue #413 已关闭自动授权后续源码工作;只有合并后 exact-main 验证通过才能继续进入 verified/accepted。
退出门禁:
- front matter 是唯一机器可解析的当前状态;工作包块和状态表必须与其一致。
- 所有链接和 REQ/Decision 定义、范围及引用全集闭包通过。
- PR 模板要求工作包、Issue 和 REQ,并由评审门禁确认没有保留占位符。
- 原草稿被吸收或删除。
验证门禁:
git diff --check和 committed-diff whitespace check;python scripts/validate_sdd.py --self-test的失败路径变异测试;python scripts/validate_sdd.py的 Markdown 链接、占位词、围栏和状态断言;- WP0 exact-main 状态提升时,baseline_ref 必须推进到 verification ref 或其后的 main 提交,并在线核验 recorded GitHub Actions run 与 ci workflow、main push、精确 SHA 和 success 结论一致;
- 63 个 REQ 和 18 个 Decision 的唯一注册、范围展开和引用全集闭包;
- WP0、primary Issue #413、PR #414 和 20 个预期产物的一致性断言;
- live Issue #413、开放 Issue 数量、关键 PR 状态和远端 main 复核;
- 独立只读审查不得留下 Critical 或 Important finding。
状态:proposed。
Primary Issue:#325。
Related:
- #315;
- #415(M1-001-T2 Oracle provenance);
- OQ-3;
- OQ-10。
Requirement:
- REQ-COMPAT-001 至 REQ-COMPAT-010;
- REQ-STABILITY-002;
- REQ-STABILITY-003。
依赖:
- WP0 accepted;
- Redis 8.8.1 exact tag 和 commit 身份保持固定;
- OQ-3 与 OQ-10 在进入 ready 前形成可执行选择。
交付:
- trusted Oracle independent rebuild;
- raw RESP2/RESP3 differential;
- TCL external-server runner;
- redis-rs test-only suite;
- partial-I/O property tests 和 fuzz;
- skip/difference registry;
- PR fast、nightly full、release gate 分层。
主要范围:
- tools/compat;
- tests/compat/redis-8.8.1;
- tests/tcl;
- tests/python;
- CI compatibility jobs;
- compatibility docs。
非目标:
- 不把 Redis 或 redis-rs 引入生产 server dependency;
- 不声明当前已实现全命令兼容;
- 不实现 Embedded Redis Hot Tier、Cluster Multi-Key 或业务存储格式。
退出门禁:
- Oracle provenance 不能由自报 metadata 证明。
- 基础命令 transcript 可重复。
- 差异均有 Issue、owner 和退出条件。
验证门禁:
- Oracle primary build 与 independent verifier rebuild hash 一致;
cargo test --manifest-path tools/compat/Cargo.toml;- raw RESP2/RESP3 differential、TCL external-server runner 和 Python integration;
- fast/nightly/release 三层门禁均输出 exact-ref、seed 和可回放 artifact。
状态:proposed。
Primary Issue:#342。
Child / Related:
- #343;
- #347;
- OQ-7;
- OQ-8。
Requirement:
- REQ-STORAGE-001 至 REQ-STORAGE-006。
依赖:
- WP0 accepted;
- D016 的 unknown-version fail-closed 决策;
- OQ-7 与 OQ-8 在进入 ready 前收敛为 manifest/topology 验收合同。
交付:
- StorageManifest;
- CF consumer closure;
- comparator 和 encoding identity;
- persisted instance topology;
- safe startup;
- upgrade/rollback;
- snapshot manifest pairing。
主要范围:
- src/storage/src/redis.rs;
- src/storage/src/format_base_key.rs;
- src/storage/src/format_base_value.rs;
- 适用 format_*;
- src/storage/src/custom_comparator.rs;
- src/storage/src/batch.rs;
- src/storage/src/checkpoint.rs;
- src/raft/src/lib.rs。
非目标:
- 不新增 Vector、Hot Tier 或其他 DataType/CF;
- 不实现 Multiple DB、Multi-Raft 或新的泛化 Engine 抽象;
- 不接受未知未来格式、Comparator 或 Snapshot 版本。
退出门禁:
- unknown format fail closed。
- old/new 双向矩阵明确。
- 缺失、额外、错序 CF 和 comparator mismatch 有测试。
- 新增 DataType 的所有消费者闭合。
验证门禁:
cargo test -p storage --all-targets --all-features;cargo test -p raft --all-targets --all-features;- storage fault-injection、真实 close/reopen、old→new、new→old 和拒绝矩阵;
- CF、Comparator、batch、compaction、checkpoint、snapshot 和 replay consumer-closure 扫描。
状态:proposed。
Primary Issue:#351。
Child / Related:
- #352;
- #408;
- #368;
- #347。
Requirement:
- REQ-OBS-001;
- REQ-PERF-001 至 REQ-PERF-003;
- REQ-STABILITY-002;
- REQ-STABILITY-003。
依赖:
- WP0 accepted;
- 重新取得 #350/#390 的 exact Linux/WSL baseline 证据;
- 与 WP2 的 Storage ownership/close 边界协调,但 WP2 和 WP3 可在接口冻结后有限并行。
交付:
- 保持 network/storage 数据面隔离;
- 统一 process supervisor;
- 有界 Storage 到 Raft bridge;
- absolute request deadline;
- admission-first shutdown;
- SIGINT、SIGTERM 和 service-stop;
- 所有长期 task 的 owner/cancel/join;
- 删除未接线脚手架。
主要范围:
- src/server/src/main.rs;
- src/common/runtime;
- src/net;
- cluster gRPC 和 Raft bridge 启动模块。
非目标:
- 不改变 Redis 命令语义、磁盘格式或 Raft durable-apply 合同;
- 不恢复旧的泛化 Runtime/Engine 脚手架;
- 不实现 Hot Tier、Multi-Raft 或新的无界队列。
退出门禁:
- in-flight write、queue full、leader unavailable、snapshot pause 和 shutdown 并发可重复。
- RocksDB 关闭后没有旧 task 访问。
- queue、deadline、drain 和 rejection 有真实指标。
验证门禁:
- common-runtime、net、server 的 all-target/all-feature 定向测试;
- WSL/Linux 的 SIGINT、SIGTERM、queue full、leader unavailable、snapshot pause 和 restart 测试;
- shutdown 顺序、JoinHandle/cancel ownership、absolute deadline 和 bounded-channel 静态闭包扫描。
状态:proposed。
Primary Issue handling:进入 ready 前从 #332 拆出覆盖本工作包完整 durable-apply 验收的精确 Issue。#334 只覆盖 applied metadata,不能单独代表整个 WP4。
Parent / Epic:#332。
Existing child / related Issues:
- #334;
- #335;
- #336;
- #337。
Discussion:
- #330。
Requirement:
- REQ-RAFT-001;
- REQ-RAFT-002;
- REQ-RAFT-005;
- REQ-RAFT-008;
- REQ-STORAGE-001;
- REQ-STORAGE-004。
依赖:
- WP2 的 format/topology 边界;
- WP3 的 bounded bridge 和 lifecycle。
交付:
- vote/log/committed stable-storage policy;
- persisted applied metadata;
- per-log marker 或等价 typed outcome;
- 所有 cluster RESP write 经过 proposal;
- cluster linearizable read 由当前 Leader 提供,并经过 OpenRaft
ensure_linearizable/ReadIndex,或经过批准且证明安全的 Lease read protocol; - apply 时重验 slot、instance、generation;
- SUBMIT_UNKNOWN。
主要范围:
- src/raft/src/log_store_rocksdb.rs;
- src/raft/src/state_machine.rs;
- src/raft/src/leader_gate.rs;
- src/raft/src/node.rs;
- src/server/src/main.rs;
- src/net/src/executor_ext.rs;
- src/net/tests/storage_command_e2e_tests.rs;
- src/net/tests/network_integration_tests.rs;
- src/storage/src/batch.rs;
- storage/Raft fault tests。
非目标:
- 不把宽泛 Epic #332 当作可由单个 PR 自动关闭的 Primary Issue;
- 不实现 Multi-Raft、跨 Slot 原子性或 Hot Tier;
- 不把普通进程重启测试当作 power-loss durability 证明。
退出门禁:
- callback 与 WAL/sync 语义有明确证明。
- process crash 和 power-loss 模型分开。
- vote、append、truncate、purge、committed 和 reopen 单调性有故障测试。
- follower、leader transfer、partition 和 term 变化下的 read 不得绕过一致性门禁。
验证门禁:
- storage/Raft 定向测试、fault injection 和真实 RocksDB reopen;
- vote/log/committed callback 的 WAL/sync 证据与 OpenRaft 合同对账;
- 真实 RESP read 入口及只读命令分类全部经过同一读屏障;
ensure_linearizable/ReadIndex 或批准的 Lease protocol 在 leader transfer、partition、term 变化、commit/apply lag 和 stale follower 场景的回归;- process kill 与 power-loss 模型分别生成 exact-ref evidence;
- 每个实施 PR 使用精确 child 或新建精确 Issue 作为 Primary,#332 只作为 Parent/Epic。
状态:proposed。
Primary Issue:#338。
Child / Related:
- #339;
- #88;
- #138;
- #407 CLOSED;
- PR #409 MERGED。
Requirement:
- REQ-STORAGE-001 至 REQ-STORAGE-006;
- REQ-RAFT-001;
- REQ-RAFT-005。
依赖:
- WP2;
- WP4。
交付:
- persisted etime 和 generation 合同;
- ExpirationManager 去留决策及实现; -真实 physical cleanup;
- collection meta/data reclaim;
- single applied frontier snapshot;
- streaming snapshot;
- strict version 和 marker recovery table。
主要范围:
- src/storage/src/expiration_manager.rs;
- src/storage/src/storage_impl.rs;
- src/storage/src/storage.rs;
- 各 DataType compaction filter;
- src/storage/src/checkpoint.rs;
- src/raft/src/state_machine.rs;
- src/raft/src/snapshot_archive.rs。
非目标:
- 不把 ExpirationManager 变成持久化权威;
- 不接受未知未来 Snapshot 或 storage format version;
- 不实现 Hot Tier、Multi-Key 或与本工作包无关的新 DataType。
退出门禁:
- restart、expire/persist race、同名 key 重建、cluster replay 和 snapshot restore 覆盖。
- Snapshot 每个 marker 阶段有 kill/restart 测试。
- 大 Snapshot 有内存上界。
验证门禁:
- storage/raft targeted tests、fault injection 和 WSL/Linux process kill matrix;
- restart、expire/persist race、same-key recreation、cluster replay 和 snapshot restore;
- archive byte/entry/path/size limits 与 streaming memory bound;
- marker 每个阶段的 fail/restart table 逐项产生可回放证据。
状态:proposed。
Primary Issue:#315。
Related:
- #325;
- #95、#117、#121、#127、#128、#129、#130、#131、#141、#142、#144、#195、#214、#215、#219、#220、#223、#252。
Requirement:
- REQ-COMPAT-001 至 REQ-COMPAT-007。
依赖:
- WP1;
- WP2。
主要范围:
- Redis 8.8.1 compatibility manifest 与 raw transcript;
- cmd、storage、RESP 和 client-visible error behavior;
- tests/compat、tests/tcl、tests/python 及对应回归夹具;
- 旧 Issue 的 current-main 复现、关闭或精确定界。
规则:
- 旧 Issue 不直接转成实现任务。
- 每个 Issue 先在当前 main 和 Redis 8.8.1 Oracle 上复现。
- 已实现则关闭旧 Issue。
- 仍存在则新建或更新精确到命令、错误、格式和验收的 Issue。
- Multi-Key 只做统一 pre-storage/pre-Raft reject,不实现跨 Slot 原子性。
非目标:
- 不按旧 Issue 标题直接补代码;
- 不实现真正 Multi-Key、2PC、跨 Slot 锁或原子 batch;
- 不把 redis-rs 或 Redis Oracle 放进生产依赖或请求路径。
退出门禁:
- required profile 在 Cache OFF 下可重复。
- error priority、WRONGTYPE、TTL、SCAN、Pipeline、binary payload 和连接行为有 raw transcript。
验证门禁:
- 每个命令在 exact Redis Oracle 与 Kiwi 上执行 raw frame/final-state differential;
- 变更命令的 success、error-priority、boundary、partial-I/O 和 binary payload 回归;
- 旧 Issue 的复现证据与 close/re-scope 结果写回 Primary/Related Issue;
- Cache OFF required profile、TCL/Python integration 和 changed-path Rust tests 通过。
状态:proposed。
Primary Issue:#340。
Related:
- #410;
- #325;
- #342;
- #343;
- #408。
Requirement:
- REQ-RAFT-005 至 REQ-RAFT-008;
- REQ-STABILITY-001 至 REQ-STABILITY-006;
- REQ-OBS-001;
- REQ-OBS-002。
依赖:
- WP1 至 WP6。
交付:
- deterministic Raft simulator;
- 3/5 node process harness;
- partition、delay、drop、duplicate、reorder;
- kill、pause、restart、disk fault;
- snapshot interruption;
- fixed-seed replay;
- Elle/Jepsen history; -真实 INFO provider;
- G1-G7 evidence bundle。
主要范围:
- deterministic simulator、3/5 node process harness 和 fault controller;
- Raft/storage/snapshot/lifecycle/INFO 的跨模块验证;
- docs/quality/system-stability-gate.md 的 exact-ref evidence bundle。
非目标:
- 不实现 M7/M8 Hot Tier;
- 不用单元测试或普通 green CI 替代进程级、磁盘和一致性证明;
- 不启动 Multi-Raft、生产发行或容量扩展工作。
退出门禁:
- docs/quality/system-stability-gate.md 所有 required 项有 exact-ref 证据。
- 无未处理 P0/P1。
- M6 PASS 只允许提交 M7 授权请求,不自动解冻。
验证门禁:
- deterministic seed replay、3/5 node partition/kill/restart/disk-fault matrix;
- Elle/Jepsen history checker 与 Snapshot interruption;
- required Linux CI、sanitizers、soak、upgrade/rollback 和 operations drill;
- G1-G7 每项绑定 exact Head、环境、命令、artifact、结果和未覆盖风险。
- Issue #143。
- PR #412 已于 2026-08-02 合并为 cbcbadc27068634d851ab0ed63989d2214ab2408,Issue #143 已关闭;其能力仍按共享预算、全实例/全 CF、table options、指标和基准证据评估。
- 只允许在共享预算、全实例/全 CF、table options、指标和基准均闭合后 accepted。
- Epic #353。
- 已合并 sccache 只是部分能力。
- 构建优化不得改变 arana-db/rust-rocksdb custom extension、ABI 或生产后端。
- prebuilt artifact identity 必须覆盖 fork ref、target、compiler/ABI、features、link mode、extension ref 和 checksum。
Issue / Discussion
→ REQ
→ Decision
→ Work Package
→ Spec
→ Implementation Plan
→ PR
→ Merge SHA Verification
→ Accepted
- 每个实施型工作包必须有一个 primary Issue。
- 没有合适 Issue 时,工作包进入 ready 前创建精确 Issue。
- 宽泛 Epic 必须拆 child Issue。
- Discussion 只作为设计来源。
- CLOSED Issue 只作为历史证据。
- 开始任务前重新确认 Issue state 和当前源码。
完整满足 Issue 全部验收条件:
Primary issue: Fixes #342部分实现:
Primary issue: Refs #334
Parent or Epic: Related #332
Related issues: Refs #335, Refs #336, Refs #337
Design context: Discussion #330禁止对部分修复、Epic 或仍有 required 残留的 Issue 使用 Fixes/Closes;这些关系使用 Refs/Related。
- Work package;
- SDD baseline;
- Primary Issue;
- Parent/Epic 和 related Issues;
- Design Discussion;
- REQ-*;
- Decision;
- scope completion;
- verification environment、commands、results 和 uncovered risks。
原则上一个 PR 对应一个 primary Issue 和一个可共同验收的工作包目标。
获取 merge commit
→ 在 exact main 上执行 required verification
→ 核对 Issue 自动关闭是否正确
→ 更新本文件中的 PR、merge SHA 和证据
→ implemented → verified
→ Requirement 和残留风险对账
→ verified → accepted
PR 合并不等于工作包 accepted。
每个工作包独立执行:
Issue validation
→ Specification
→ Design review
→ Implementation plan
→ Isolated worktree
→ TDD implementation
→ Targeted verification
→ PR
→ Exact-main verification
→ Acceptance
工作包下属材料可位于:
docs/sdd/WP-N/
spec.md
plan.md
verification.md
这些文件只负责该工作包的细节,不能修改项目级路线和状态。当前唯一计划由本文件 current_plan 指向。
实施计划必须:
- 列出精确文件;
- 将测试先于实现;
- 给出命令和预期;
- 区分 Windows、WSL/Linux 和 CI;
- 不包含占位词、回指式步骤或模糊错误处理;
- 每个 PR 保持单一目的;
- 每个提交和 PR 关联工作包、Issue 和 REQ。
- 本文件成为唯一入口。
- 旧实时状态文件不再维护状态副本。
- PR traceability 生效。
- recovery 与 SDD baseline 一致。
- trusted Oracle independent rebuild 通过。
- raw RESP differential 可重复。
- skip/difference 有 Issue 和 owner。
- StorageManifest、topology、format、comparator 和 migration 合同通过。
- 真实 close/reopen、corruption 和 disk fault 通过。
- required Redis Core profile Cache OFF 全绿。
- known differences 明确批准。
- public Raft profile 通过。
- commit/apply/durability 和 linearizable read 无绕行。
- membership、snapshot、transfer 和 reopen 可重复。
- deterministic 和 process-level 故障矩阵通过。
- safety 和线性一致性历史可检查、可回放。
- G1-G7 required 项全部通过。
- exact-ref evidence bundle 完整。
- 无未处理 P0/P1。
- 只能请求用户决定是否规划 M7。
- Embedded Redis Hot Tier;
- Cache ON;
- arana-db/redis 生产 fork 改造;
- native loader、FFI、发行接入;
- VectorSet/AI 主线;
- Multi-Raft。
- Multiple DB;
- MONITOR;
- TOML;
- StreamAppend RPC;
- Small Object Compact Encoding; -跨 Slot atomicity; -对象存储原生引擎。
当前不支持真正 Multi-Key。命令必须在 storage/Raft 前统一拒绝。未来只有在 slot map、原子 batch、锁或事务协议和故障证明完成后重新立项。
| 字段 | 当前值 |
|---|---|
| Baseline | main@9820162ebdf2d26aa6349e704efe8737b2e73e4a |
| Current milestone | M0 |
| Current work package | WP0 |
| Status | implemented |
| Current plan | .planning/SDD.md 的 WP0 章节 |
| Current Issue | #413 |
| Current PR | #414 |
| WP0 exact-main verification | pending |
| Required mode | Cache OFF |
| M7/M8 | frozen |
| Next safe action | 完成 #416 的固定提交区间验证修复;合并后在 exact main 重跑门禁,WP0 进入 verified/accepted 后才恢复 #415 |
PR #414 已合并且 Issue #413 已关闭,但 main push CI 的 planning SDD validation 因并发合并后的漂移 baseline 失败。WP0 因此只能标记为 implemented,不能标记为 verified 或 accepted。Issue #416 负责修复固定提交区间验证;在其合并并于 exact main 复验前,不进入 #415 或 WP1-WP7 的源码实现。
当前架构直接消费以下已批准 Decision:
| Decision | 对本 SDD 的约束 |
|---|---|
| D001 | Redis 8.8.1 exact commit 是唯一普通 Redis Oracle |
| D004 | RocksDB 是唯一完整权威存储 |
| D005 | RedisRaft 只定义公开兼容 Profile |
| D009 | M6 前 Hot Tier 生产实现冻结 |
| D011 | Oracle provenance 使用独立重建和 binary hash equality |
| D012 | 规划 task 与实施 task 分离 |
| D013 | SDD.md 是唯一项目权威入口 |
| D014 | 实施 PR 强制关联工作包、Issue 和 Requirement |
| D015 | 保持 network/storage 数据面隔离并建立统一生命周期 |
| D016 | 未知持久化版本默认 fail closed |
| D017 | 当前不支持真正 Multi-Key |
| D018 | 兼容性与故障验证使用分层门禁 |
以下已批准 Decision 属于治理、测试来源或 M7-M10 冻结范围,同样受本 SDD 追踪,但不授权 WP0-WP7 增加对应生产能力:
| Decision | 映射 |
|---|---|
| D002 | M7-M10 组合发行许可证义务,frozen |
| D003 | M7-M10 热层术语,frozen |
| D006 | WP7 测试模型来源 |
| D007 | WP1/WP6 客户端测试边界 |
| D008 | WP0 工作恢复状态 |
| D010 | M7-M10 热层接口合同,frozen |
Deferred Requirement:
REQ-HOT-001至REQ-HOT-012;REQ-LICENSE-001至REQ-LICENSE-008;REQ-OBS-003;REQ-RAFT-003;REQ-RAFT-004。
WP0-WP7 的 Requirement 字段覆盖当前 M0-M6 实施范围;以上范围映射到 M7-M10 或 frozen/deferred 合同,不构成当前实现授权。验证器只从各 WP 的 Requirement 字段和本 Deferred Requirement 字段计算全集,不接受注释或无关 段落中的偶然 ID 命中。
以下普通决定由工作包设计自行作出:
- 文件和模块内部拆分; -测试分层和命令; -Issue 子任务拆分; -错误类型名称; -有界队列和 deadline 的实现方式; -文档和验证证据格式。
以下高影响决定必须由用户或指定维护者明确批准:
- M6 后是否解除 M7 冻结;
- 公开兼容性承诺的扩大或缩小; -不可回滚磁盘格式变更;
- Multiple DB、Multi-Raft、跨 Slot 原子性;
- Embedded Redis Hot Tier 的 fork、许可证、ABI 和发行; -首次 AGPL 组合发行; -删除或迁移用户可见配置; -merge、远端 Issue/Discussion 状态变更和其他外部写操作。
- 新会话先读 CLAUDE.md、CONTRIBUTING.md 和本文件。
- 本文件 current_work_package 和 current_plan 决定当前任务。
- STATE.md、KANBAN.md 和 ROADMAP.md 只保留迁移指针,不维护状态。
- 工作包设计批准:accepted-design。
- Issue 和计划就绪:ready。
- 开始独立实施任务:in-progress。
- PR 合并:implemented。
- exact-main 验证通过:verified。
- Requirement、Issue 和残留风险对账:accepted。
发现 branch、HEAD、current plan、current PR、dirty ownership 或 GitHub state 不一致时:
- 停止写操作;
- 记录实际状态;
- 区分用户工作、历史工作和当前工作;
- 重新绑定 exact baseline;
- 只有在不覆盖现有工作时继续。
docs/superpowers/specs 和 docs/superpowers/plans 是历史材料。新文档不得把其中的 Rust 1.95、旧 nightly、Edition 2021 或旧 PR 状态当作当前标准。深链使用时必须先核对本文件和当前源码。
本文件或其控制面变更至少运行:
git diff --check
python scripts/validate_sdd.py --self-test
python scripts/validate_sdd.py验证者还必须:
- 保存验证器的确定性摘要,确认 REQ、Decision、当前状态和预期产物计数;
- 重新查询 main、Issue、Discussion 和 PR;
- 确认本文件是唯一项目状态入口;
- 确认没有把目标能力写成当前能力。
纯规划文档任务不运行昂贵 RocksDB 构建;若改动可执行脚本、CI、配置或源码,则按对应风险增加语法、构建、测试和 Linux/WSL 门禁。
以下位置绑定 baseline_ref,用于复核本文件的 Current 描述:
| 事实 | 源码位置 |
|---|---|
| Workspace、Rust 1.97.1、Edition 2024 和依赖 | Cargo.toml |
| bootstrap runtime 和服务启动 | server main |
| Storage 到 Raft append bridge | server main |
| 当前 shutdown 顺序 | runtime manager |
| 有界 MessageChannel | runtime message |
| StorageServer 执行入口 | storage server |
| 网络侧执行扩展 | executor ext |
| CF index 和 descriptor | storage redis |
| TTL etime 权威读取 | storage redis |
| stale 判断 | storage implementation |
| ExpirationManager 内存索引 | expiration manager |
| CompactSpecificKey 当前 no-op | storage |
| Binlog db/slot 隐含约束 | storage batch |
| Raft log/vote/committed 写入 | RocksDB Raft log store |
| durable apply 后推进 last_applied | Raft state machine |
| Snapshot install transaction | Raft state machine |
| Snapshot archive 内存模型 | snapshot archive |
| Snapshot metadata version 处理 | checkpoint |
| 当前 Redis 8.8.1 manifest | compatibility manifest |
源码移动或 baseline_ref 更新时,维护者必须重新定位这些证据;过期行号不能作为接受证据。