宿主:目录锚不定的拒单不再写诊断

- `ProjectRootUnanchored` 从 `is_reportable()` 拿掉,与 `ProjectRootUnusable` 同类:符号链接 / 权限 / 目录被删都是用户自己就能修的文件系统事实,留痕只会变成噪声
- 它不再被 `direct_turn_rejection` 覆写成 `direct-codex-failure:v2 …` 诊断文案,界面按 `Display` 显示「无法锚定 Direct 调用项目目录:{cause}」,两侧对同一变体的分类不再自相矛盾
- 同步 `only_host_and_environment_rejections_are_reportable` 用例与 `is_reportable` 的文档注释
This commit is contained in:
2026-09-24 16:16:06 +08:00
parent bd78a91e55
commit 5a0f3b8037
@@ -470,8 +470,9 @@ impl DirectTurnError {
/// 命令边界要不要为这条**拒单**补一份运行错误诊断。
///
/// 只有"宿主 / 环境的事实故障、用户自己改不了"才值得进 `.agent/runtime/errors` 与应用日志;
/// 空内容、`clientTurnId` 形状、另一轮在跑、权限策略、目录不是绝对路径都是用户的正常操作结果,
/// 留痕只会变成噪声。判据按变体分,不看文案。
/// 空内容、`clientTurnId` 形状、另一轮在跑、权限策略、目录锚不定 / 不是绝对路径都是用户自己
/// 就能修的操作结果,留痕只会变成噪声;它们仍按 `Display` 给用户一句可读的话。判据按变体分,
/// 不看文案。
///
/// 回合级失败恒为 `false`:它们在上游(`record_direct_codex_failure`)已经写过诊断,边界再写一次
/// 就是同一件事留两份。
@@ -479,11 +480,12 @@ impl DirectTurnError {
match self {
// 连接 / 配置 / 凭据 / 脚手架未就绪与宿主状态取不到:现场只有宿主知道,必须留痕。
Self::EnvironmentNotReady { .. } | Self::HostStateUnavailable { .. } => true,
// 项目目录锚不定是文件系统事实(符号链接 / 权限 / 目录被删),不是用户输入。
Self::ProjectRootUnanchored { .. } => true,
Self::ClientTurnIdMissing
| Self::ClientTurnIdMalformed { .. }
| Self::TurnAlreadyRunning { .. }
// 项目目录锚不定(符号链接 / 权限 / 目录被删)与目录不存在同类:都是用户能自己修好的
// 文件系统事实,诊断文案不该顶替那句"无法锚定 Direct 调用项目目录:{cause}"。
| Self::ProjectRootUnanchored { .. }
| Self::ProjectRootUnusable
| Self::PermissionRejected { .. }
| Self::InputRejected { .. }
@@ -1000,7 +1002,7 @@ mod tests {
detail: "宿主 CLI 回合身份读取中断".into(),
}
.is_reportable());
assert!(DirectTurnError::ProjectRootUnanchored {
assert!(!DirectTurnError::ProjectRootUnanchored {
cause: "拒绝访问".into(),
}
.is_reportable());