Files
zclaw_openfang/docs/superpowers/specs/2026-03-31-pre-launch-dual-track-design.md
iven 8898bb399e
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
docs: audit reports + feature docs + skills + admin-v2 + config sync
Update audit tracker, roadmap, architecture docs,
add admin-v2 Roles page + Billing tests,
sync CLAUDE.md, Cargo.toml, docker-compose.yml,
add deep-research / frontend-design / chart-visualization skills

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 19:25:00 +08:00

276 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ZCLAW 上线前双轨并行改进设计
> **日期**: 2026-03-31
> **阶段**: 上线前准备
> **策略**: 功能+质量并行
> **基于**: 三维系统分析 + 代码审查验证(已排除已完成项)
---
## 1. 背景与动机
ZCLAW 系统经过多轮迭代Sprint 1-8 完成10 个 Batch 完成),核心功能完成度达 87-95%。系统当前处于 **B+ 健康度**,存在 41 个已知问题0 Critical, 6 High, 20 Medium, 15 Low
**已完成的关键项(经代码审查确认)**:
- Token 刷新竞态: 已修复 (request.ts `onTokenRefreshFailed`)
- Dockerfile: 已存在 (多阶段构建, rust:1.85-bookworm)
- saas-env.example: 已存在
- 生产部署指南: 已存在 (docs/deployment/saas-production.md, 430 行)
- /api/health: 已在公开路由组
- Agent Template 详情: 已展示所有扩展字段
- AgentOnboardingWizard: 已使用 React hook 模式
**实际剩余上线阻塞项**:
- 反向代理场景下限流失效ConnectInfo 返回代理 IP 而非客户端 IP
- 前端测试覆盖率 0-15%,回归风险极高
- 调度任务执行器为 STUB违反"不展示假数据"原则
- Desktop 废弃代码 + TS 遗留错误
**目标**: 在上线前完成所有阻塞项,同时推进 1-2 个高价值功能以提升产品竞争力。
---
## 2. 系统分析摘要
### 2.1 规模
| 组件 | 规模 |
|------|------|
| Rust Crates | 10 个 (types/memory/runtime/kernel/skills/hands/protocols/pipeline/growth/saas) |
| SaaS API | 93 个端点 (5 公开 + 88 受保护) |
| Tauri Commands | 106 个 |
| Zustand Store | 14 个 (desktop) + 2 个 (admin-v2) |
| 技能 | 71 个 SKILL.md |
| Hands | 9 个已启用 (7 完整 + 2 demo) + 2 个已禁用 (Predictor/Lead) |
| 数据库 | PostgreSQL, Schema v11, 25+ 表 |
### 2.2 实际系统性挑战(经验证)
1. **测试覆盖率缺口** — Admin V2 0%, Desktop ~15%, Rust 34%
2. **类型安全裂缝** — Desktop 50+ `as any`, Mixin 模式无编译时保障
3. **反向代理限流失效** — ConnectInfo 返回代理 IP需 trusted_proxies 配置
4. **功能完整度断层** — 调度任务 STUB, Quiz 占位符, 5 个 404 API
5. **废弃代码残留** — gatewayStore.ts 废弃未清理, TS 遗留错误
### 2.3 关键洞察
- **技能系统是隐藏的宝石**: 71 个 SKILL.md 是差异化资产,应优先展示
- **测试是最大风险**: 0-15% 的覆盖率意味着任何改动都可能回归
- **部署基本就绪**: Dockerfile + 部署指南已存在,需验证而非创建
- **STUB 是隐性技术债**: 违反 CLAUDE.md "不允许展示假数据" 原则
---
## 3. 设计:双轨并行方案
### 3.1 轨道 1 — 质量轨道 (Quality Track)
> 必须在上线前全部完成,阻塞发布。
#### Q1. 安全加固 (~2h)
**Q1.1 反向代理场景限流修复** (唯一实际安全项)
- **文件**: `crates/zclaw-saas/src/middleware.rs:133-140`
- **问题**: 代码正确地不信任 X-Forwarded-For使用 ConnectInfo但当部署在 Nginx 反向代理后ConnectInfo 返回的是代理 IP如 127.0.0.1),导致所有客户端共享同一 IP 限流桶,限流失效
- **方案**:
-`saas-config.toml` 添加 `trusted_proxies = ["127.0.0.1", "::1"]` 配置
- 当请求来自可信代理 IP 时,解析 `X-Forwarded-For` 头获取真实客户端 IP
- 非可信来源继续使用 ConnectInfo保持当前安全行为
- **验证**: 单元测试验证:可信代理 + 有效头 → 使用头中 IP可信代理 + 无头 → 使用代理 IP非可信来源 → 忽略头
**Q1.2 adminRouting 解析验证**
- **文件**: `desktop/src/store/connectionStore.ts:358-372`
- **问题**: 从 localStorage 读取 `adminRouting` 时无类型校验,第 376 行 catch 块静默吞错误
- **方案**: 添加 Zod schema 验证解析结果,无效值 fallback 到默认模式
- **验证**: 测试各种非法输入null, undefined, 畸形 JSON
#### Q2. 部署验证 (~2h)
> 部署基础设施已存在,此任务为验证和完善。
**验证项**:
- `docker compose up` 端到端测试PostgreSQL + SaaS 启动 → 健康检查通过)
- Nginx 配置引用的 `deploy/nginx.conf` 是否存在
- saas-env.example 环境变量是否与实际代码一致
- 生产部署指南步骤是否可执行
**完善项**(如验证中发现缺失):
- 补充 deploy/nginx.conf如果不存在
- 更新 saas-env.example 中的遗漏项
#### Q3. 测试基础 (~10h)
**Q3.1 Admin V2 测试基础设施** (~2h)
- 安装: `vitest`, `@testing-library/react`, `@testing-library/jest-dom`, `msw`
- 配置: `admin-v2/vitest.config.ts` + setup 文件
- MSW handlers 模拟 SaaS API 响应
**Q3.2 Admin V2 核心测试** (~4h)
- `request.ts`: 已有 Token 刷新修复的回归测试、网络错误包装、401 自动重定向
- `authStore`: 登录/登出/Token 刷新状态管理
- 核心页面冒烟测试: Accounts, Providers, AgentTemplates 渲染验证
**Q3.3 Desktop 关键 Store 测试** (~4h)
- `connectionStore`: 三种连接模式切换逻辑
- `chatStore`: 消息发送/接收/流式响应
- `saasStore`: 认证流程 + 心跳降级
#### Q4. 功能补全 (~6h)
**Q4.1 调度任务执行器真实实现** (~4h)
- **文件**: `crates/zclaw-saas/src/scheduler.rs:132,166`
- **方案**: 在 scheduler loop 中实际触发任务执行:
- Agent/Hand/Workflow 类型任务通过内部 HTTP 调用触发(而非外部 API
- 记录执行结果到 scheduled_tasks 表
- 支持失败重试 (指数退避, 最多 3 次)
- **验证**: 集成测试验证任务创建 → 执行 → 结果记录全流程
**Q4.2 Admin V2 表格搜索/筛选** (~2h)
- **方案**: 使用 ProTable 内置搜索能力,为 Accounts/Models/Providers/ApiKeys/Prompts 表格添加搜索栏
- **范围**: 至少覆盖 Accounts 和 Models 两个最常用的表格
#### Q5. 代码清理 (~4h)
**Q5.1 废弃 gatewayStore.ts 清理** (~2h)
- **文件**: `desktop/src/store/gatewayStore.ts` (358 行)
- **方案**:
1. 审查所有 gatewayStore 导入agentStore, configStore, handStore, workflowStore, sessionStore 等可能引用)
2. 验证 facade 模式是否被组件间接使用
3. 移除整个文件,更新所有引用改用 connectionStore
4. 运行全量测试验证无回归
- **风险**: facade 模式可能被组件间接依赖,需要充分验证
**Q5.2 TS 遗留错误修复** (~1h)
- **文件**: `desktop/src/lib/gateway-api.ts`, `desktop/src/lib/kernel-hands.ts`
- **方案**: 修复之前重构引入的类型错误
**Q5.3 未使用依赖清理** (~1h)
- **文件**: `admin-v2/package.json`
- **方案**: 移除 `@ant-design/charts` 未使用依赖
**质量轨道实际总计**: ~24h
### 3.2 轨道 2 — 功能轨道 (Feature Track)
> 不阻塞上线,但提升产品竞争力。可与质量轨道并行。
#### F1. 技能市场 UI (~16h)
**目标**: 展示 71 个 SKILL.md 技能,让用户浏览和发现可用能力
**组件设计**:
- `SkillMarket.tsx` — 主页面,网格布局展示技能卡片
- `SkillCard.tsx` — 单个技能卡片 (名称、描述、标签、激活状态)
- `SkillDetail.tsx` — 技能详情弹窗 (完整 SKILL.md 渲染 + 使用示例)
- `SkillSearch.tsx` — 搜索栏 + 分类筛选
**数据流**:
- 从 Kernel IPC `skill_list` 命令获取技能完整列表
- **搜索方案**: 客户端过滤71 个技能规模小,前端过滤足够高效)
- 名称/描述模糊匹配 (Fuse.js 或手写 filter)
- 按分类标签筛选
- 无需后端搜索命令
- 激活/停用通过现有 `skill_activate` 命令
**分类方案**(基于 SKILL.md metadata:
- 开发与工程 / 商业与营销 / 研究与内容 / 运营 / 专业技能
**依赖**: 需确认 `skill_list` 返回的数据结构包含分类信息
#### F2. 上下文压缩 + 记忆系统 (~12h)
**上下文压缩 Kernel 集成**:
- 将 zclaw-growth 的 Compactor 接入 Kernel 中间件链
- 触发条件: 上下文长度超过模型窗口的 80%
- 压缩策略: 保留最近 N 条完整消息 + 早期消息生成摘要
- **用户可见性**: 压缩后在聊天界面显示"上下文已压缩"系统消息
- **存储**: 摘要作为系统消息存储,原始消息保留但标记为已压缩
**记忆系统升级**:
- 向量化检索优化 (FTS5 → 混合 FTS5 + Embedding)
- MemoryMiddleware 30s 防抖实现
- 记忆提取后自动关联到 Agent Soul
#### F3. Quiz Hand 真实化 (~6h)
**当前问题**: Quiz Hand 使用占位符生成器,生成假数据
**方案**:
- 替换为 LLM 驱动的真实题目生成
- 使用 Pipeline 模板系统 (已有基础设施)
- 支持多题型: 选择题、填空题、问答题
- 难度自适应: 基于用户表现动态调整
**功能轨道总计**: ~34h
---
## 4. 时间线
```
Week 1-2: 质量轨道冲刺 (Q1-Q3) — 阻塞上线
├── Q1: 安全加固 (2h)
├── Q2: 部署验证 (2h)
└── Q3: 测试基础 (10h)
┃ 可并行 ──→ F1: 技能市场 UI (16h)
Week 3-4: 质量收尾 + 功能启动
├── Q4: 功能补全 (6h)
├── Q5: 代码清理 (4h)
├── F2: 上下文压缩 + 记忆 (12h)
└── F3: Quiz Hand 真实化 (6h)
Week 5+: 功能深化
├── Semantic Router 成熟化 (8h)
├── Pipeline 编辑器增强 (12h)
└── i18n 框架 (12h)
=== 上线 Gate ===
质量轨道 Q1-Q5 全部完成 = 可发布
```
---
## 5. 成功标准
### 上线 Gate (必须全部通过)
- [ ] `docker compose up` 可成功启动 SaaS 后端(验证现有基础设施)
- [ ] 反向代理场景下限流正确区分不同客户端 IP
- [ ] Admin V2 测试套件 >10 个测试且全部通过
- [ ] Desktop 关键 Store 测试 >5 个且全部通过
- [ ] 调度任务可创建并可执行(非 STUB
- [ ] `tsc --noEmit``cargo check` 零错误
- [ ] gatewayStore.ts 已完全移除
### 质量指标 (目标)
- Admin V2 测试覆盖率 >30%(后续迭代提升至 80%
- Desktop 关键 Store 测试覆盖率 >40%
- TypeScript 严格模式 `any` 数量 Desktop <10
- Rust 测试覆盖率 >40%
---
## 6. 风险与缓解
| 风险 | 概率 | 影响 | 缓解 |
|------|------|------|------|
| 调度任务执行器集成复杂度超预期 | 中 | 高 | 先实现最简单的 HTTP 触发,后续迭代增加重试 |
| 测试编写发现更多 bug | 高 | 中 | 这是好事,发现的 bug 加入修复列表 |
| gatewayStore 移除导致间接依赖断裂 | 中 | 高 | 先审查所有导入,添加弃用警告阶段 |
| 技能市场 skill_list 返回数据不包含分类 | 中 | 低 | 前端基于 SKILL.md 路径或关键词自动分类 |
---
## 7. 不包含的内容
以下功能明确不在此设计范围内:
- Predictor/Lead Hand 实现(需产品定义)
- 插件系统(需安全沙盒设计)
- 多用户协作(需架构设计)
- Token Pool 计费系统(需商业化设计)
- 实时配置推送 WebSocket当前拉取模式足够
- Redis 持久化限流(单实例部署暂不需要)