diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index a2f48ec0..1bdbeda3 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -14,6 +14,7 @@ | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| +| Cursor | 2026-09-21-upload-parse-ux-dedup | feature/upload-parse-ux-2026-09-21 | .worktrees/upload-parse-ux-2026-09-21 | server+web+storage | in_progress | | Cursor | 2026-09-21-mineru-doc-parsing | feature/mineru-doc-parsing-2026-09-21 | .worktrees/mineru-doc-parsing-2026-09-21 | storage+bizdev+kb | done | | Cursor | 2026-09-21-intent-confirm-stage-aware | fix/intent-confirm-stage-aware-2026-09-21 | .worktrees/intent-confirm-stage-aware-2026-09-21 | intent+web+docgov | done | | Cursor | 2026-09-21-taskrun-status-card | feature/taskrun-status-card-2026-09-21 | .worktrees/feature-taskrun-status-card-2026-09-21 | chat+web+taskrun | done | diff --git a/.doc/ops/short-term/2026-09-21-upload-parse-ux-dedup.md b/.doc/ops/short-term/2026-09-21-upload-parse-ux-dedup.md new file mode 100644 index 00000000..734982a3 --- /dev/null +++ b/.doc/ops/short-term/2026-09-21-upload-parse-ux-dedup.md @@ -0,0 +1,66 @@ +--- +title: "上传文档解析提示 / 去重 / CoW 收口" +status: in_progress +created: 2026-09-21 +updated: 2026-09-21 +owner: Cursor +branch: feature/upload-parse-ux-2026-09-21 +worktree: .worktrees/upload-parse-ux-2026-09-21 +base_dev_sha: 10aee3feb478c550adc9959f2d3a8d17cd5b48a0 +write_scope: + - internal/server/ + - internal/storage/ + - internal/materialindex/ + - web/src/ + - .doc/ops/ + - .doc/audit/ + - .doc/test-reports/ +head_sha: <准入时冻结> +deployment: pending +cleanup: pending +mutex: server+web+storage +--- + +# 上传文档解析提示 / 去重 / CoW 收口 + +## 目标 + +在已合入 dev 的 MinerU 解析管线(`dev@7f150831`)之上,补齐:解析状态提示闭环(轮询、失败原因、重试)、上传去重提示(暴露 CAS `IsDeduplicated`)、CoW 写时复制契约固化(不可变 blob 守卫测试 + 审计记录)。 + +## 范围 + +- `internal/server/asset_handlers.go`:上传响应加 `deduplicated`;列表批量返回 `parse_state`+`parse_error`;新增 `POST .../assets/{id}/reparse`;不支持类型 `skipped` 语义 +- `internal/materialindex/pipeline.go`:`GetParseStates` → `GetParseInfo`(含 error_message);`ResetForReparse` +- `web/src/`:`useParseStatePolling` hook、FilePreviewPanel 徽标轮询与重试按钮、附件去重提示、DocsSection 状态列 +- 测试:CAS CoW 契约、handler、前端单测 + +## 非目标 + +- 不改 MinerU 客户端与解析管线核心逻辑(已验收) +- 不做跨项目逻辑记录合并(物理一份 + 提示方案,逻辑引用保留) +- 不动 test/main 晋升;不改 production_ready + +## 步骤 + +1. [ ] 后端:dedup/parse_error 暴露 + reparse 接口 + skipped 语义 +2. [ ] 前端:轮询 hook + 状态徽标 + 去重提示 + 重试按钮 +3. [ ] CoW 契约测试 + handler 测试 + 前端测试 +4. [ ] 文档:审计记录(CoW 现状)、验收报告 +5. [ ] 集成 dev + 部署 + 实测验收 + +## 验收标准 + +- [ ] 上传重复文件响应含 deduplicated=true,前端提示复用 +- [ ] parse_state 轮询 pending→running→done 自动刷新,无需手动重加载 +- [ ] failed 展示错误原因,reparse 后恢复解析 +- [ ] CAS 同 sha 重复写入不产生新物理文件的契约测试通过 +- [ ] go vet / go test -short / web npm test / npm run build 全过 + +## 相关链接 + +- 前序任务: [2026-09-21-mineru-doc-parsing.md](./2026-09-21-mineru-doc-parsing.md) +- Test report: ../../test-reports/2026-09-21-upload-parse-ux-dedup-test-report.md + +## 证据 / 备注 + +(命令输出、commit、文件路径)