首次接入与失败诊断

August 31, 2026 · View on GitHub

projectRoot 到底是什么

Agent 工具始终以调用它的 DSH Session 工作目录作为 projectRoot。Web 工作台使用 Plugin 配置的根目录;在「设置 → Harbor 自进化」可以看到当前绝对路径,并即时切换、重载,无需重启 DSH。

越界错误会同时返回当前 projectRoot、传入路径和修复建议。不要通过 .. 引用根目录外的 Dataset、Candidate、Stack 或 Job。

多个 Harbor project

初始化不会覆盖已有文件。如果根目录已有另一套 .harbor/evaluation-stack.yml,会返回 STACK_ALREADY_EXISTS_DIFFERENT_ID,而不是静默保留旧 Stack 并报告成功。为新的业务使用 workspaceSubdir,例如:

harbor-projects/
├── search/.harbor/evaluation-stack.yml
└── research/.harbor/evaluation-stack.yml

Dataset 为何 manifest 通过但 Harbor 不运行

harbor_dataset_validate 同时检查 manifest 和 Harbor 实际的本地 Dataset 解析规则。Dataset 必须包含一级 Task 子目录:

dataset/
└── task-a/
    ├── task.toml
    ├── instruction.md
    ├── environment/Dockerfile
    └── tests/test.sh

task.toml 至少声明 schema_version = "1.4",且 [task].name 使用 org/name。Task 直接放在 Dataset 根目录或嵌套多层都会得到 HARBOR_RUNTIME_NO_TASKS / HARBOR_RUNTIME_TASK_UNRESOLVED

常见失败与下一步

harbor_eval_run 返回脱敏后的 stderr / job.log 尾部,并附稳定原因码:

  • AGENT_SETUP_TIMEOUT:优先使用已包含 Python、curl、Node.js、npm、stdbuf、ACP/DSH 依赖的镜像。
  • EVALUATOR_RESULT_MISSING:Verifier 除 reward.json 外,还必须写 /logs/verifier/evaluation-result.json
  • DATASET_NOT_RESOLVED:修复上述 Harbor 1.4 Task 结构并重新生成 Dataset Manifest。
  • DOCKER_CREDENTIAL_HELPER:修复 Docker 配置引用的 helper,或使用已经验证存在于本机的镜像。
  • HISTORICAL_DOCKER_PREFLIGHT_FAILED:Historical Job 尚未创建;先按返回的 DOCKER_* 根因修复 CLI、daemon 或 credential helper,再重新确认运行。

Doctor 的 runtime preflight 会检查 Docker daemon、credential helper、base image 本地可用性和 ACP 依赖可证明性。无法从 Dockerfile 证明的预装依赖只给 warning;Historical Session 路径还会在创建 Job 前自动运行同一组 CLI、daemon 和 helper 阻塞检查。macOS GUI 进程会在子进程 PATH 中补入 Docker Desktop 的 Resources/bin,不会修改全局环境。

Historical Session 失败

原因码含义下一步
NO_ELIGIBLE_SESSIONS当前 exact-cwd 没有已完成、顶层、含直接用户输入与 Agent 输出的业务会话先完成真实业务任务,确认 Session cwd,或改用显式 Query/Dataset
SESSION_SELECTION_TOO_EXPENSIVE候选超过 sessionMaxReads,当前没有 cursor用更窄的 ISO-8601 createdAfter 重新 Preview,或改用显式 Dataset
SESSION_SAMPLE_CHANGEDPreview 后会话事件、seq 或 digest 变化重新 Preview;不要复用旧 token
SESSION_FEEDBACK_CHANGEDFeedback 可用性、读取状态或内容发生变化重新 Preview 并重新确认
HISTORICAL_PREVIEW_INVALIDWeb 预览已过期、被消费或 Host 进程重启点击“重新预览”;浏览器不会持久化或接收 selection token
HISTORICAL_PREVIEW_WORKSPACE_MISMATCHPreview 后切换了 Harbor 工作空间回到目标工作空间并重新 Preview
HISTORICAL_JOB_ALREADY_RUNNING当前工作空间已有 Web Historical Job 在后台运行点击“查看运行状态”;不要重复启动
SESSION_OBSERVATION_TOO_LARGE单条脱敏 Observation 超过安全上限缩小任务证据,或把确认后的材料整理成显式 Dataset
HISTORICAL_JUDGE_NOT_CONFIRMEDRun 尝试覆盖 Preview 已冻结的 Judge在 Preview 选择 Judge,Run 只传 selectionToken 和可选 jobName
HISTORICAL_JOB_INCOMPLETEHarbor 退出但没有生成有效 Summary/completion sentinel检查 Harbor plugin 安装、Job log 和 dsh-historical-evaluation 生命周期
HISTORICAL_JOB_ARTIFACT_VALIDATION_FAILEDSummary、completion、Batch identity、coverage 或 Trial 数不一致不使用该结果;保留 Job 证据并修复缺失/陈旧产物后重跑

completed-unscored 不是失败码。它表示 Trial 已完成,但至少一个 required Criterion 因证据不足而弃权;Workbench 应展示缺失 Criterion、原因和 Trial/Criterion coverage,不应显示质量 0 分。

Apple Silicon 误选 x86_64 Python

若 setup 在 Apple Silicon 上选择了 x86_64 Miniconda Python,随后 cryptographycan't find crate for core/std 或缺少 x86_64-apple-darwin Rust target,这是本机混合架构,不是 Harbor 插件缺包。优先让 uv 使用匹配机器架构的 managed Python:

UV_PYTHON_PREFERENCE=only-managed \
UV_PYTHON_DOWNLOADS=automatic \
npx --yes dsh-harbor-evolution@latest setup --project-root "$PWD"

setup 后用 Python 的 platform.machine()harbor --versionharbor plugins list 复核解释器架构与两个插件入口。

评测器产物口径

声明 harbor-dsh-evaluator/v1 后,每个 Trial 都必须产出 evaluation-result/v1,且每个 Criterion 都包含 score、reason 和 recommendation。Summary 直接复用 Trial Assessment 的有效性判断,因此不会再出现详情无效但总体仍计入分数的情况。

Secret 分级边界

Harbor 的 Candidate、Dataset、Stack、Context、Job Summary 与错误诊断都不得保存 Authorization、Cookie、API key 或 OAuth token。当前稳定支持的是运行时环境变量/临时 capability;Web 工作台不会把明文 secret 写入项目。DSH 凭据库模式需要 Host 暴露正式 credential service 后再接入,不能用普通 settings.yaml 冒充凭据库。