## 现状问题 `internal/repo/workspace_checkpoint_chunks.go` 中 `RunsRepo.SaveWorkspaceCheckpointStream` 约 80 行,一个函数里混着四件事:小归档走旧的内联保存、清理过期的暂存分片、**逐块读取源数据并写入分片行(含租约校验、大小上限、SHA-256 累计)**、最后在事务里按租约 CAS 发布清单。其中分片写入循环占了近 30 行,循环里还要维护 `size`/`count`/`hash` 三个外层变量,读主流程时很难一眼看出「暂存 → 发布」两个阶段的边界;局部变量 `hash` 还遮蔽了同文件已导入的 `hash` 包。 ## 重构方案 把分片写入循环原样抽成私有方法: ```go func (r *RunsRepo) stageWorkspaceCheckpointChunks(runID, token, archiveID string, source io.Reader) (size int64, count int, sum string, err error) ``` - 循环体逐行不变:按 `workspaceCheckpointChunkBytes` 读块、超过 `workspaceCheckpointArchiveBytes` 报同样的错、每块前校验租约(失效返回 `ErrWorkspaceInUse`)、写入分片行并累计 SHA-256。 - `SaveWorkspaceCheckpointStream` 只保留内联判断、生成 archive id 与失败清理、过期分片清理、空归档判断和事务发布;发布时直接使用返回的 `size`/`count`/`sum`。 - 报错文案、SQL 条件、写入顺序全部不变。 ## 影响范围 仅 `internal/repo/workspace_checkpoint_chunks.go` 一个文件内的私有拆分,导出方法签名与行为不变,调用方(`internal/engine/workspace_checkpoint_stream.go`)无需改动。 ## 验证方式 - 新增单测直接覆盖 `stageWorkspaceCheckpointChunks`:多块写入返回的字节数/块数/摘要正确且每行不超过分块上限;租约失效时返回 `ErrWorkspaceInUse`。 - 原有 `TestWorkspaceCheckpointChunksAtomicRoundTrip` 等用例保持通过。 - `go vet ./internal/repo/...`、`go test ./internal/repo/...`。
Activity
【架构优化】从 SaveWorkspaceCheckpointStream 中拆出分片暂存写入 stageWorkspaceCheckpo…