Skip to content

[cosh-ng] checkpoint create 把 skipped(无需操作)当失败返回 ok=false #1362

Description

@zhangtaibo

环境

  • 组件:cosh-ng
  • 版本:0.11.0
  • 测试环境:Linux x86_64 (Alinux 4)

复现步骤

  1. 准备一个空 workspace(无文件变更)
  2. 执行 cosh-cli checkpoint init --workspace <空 ws>
  3. 执行 cosh-cli checkpoint create --workspace <空 ws> --id <id> -m "msg"
  4. 观察 JSON 输出

预期

  • ok=true,data 标识 skipped=true 并附 reason(无需 snapshot 是非错误情形)
  • 或语义上返回成功,Agent 据此知道"本次无需创建"而非"创建失败"

实际

  • ok=false
  • error.code=CheckpointCreateFailed
  • error.message="Checkpoint skipped: Empty workspace, no snapshot created."
  • exit code = 1

根因(源码定位)

crates/cosh-platform/src/checkpoint.rs CkptClient::create() 把 ws-ckpt daemon 返回的 CheckpointSkipped(协议层非错误情形)映射为 Err:

match self.send_request(&req)? {
    WsCkptResponse::CheckpointOk { snapshot_id } => Ok(CkptCreated { ... }),
    WsCkptResponse::CheckpointSkipped { reason } => Err(CoshError::new(
        ErrorCode::CheckpointCreateFailed,            // ← 把非错误当失败
        format!("Checkpoint skipped: {}", reason),
        "checkpoint",
    )),
    WsCkptResponse::Error { code, message } => Err(ws_error_to_cosh(code, message)),
    _ => Err(unexpected_response()),
}

影响

  • Agent 调 checkpoint create 拿到 ok=false 会误判创建失败,可能重试或中止工作流,而实际只是"无需 snapshot"
  • CheckpointCreateFailed 这个 ErrorCode 语义不准 — 并没有"创建失败",只是"无需创建"
  • 与 ws-ckpt daemon 协议层的 CheckpointSkipped 语义不对称:协议层视为非错误(有专门 variant),cosh-cli 层却视为错误

复现稳定性

3/3 稳定复现

修复建议

CheckpointSkipped 增加成功响应路径:返回 Ok(CkptCreated { skipped: true, reason, snapshot_id: None, ... }),JSON 输出 ok=true, data.skipped=true, data.reason="..."。或新增 CkptCreateResult 枚举区分 Created/Skipped 两种成功情形。

分类建议

PRODUCT_BUG

Metadata

Metadata

Assignees

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions