环境
- 组件:cosh-ng
- 版本:0.11.0
- 测试环境:Linux x86_64 (Alinux 4)
复现步骤
- 准备一个空 workspace(无文件变更)
- 执行
cosh-cli checkpoint init --workspace <空 ws>
- 执行
cosh-cli checkpoint create --workspace <空 ws> --id <id> -m "msg"
- 观察 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
环境
复现步骤
cosh-cli checkpoint init --workspace <空 ws>cosh-cli checkpoint create --workspace <空 ws> --id <id> -m "msg"预期
ok=true,data标识skipped=true并附reason(无需 snapshot 是非错误情形)实际
ok=falseerror.code=CheckpointCreateFailederror.message="Checkpoint skipped: Empty workspace, no snapshot created."根因(源码定位)
crates/cosh-platform/src/checkpoint.rsCkptClient::create()把 ws-ckpt daemon 返回的CheckpointSkipped(协议层非错误情形)映射为Err:影响
checkpoint create拿到ok=false会误判创建失败,可能重试或中止工作流,而实际只是"无需 snapshot"CheckpointCreateFailed这个 ErrorCode 语义不准 — 并没有"创建失败",只是"无需创建"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