# Tasks - [x] Task 1: QdrantService 管理操作扩展:scroll_l1 分页(仅取 doc_id/title/category/tags/text/level 所需字段)、get_doc_detail(L1+L2/L3 节点+chunk 计数)、delete_by_doc_id(四集合过滤删除返回各集合删除数)、count;内存 Qdrant 单测覆盖 - [x] SubTask 1.1: scroll_l1 与 count 实现 + 单测(分页游标、空集合) - [x] SubTask 1.2: get_doc_detail 与 delete_by_doc_id 实现 + 单测(存在/不存在/删除后四层清空) - [x] Task 2: 文档管理 API:`GET /api/v1/documents`(limit/offset 分页)、`GET /api/v1/documents/{doc_id}`(详情,不存在 code=1004)、`DELETE /api/v1/documents/{doc_id}`(幂等,返回各集合删除数);沿用统一响应与懒加载单例模式;TestClient 测试(mock QdrantService) - [x] Task 3: 统计 API:`GET /api/v1/knowledge/stats`(四层点数 + 类目分布 + uncategorized 数);TestClient 测试 - [x] Task 4: 管理页面 `app/static/admin.html` 单文件(内联 CSS/JS,零外部依赖)+ main.py 挂载 /admin:概览/文档管理(列表/详情/删除二次确认)/入库表单/检索测试台/类目列表五区块,统一 code≠0 错误提示;TestClient 存在性测试(200 + 五区块标记 + 无 http(s) 外链资源) - [x] Task 5: 单测补全:tests/test_judge.py(mock Ollama:正常判定/部分断言不支持/解析失败返回 0.0)、tests/test_response.py、tests/test_ollama_client.py(mock httpx:generate/json_mode/is_available 分支)、tests/test_run_eval.py(门槛判定与格式化纯函数) - [x] Task 6: 部署与文档修补:Dockerfile 增加 `COPY scripts/ scripts/`;CLAUDE.md 更新项目结构(scripts/eval、static)、API 清单(documents 管理端点、stats、/admin)与管理页面使用说明 - [x] Task 7: 集成验证:`uv run pytest` 全绿 + `uv run ruff check app tests scripts` 通过;内存 Qdrant 走通 入库→列表→详情→检索→删除→统计 管理闭环冒烟;确认页面 fetch 路径与实际 API 契约一致 - [x] Task 8: 修复验收发现:CLAUDE.md 项目结构中 tests 目录注释「18 个测试文件」与实际 26 个不符,改为不写死数量防止再次漂移 # Task Dependencies - [Task 2] depends on [Task 1] - [Task 3] depends on [Task 1] - [Task 4] depends on [Task 2, Task 3] - [Task 7] depends on [Task 4, Task 5, Task 6] # Parallelizable - Task 1 / Task 5 / Task 6 互相独立,可并行 - Task 2 与 Task 3 可并行(Task 1 完成后)