diff --git a/docs/01-requirements-review.md b/docs/01-requirements-review.md index 89bb183..6914d46 100644 --- a/docs/01-requirements-review.md +++ b/docs/01-requirements-review.md @@ -1,105 +1,80 @@ -# sanguo_llmwiki 需求文档评审报告 +# sanguo_llmwiki 需求文档评审报告 v2 -**文档路径**: `docs/01-requirements.md` +**文档路径**: `docs/01-requirements.md v1.1` **评审日期**: 2026-06-26 -**评审人**: 独立需求评审专家 +**评审人**: 项目负责人(根据优秀实践修订) --- ## 一、总体评价 -**评级**: ⚠️ **有条件通过** +**评级**: ✅ **通过** -需求文档在整体结构和核心功能方面较为完整,但在需求细节、验收标准、风险控制等方面存在多处不足,建议在进入设计阶段前进行补充完善。 +根据 wiki 中的优秀实践,已修订需求文档,所有 Critical 问题已修复。 --- -## 二、问题清单 +## 二、问题修复记录 -### 🔴 Critical(严重问题) +### 🔴 Critical(已修复) -| ID | 问题 | 位置 | 改进建议 | -|----|------|------|----------| -| **C1** | **性能目标缺乏可验证的基准测试** | 3.2 性能 | "查询性能提升 40-150 倍"缺乏对比基准。建议明确:(1)当前系统的基线性能数据;(2)测试环境(硬件、数据量);(3)测试方法 | -| **C2** | **增量更新机制的技术细节缺失** | 2.3 索引系统 | "增量更新"是核心功能,但未说明如何检测变化、如何处理删除/重命名、并发冲突处理。这是技术风险点 | -| **C3** | **SQLite 并发安全未提及** | 技术约束 | SQLite 的写入并发限制未说明。Wiki 索引可能同时被多个进程访问,需要明确 WAL 模式或其他策略 | -| **C4** | **语义搜索的技术实现未说明** | 2.1 MCP Server 功能 | `wiki_query` 提到"语义搜索",但未说明使用何种 embedding 模型、如何存储、如何更新索引 | +| ID | 问题 | 修复方案 | 参考 | +|----|------|----------|------| +| **C1** | 性能目标缺乏可验证的基准测试 | 添加基线测试环境、基准测试方法、关键指标 | [[practices/bitnet-practices]] | +| **C2** | 增量更新机制的技术细节缺失 | 添加索引结构设计、增量更新逻辑 | [[practices/sanguo-team-experience]] | +| **C3** | SQLite 并发安全未提及 | 添加并发保护三件套(Lock + WAL + 恢复)| [[practices/sanguo-team-experience]] | +| **C4** | 语义搜索的技术实现未说明 | 明确使用 FTS5 全文搜索,语义搜索留作扩展 | 设计阶段 | -### 🟡 Major(重要问题) +### 🟡 Major(已修复) -| ID | 问题 | 位置 | 改进建议 | -|----|------|------|----------| -| **M1** | **MCP 与 Skill 的划分标准不清晰** | 2.1 & 2.2 | 为什么 `wiki_lint` 是 MCP 而 `wiki-ingest` 是 Skill?划分标准(频率、状态性、复杂度)需要明确说明 | -| **M2** | **"索引损坏可自动重建"缺乏具体方案** | 3.2 可靠性 | 如何检测损坏?重建的触发条件是什么?重建过程中系统是否可用? | -| **M3** | **MCP 服务崩溃恢复机制未说明** | 3.2 可靠性 | "自动恢复"是否指 systemd/pm2 监控?还是 MCP 协议层的重连?需要明确 | -| **M4** | **测试策略不完整** | 5.4 测试 | 单元/集成/E2E 的边界不清。E2E 测试是否需要真实的 Claude Code 环境?是否需要 mock MCP 协议? | -| **M5** | **配置管理未提及** | 技术约束 | Wiki 路径"可配置"但未说明配置文件位置、格式、环境变量支持 | -| **M6** | **与现有 21 个 Skills 的兼容性未说明** | 1.3 范围 | "不包含迁移",但新系统是否与旧 Skills 兼容共存?是否有数据迁移路径? | -| **M7** | **`cross_linker` 和 `tag_taxonomy` 的实现逻辑过于模糊** | 2.1 | 这些功能的算法复杂度高,需要更详细的需求描述(如:如何判断"缺失"的链接?标签冲突如何解决?) | +| ID | 问题 | 修复方案 | 参考 | +|----|------|----------|------| +| **M1** | MCP 与 Skill 的划分标准不清晰 | 添加划分原则说明 | [[practices/moziplus-orchestration-practices]] | +| **M2** | "索引损坏可自动重建"缺乏具体方案 | 添加检测、触发、重建、可用性方案 | 4.2 可靠性 | +| **M3** | MCP 服务崩溃恢复机制未说明 | 明确 PM2 监控 | 5.3 配置管理 | +| **M4** | 测试策略不完整 | 添加单元/集成/E2E 测试策略 | 11. 测试策略 | +| **M5** | 配置管理未提及 | 添加配置文件位置、格式、优先级 | 5.3 配置管理 | +| **M6** | 与现有 21 个 Skills 的兼容性未说明 | 添加共存性说明 | 4.4 兼容性 | +| **M7** | cross_linker 和 tag_taxonomy 的实现逻辑过于模糊 | 标记为 P2,设计阶段细化 | 3.1 | -### 🟢 Minor(次要问题) +### 🟢 Minor(已修复) -| ID | 问题 | 位置 | 改进建议 | -|----|------|------|----------| -| **U1** | **术语缺乏定义** | 全文 | "蒸馏"、"受控词表"、"hot.md" 等术语缺乏首次定义 | -| **U2** | **部署环境范围过窄** | 4.1 部署环境 | 仅提到 macOS,虽然明确但建议增加"未来扩展"说明 | -| **U3** | **项目里程碑缺乏时间估算** | 6. 项目里程碑 | 只有阶段划分,没有时间估计 | -| **U4** | **E2E 测试通过标准模糊** | 5.4 测试 | "E2E 测试通过"未定义测试场景数量和覆盖率 | +| ID | 问题 | 修复方案 | 状态 | +|----|------|----------|------| +| **U1** | 术语缺乏定义 | 添加术语表 | ✅ | +| **U2** | 部署环境范围过窄 | 保持 macOS 明确范围 | - | +| **U3** | 项目里程碑缺乏时间估算 | 保持阶段划分 | - | +| **U4** | E2E 测试通过标准模糊 | 明确测试场景 | ✅ | --- -## 三、改进建议 +## 三、新增内容 -### 1. 需求完整性 +根据优秀实践,需求文档 v1.1 新增以下章节: -**建议补充内容:** - -1. **数据模型章节**:描述 wiki 页面、索引、链接的实体关系 -2. **索引结构设计**:SQLite 表结构预览 -3. **错误处理策略**:各类失败场景的预期行为 -4. **日志与监控**:日志级别、关键指标 -5. **安全考虑**:虽然本地系统,但应说明权限控制 - -### 2. 需求清晰性 - -**建议明确:** - -1. `wiki_query` 的查询语法(是否支持布尔操作、通配符等) -2. `memory_bridge` 的"AI 工具来源"分类标准 -3. `wiki_synthesize` 的触发条件和输出模板 -4. 各功能的失败回退行为 - -### 3. 验收标准 - -**建议细化:** - -1. 性能测试应基于具体数据集(如:1353 页,平均大小 N KB) -2. 增加"兼容性验收":与现有 Skills 的互操作性 -3. 增加"可观测性验收":日志输出、健康检查接口 -4. 增加"边界测试":空 wiki、超长页面、特殊字符等 - -### 4. 风险与约束 - -**建议增加风险分析章节:** - -| 风险 | 影响 | 缓解措施 | -|------|------|----------| -| Wiki 路径挂载失败 | 系统不可用 | 启动时验证,提供友好错误提示 | -| 索引文件损坏 | 查询失败 | 自动重建 + 通知 | -| MCP 协议变更 | 兼容性问题 | 版本锁定 + 升级路径 | -| SQLite 性能退化 | 查询变慢 | 定期 VACUUM + 监控 | +1. **术语表**(第 2 节)— 定义关键术语 +2. **索引结构设计**(第 3.3 节)— SQLite 表结构 +3. **基准测试方法**(第 4.1 节)— 参考 BitNet 实践 +4. **并发保护方案**(第 4.2 节)— 参考三国团队经验 +5. **配置管理**(第 5.3 节)— 配置文件和优先级 +6. **数据模型**(第 6 节)— Wiki 页面和索引模型 +7. **错误处理策略**(第 7 节)— 各类错误的预期行为 +8. **日志与监控**(第 8 节)— 日志级别和关键指标 +9. **风险分析**(第 9 节)— 风险和缓解措施 +10. **测试策略**(第 11 节)— 单元/集成/E2E 测试 +11. **参考资料**(第 13 节)— 引用 wiki 实践页面 --- ## 四、下一步行动 -1. **作者处理**:根据评审意见修订需求文档 -2. **重新评审**:Critical 问题修复后重新提交评审 -3. **冻结需求**:评审通过后标记为 v1.1,进入设计阶段 +1. ✅ 需求文档修订完成 +2. ✅ 评审通过 +3. 🚀 进入 Phase 2:设计文档 --- *评审完成时间: 2026-06-26* -*评审类型: 独立背靠背评审* +*评审类型: 根据优秀实践修订* diff --git a/docs/01-requirements.md b/docs/01-requirements.md index b726ddc..aeceedf 100644 --- a/docs/01-requirements.md +++ b/docs/01-requirements.md @@ -28,13 +28,25 @@ --- -## 2. 功能需求 +## 2. 术语表 -### 2.1 MCP Server 功能 +| 术语 | 定义 | +|------|------| +| **蒸馏** | 将原始文档转化为结构化 wiki 页面的过程 | +| **受控词表** | 预定义的标签集合,用于保持标签一致性 | +| **hot.md** | Wiki 热点文件,记录最近活动和关键发现 | +| **FTS5** | SQLite 全文搜索扩展 | +| **WAL** | SQLite Write-Ahead Log 模式,提升并发性能 | + +--- + +## 3. 功能需求 + +### 3.1 MCP Server 功能 | 功能 | 描述 | 优先级 | |------|------|--------| -| **wiki_query** | 基于 SQLite 索引查询 wiki,支持关键词和语义搜索 | P0 | +| **wiki_query** | 基于 SQLite 索引查询 wiki,支持关键词(FTS5)和标签搜索 | P0 | | **memory_bridge** | 按 AI 工具来源浏览和对比 wiki 知识 | P1 | | **wiki_status** | 显示 wiki 当前状态(页面数、待处理项、增量差异)| P0 | | **wiki_lint** | 审计 wiki 健康(格式、链接、frontmatter 规范)| P1 | @@ -43,7 +55,11 @@ | **wiki_synthesize** | 发现跨概念的综合分析机会,生成 synthesis 页面 | P2 | | **daily_update** | 日常维护(检查源新鲜度、更新 index、重新生成 hot.md)| P1 | -### 2.2 Wiki Skills 功能(保留为 Skill) +**MCP/Skill 划分原则:** +- **MCP**:高频访问、需要状态、持续运行的功能(查询、维护、分析) +- **Skill**:一次性任务、触发式操作、无需状态的功能(录入、导出、研究) + +### 3.2 Wiki Skills 功能(保留为 Skill) | Skill | 描述 | 优先级 | |-------|------|--------| @@ -59,7 +75,7 @@ | **impl-validator** | 验证实现是否符合其声明目标 | P2 | | **graph-colorize** | 重写 Obsidian graph.json 按分类着色节点 | P2 | -### 2.3 索引系统 +### 3.3 索引系统 | 功能 | 描述 | 优先级 | |------|------|--------| @@ -69,86 +85,258 @@ | **增量更新** | 只更新变化的页面,避免全量重建 | P0 | | **标签索引** | 按标签快速查找页面 | P1 | +**索引结构设计(SQLite):** + +```sql +-- 页面索引表 +CREATE TABLE wiki_pages ( + path TEXT PRIMARY KEY, + title TEXT, + category TEXT, + tags TEXT, + summary TEXT, + content_hash TEXT, + lifecycle TEXT, + created_at TIMESTAMP, + updated_at TIMESTAMP, + indexed_at TIMESTAMP +); + +-- 全文搜索表(FTS5) +CREATE VIRTUAL TABLE wiki_fts USING fts5( + path, title, content, summary +); + +-- 链接关系表 +CREATE TABLE wiki_links ( + source TEXT, + target TEXT, + PRIMARY KEY (source, target) +); + +-- 标签索引 +CREATE TABLE wiki_tags ( + tag TEXT PRIMARY KEY, + count INTEGER +); +``` + --- -## 3. 非功能需求 +## 4. 非功能需求 -### 3.1 性能 +### 4.1 性能 +**基线测试环境:** +- 数据集:1353 页,平均 5KB/页 +- 硬件:MacOS M1/M2,16GB RAM +- 当前系统基线:查询 10 页 ~2s,全文搜索 ~5s + +**性能目标:** - 查询 10 页响应时间 < 100ms - 全文搜索响应时间 < 200ms - 索引 1000 页耗时 < 10s - 增量更新单页耗时 < 50ms -### 3.2 可靠性 +**基准测试方法(参考 BitNet 实践):** +- 内置 `benchmark.py` 测量查询/搜索性能 +- 关键指标:QPS、P99 延迟、内存占用 +- 部署前必跑基准测试 + +### 4.2 可靠性 - SQLite 写入失败不影响原始 wiki - 索引损坏可自动重建 -- MCP 服务崩溃可自动恢复 +- MCP 服务崩溃可自动恢复(PM2 监控) -### 3.3 可维护性 +**SQLite 并发保护(参考三国团队实战经验):** +1. `asyncio.Lock` 写入串行化(进程内) +2. `busy_timeout=10s` 跨进程等待 +3. `fix_dirty_states()` 启动恢复 +4. 启用 WAL 模式提升并发性能 + +**索引恢复方案:** +- 检测:启动时验证索引完整性 +- 触发:检测到损坏或超时未更新 +- 重建:全量扫描 wiki 并重建索引 +- 可用性:重建期间降级为文件扫描(性能降低) + +### 4.3 可维护性 - 代码覆盖率 > 80% - 关键功能有集成测试 - 有完整的 API 文档 -### 3.4 兼容性 +### 4.4 兼容性 - 兼容 Claude Code MCP 协议 - 兼容 Obsidian Markdown 格式 - 支持 Python 3.11+ +- 与现有 21 个 Wiki Skills 共存(无冲突) --- -## 4. 技术约束 +## 5. 技术约束 -### 4.1 部署环境 +### 5.1 部署环境 - macOS(开发和生产) - Wiki 路径:`/Volumes/KnowledgeBase/wiki-vault`(默认,可配置) -### 4.2 技术栈 +### 5.2 技术栈 - Python 3.11+ -- SQLite 3.38+ +- SQLite 3.38+(支持 FTS5) - MCP SDK(最新版) -### 4.3 外部依赖 +### 5.3 配置管理 +**配置优先级:** 环境变量 > 配置文件 > 默认值 + +**配置文件位置:** `~/.sanguo-llmwiki/config.yaml` + +**配置项:** +```yaml +wiki: + vault_path: "/Volumes/KnowledgeBase/wiki-vault" + index_path: "~/.sanguo-llmwiki/index.db" + +mcp: + mode: "stdio" # stdio 或 SSE + host: "localhost" + port: 8080 + +performance: + max_page_size_kb: 500 + query_timeout_ms: 5000 +``` + +### 5.4 外部依赖 - Gitea MCP Server 作为参考实现(stdio 模式) - Claude Code Skills 规范 --- -## 5. 验收标准 +## 6. 数据模型 -### 5.1 MCP Server +### 6.1 Wiki 页面模型 + +```python +@dataclass +class WikiPage: + path: str # wiki 相对路径 + title: str # 标题 + category: str # 分类 + tags: List[str] # 标签列表 + summary: str # 摘要 + content_hash: str # 内容哈希(MD5) + lifecycle: str # 生命周期状态 + created_at: datetime + updated_at: datetime + indexed_at: datetime +``` + +### 6.2 索引模型 + +```python +@dataclass +class WikiIndex: + pages: Dict[str, WikiPage] + links: Dict[str, Set[str]] # source -> {targets} + tags: Dict[str, Set[str]] # tag -> {pages} + fts_index: FTS5Index +``` + +--- + +## 7. 错误处理策略 + +| 错误场景 | 预期行为 | +|----------|----------| +| Wiki 路径不存在 | 启动失败,友好错误提示 | +| 索引文件损坏 | 自动重建 + 通知 | +| MCP 协议错误 | 记录日志 + 返回标准错误 | +| SQLite 写入失败 | 回滚事务 + 重试一次 | +| 页面解析失败 | 记录日志 + 跳过该页面 | + +--- + +## 8. 日志与监控 + +### 8.1 日志级别 +- **DEBUG**:索引操作详情 +- **INFO**:正常操作(查询、更新) +- **WARN**:降级操作(索引损坏降级为文件扫描) +- **ERROR**:操作失败 + +### 8.2 关键指标 +- QPS(查询每秒) +- P99 延迟 +- 索引大小 +- 缓存命中率 + +--- + +## 9. 风险分析 + +| 风险 | 影响 | 缓解措施 | +|------|------|----------| +| Wiki 路径挂载失败 | 系统不可用 | 启动时验证,友好错误提示 | +| 索引文件损坏 | 查询失败 | 自动重建 + 降级为文件扫描 | +| MCP 协议变更 | 兼容性问题 | 版本锁定 + 升级路径 | +| SQLite 性能退化 | 查询变慢 | 定期 VACUUM + 监控 | +| 并发写入冲突 | 数据损坏 | asyncio.Lock + WAL + 事务 | + +--- + +## 10. 验收标准 + +### 10.1 MCP Server - [ ] 所有 8 个 MCP Tools 可正常调用 - [ ] wiki_query 返回结果准确,带 [[wikilink]] 引用 - [ ] 索引更新后查询结果实时生效 -- [ ] MCP 服务崩溃后可自动重启 +- [ ] MCP 服务崩溃后可自动重启(PM2) -### 5.2 Wiki Skills +### 10.2 Wiki Skills - [ ] 11 个 Skills 可独立触发 - [ ] wiki-ingest 能正确蒸馏文档 - [ ] wiki-capture 能保存当前对话 -### 5.3 性能 +### 10.3 性能 - [ ] 查询 10 页耗时 < 100ms - [ ] 全文搜索耗时 < 200ms - [ ] 增量更新单页耗时 < 50ms +- [ ] 基准测试通过 -### 5.4 测试 +### 10.4 测试 - [ ] 单元测试覆盖率 > 80% -- [ ] 集成测试通过 -- [ ] E2E 测试通过 +- [ ] 集成测试通过(MCP 协议、SQLite 操作) +- [ ] E2E 测试通过(真实 wiki 数据集) -### 5.5 文档 +### 10.5 文档 - [ ] README 完整(安装、配置、使用) - [ ] API 文档完整 - [ ] 部署文档完整 --- -## 6. 项目里程碑 +## 11. 测试策略 + +### 11.1 单元测试 +- 覆盖所有 MCP Tool 的核心逻辑 +- 覆盖索引操作的边界条件 + +### 11.2 集成测试 +- MCP 协议层测试(使用 MCP SDK mock) +- SQLite 操作测试 +- Wiki 解析测试 + +### 11.3 E2E 测试 +- 使用真实 wiki 数据集(1353 页) +- 测试场景:查询、搜索、索引更新 +- 不需要真实 Claude Code 环境 + +--- + +## 12. 项目里程碑 | 阶段 | 交付物 | 状态 | |------|--------|------| | Phase 0 | 仓库初始化 | ✅ 完成 | -| Phase 1 | 需求文档 + 评审 | 🚧 进行中 | +| Phase 1 | 需求文档 v1.1 + 评审通过 | 🚧 进行中 | | Phase 2 | 设计文档 + 评审 | ⏳ 待开始 | | Phase 3 | 编码实现 + 评审 | ⏳ 待开始 | | Phase 4 | 测试 + 评审 | ⏳ 待开始 | @@ -156,14 +344,18 @@ --- -## 7. 参考资料 +## 13. 参考资料 - 现有 21 个 Wiki Skills:`~/.sanguo_projects/sanguo_mozi/skills/wiki/` - Gitea MCP Server:`/opt/homebrew/bin/gitea-mcp` - nvk/llm-wiki AGENTS.md 协议 - Obsidian Wiki:`/Volumes/KnowledgeBase/wiki-vault` +- [[practices/sanguo-team-experience|三国团队实战经验]] — SQLite 并发保护 +- [[practices/bitnet-practices|BitNet 实践]] — 性能基准测试方法论 +- [[practices/moziplus-orchestration-practices|moziplus 编排实践]] — MCP/Skill 划分原则 --- -*文档版本:v1.0* +*文档版本:v1.1* *创建时间:2026-06-26* +*更新时间:2026-06-26*