agent-hitch 0.2.10 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,19 +31,19 @@ compare models, or fix the model to compare harnesses.
31
31
  - [x] **Run and recover.** Share resource budgets, run trials in parallel, and preserve completed work through supported recovery paths.
32
32
  - [x] **Collect the evidence.** Keep scores, trajectories, verifier evidence, and provenance in one result bundle.
33
33
 
34
- > **Status:** pre-alpha. Capabilities below describe current `dev`; setup and
35
- > support limits are covered in the [User Guide](https://rsigear.xyz/docs/hitch/).
34
+ > **Status:** pre-alpha. Setup and support limits are covered in the
35
+ > [User Guide](https://rsigear.xyz/docs/hitch/).
36
36
 
37
37
  ## Quick Start
38
38
 
39
39
  You need **Node.js 22+**, Git, and model access. Local runs do not require Docker.
40
40
 
41
- **1. Install Hitch and authenticate the harness.** This example pins Codex to
42
- an explicit version; complete its login flow before continuing.
41
+ **1. Install Hitch and Codex, then authenticate.** Complete the Codex login
42
+ flow before continuing; Hitch will use this installed executable.
43
43
 
44
44
  ```bash
45
- npm install --global agent-hitch@0.2.10
46
- npx --yes @openai/codex@0.92.0 login
45
+ npm install --global agent-hitch @openai/codex
46
+ codex login
47
47
  ```
48
48
 
49
49
  **2. Run from a clean Git repository.** `git status --short` must show no changes
@@ -53,7 +53,7 @@ for worktree mode. To include uncommitted files, choose
53
53
  ```bash
54
54
  git status --short
55
55
  hitch run \
56
- --harness codex@version:0.92.0 \
56
+ --harness codex@installed \
57
57
  --workspace-mode worktree \
58
58
  --prompt "Summarize this repository and its test commands. Do not modify files." \
59
59
  --timeout 5m \
@@ -136,7 +136,7 @@ and resource admission; it is not a speed or cost comparison against native Harb
136
136
 
137
137
  ## Local and remote model inference
138
138
 
139
- Managed inference is included in current `dev`. Import a complete Hugging Face safetensors checkpoint once, then use the same
139
+ Import a complete Hugging Face safetensors checkpoint once, then use the same
140
140
  run and eval commands with a `local/<name>` model. Hitch chooses a pinned
141
141
  CPU or CUDA preview runtime, starts the daemon and SGLang service when needed, and
142
142
  records the immutable model/runtime/inference identities automatically.
@@ -211,9 +211,10 @@ for benchmark, resource, and portability contracts.
211
211
  | OpenCode | ✓ | ✓ | — |
212
212
  | DeepSeek Harness | ✓ | ✓ | ✓ |
213
213
 
214
- Use `codex@installed` for a local executable, `codex@version:0.92.0` for an exact
215
- package, or `codex@commit:COMMIT` with a real upstream commit. Evaluations require
216
- a portable version or commit reference. See
214
+ Use `codex@installed` for a local executable, `codex@version:VERSION` for an exact
215
+ package, or `codex@commit:COMMIT` with a real upstream commit. Replace `VERSION`
216
+ with the exact published version you want to run. Evaluations require a portable
217
+ version or commit reference. See
217
218
  [versions and workspaces](docs/guide/en/versions-and-workspaces.md) for reference
218
219
  selection, artifact preparation, and workspace modes.
219
220
 
package/README.zh-CN.md CHANGED
@@ -29,19 +29,19 @@
29
29
  - [x] **并行与恢复。** 共享资源预算、并行执行 Trial,在支持的恢复路径中保留已完成工作。
30
30
  - [x] **收齐结果证据。** 分数、轨迹、Verifier 证据与来源信息归入同一份结果包。
31
31
 
32
- > **状态:** pre-alpha。以下能力对应当前 `dev`;配置与支持范围见
32
+ > **状态:** pre-alpha。配置与支持范围见
33
33
  > [User Guide](https://rsigear.xyz/docs/hitch/zh/)。
34
34
 
35
35
  ## Quick Start:快速开始
36
36
 
37
37
  需要 **Node.js 22+**、Git 和模型访问权限。本地运行不需要 Docker。
38
38
 
39
- **1. 安装 Hitch,并完成 Harness 认证。** 示例固定了一个 Codex 版本,
40
- 继续前先完成登录流程。
39
+ **1. 安装 Hitch Codex,并完成认证。** 继续前先完成 Codex 登录流程;
40
+ Hitch 会使用这个已安装的程序。
41
41
 
42
42
  ```bash
43
- npm install --global agent-hitch@0.2.10
44
- npx --yes @openai/codex@0.92.0 login
43
+ npm install --global agent-hitch @openai/codex
44
+ codex login
45
45
  ```
46
46
 
47
47
  **2. 从干净的 Git 仓库运行。** Worktree 模式要求 `git status --short` 没有
@@ -51,7 +51,7 @@ npx --yes @openai/codex@0.92.0 login
51
51
  ```bash
52
52
  git status --short
53
53
  hitch run \
54
- --harness codex@version:0.92.0 \
54
+ --harness codex@installed \
55
55
  --workspace-mode worktree \
56
56
  --prompt "总结这个仓库及其测试命令,不修改文件。" \
57
57
  --timeout 5m \
@@ -131,7 +131,7 @@ Hitch 采用 **Harbor 的任务定义格式**,接入已有 Benchmark 和自定
131
131
 
132
132
  ## 本地与远程模型推理
133
133
 
134
- 当前 `dev` 已包含托管推理。完整的 Hugging Face safetensors checkpoint 只需导入一次,此后继续使用原有
134
+ 完整的 Hugging Face safetensors checkpoint 只需导入一次,此后继续使用原有
135
135
  run/eval 命令,并把模型写成 `local/<name>`。Hitch 会自动选择固定摘要的 CPU 或
136
136
  CUDA preview runtime、按需启动 daemon 和 SGLang 服务,并记录不可变的模型、runtime
137
137
  和 inference 身份。
@@ -202,8 +202,9 @@ hitch eval doctor
202
202
  | OpenCode | ✓ | ✓ | — |
203
203
  | DeepSeek Harness | ✓ | ✓ | ✓ |
204
204
 
205
- 使用 `codex@installed` 运行本机程序,使用 `codex@version:0.92.0` 选择确定的
206
- 软件包版本,或把真实上游提交填入 `codex@commit:COMMIT`。评测要求可移植的
205
+ 使用 `codex@installed` 运行本机程序,使用 `codex@version:VERSION` 选择确定的
206
+ 软件包版本,或把真实上游提交填入 `codex@commit:COMMIT`。将 `VERSION` 替换为
207
+ 要运行的精确已发布版本。评测要求可移植的
207
208
  版本或提交引用。引用选择、制品准备和工作区模式见
208
209
  [固定版本与隔离工作区](docs/guide/zh-CN/versions-and-workspaces.md)。
209
210
 
@@ -8,6 +8,7 @@ export function capabilitiesCommand(args) {
8
8
  trajectory_analysis: "1",
9
9
  trajectory_events_page: "1",
10
10
  verifier_evidence: "1",
11
+ verifier_diagnostic_pages: "1",
11
12
  training_external_binding: "1",
12
13
  exact_policy_tokens: "1",
13
14
  training_policy_fencing: "1",
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../../src/cli/commands/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,YAAY,GAAG;QACnB,cAAc,EAAE,cAAc;QAC9B,mBAAmB,EAAE,GAAG;QACxB,sBAAsB,EAAE,GAAG;QAC3B,iBAAiB,EAAE,GAAG;QACtB,yBAAyB,EAAE,GAAG;QAC9B,mBAAmB,EAAE,GAAG;QACxB,uBAAuB,EAAE,GAAG;QAC5B,kBAAkB,EAAE,CAAC,eAAe,CAAC;QACrC,uBAAuB,EAAE,SAAS;QAClC,kBAAkB,EAAE,GAAG;QACvB,gBAAgB,EAAE,GAAG;QACrB,kBAAkB,EAAE,GAAG;QACvB,oBAAoB,EAAE,GAAG;QACzB,8BAA8B,EAAE,GAAG;QACnC,2BAA2B,EAAE,GAAG;QAChC,4BAA4B,EAAE,GAAG;KACzB,CAAC;IACX,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC9I,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../../src/cli/commands/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,YAAY,GAAG;QACnB,cAAc,EAAE,cAAc;QAC9B,mBAAmB,EAAE,GAAG;QACxB,sBAAsB,EAAE,GAAG;QAC3B,iBAAiB,EAAE,GAAG;QACtB,yBAAyB,EAAE,GAAG;QAC9B,yBAAyB,EAAE,GAAG;QAC9B,mBAAmB,EAAE,GAAG;QACxB,uBAAuB,EAAE,GAAG;QAC5B,kBAAkB,EAAE,CAAC,eAAe,CAAC;QACrC,uBAAuB,EAAE,SAAS;QAClC,kBAAkB,EAAE,GAAG;QACvB,gBAAgB,EAAE,GAAG;QACrB,kBAAkB,EAAE,GAAG;QACvB,oBAAoB,EAAE,GAAG;QACzB,8BAA8B,EAAE,GAAG;QACnC,2BAA2B,EAAE,GAAG;QAChC,4BAA4B,EAAE,GAAG;KACzB,CAAC;IACX,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC9I,CAAC"}
@@ -1,10 +1,16 @@
1
1
  import { invalidInput } from "../../foundation/index.js";
2
- import { loadVerifierEvidence } from "../../runs/index.js";
3
- import { assertNoArgs, takeFlag } from "../arguments.js";
2
+ import { repairVerifierDiagnostics } from "../../evals/index.js";
3
+ import { loadVerifierDiagnosticPage, loadVerifierEvidence, MAX_VERIFIER_DIAGNOSTIC_PAGE_BYTES } from "../../runs/index.js";
4
+ import { assertNoArgs, takeFlag, takeOption } from "../arguments.js";
5
+ const ARTIFACT_NAMES = new Set(["ctrf.json", "test-stdout.txt", "test-stderr.txt", "stdout.txt", "stderr.txt"]);
4
6
  export async function verifierCommand(args, root) {
5
7
  const action = args.shift();
8
+ if (action === "artifact")
9
+ return verifierArtifactCommand(args, root);
10
+ if (action === "repair")
11
+ return verifierRepairCommand(args, root);
6
12
  if (action !== "inspect")
7
- throw invalidInput("verifier requires inspect");
13
+ throw invalidInput("verifier requires inspect, artifact, or repair");
8
14
  const json = takeFlag(args, "--json");
9
15
  const runId = args.shift();
10
16
  if (!runId || !/^run_[a-f0-9]{32}$/.test(runId)) {
@@ -33,4 +39,49 @@ export async function verifierCommand(args, root) {
33
39
  for (const issue of evidence.verifier.issues ?? [])
34
40
  process.stdout.write(` issue: ${issue}\n`);
35
41
  }
42
+ async function verifierRepairCommand(args, root) {
43
+ const json = takeFlag(args, "--json");
44
+ const source = takeOption(args, "--source");
45
+ const runId = args.shift();
46
+ if (!runId || !/^run_[a-f0-9]{32}$/.test(runId)) {
47
+ throw invalidInput("verifier repair requires a valid run ID");
48
+ }
49
+ assertNoArgs(args);
50
+ const result = await repairVerifierDiagnostics({ root, runId, ...(source === undefined ? {} : { source }) });
51
+ if (json)
52
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
53
+ else
54
+ process.stdout.write(`${runId}: verifier diagnostics ${result.status.replace("_", " ")}\n`);
55
+ }
56
+ async function verifierArtifactCommand(args, root) {
57
+ const json = takeFlag(args, "--json");
58
+ const offsetValue = takeOption(args, "--offset");
59
+ const limitValue = takeOption(args, "--limit");
60
+ const expectedSha256 = takeOption(args, "--sha256");
61
+ const runId = args.shift();
62
+ const name = args.shift();
63
+ if (!runId || !/^run_[a-f0-9]{32}$/.test(runId) || !name || !ARTIFACT_NAMES.has(name)) {
64
+ throw invalidInput("verifier artifact requires a valid run ID and artifact name");
65
+ }
66
+ const offset = offsetValue === undefined ? 0 : Number(offsetValue);
67
+ const maxBytes = limitValue === undefined ? MAX_VERIFIER_DIAGNOSTIC_PAGE_BYTES : Number(limitValue);
68
+ if (!Number.isSafeInteger(offset) || offset < 0)
69
+ throw invalidInput("--offset must be a non-negative integer");
70
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 4 || maxBytes > MAX_VERIFIER_DIAGNOSTIC_PAGE_BYTES) {
71
+ throw invalidInput(`--limit must be an integer from 4 to ${MAX_VERIFIER_DIAGNOSTIC_PAGE_BYTES}`);
72
+ }
73
+ if (expectedSha256 !== undefined && !/^sha256:[0-9a-f]{64}$/.test(expectedSha256)) {
74
+ throw invalidInput("--sha256 must be a SHA-256 digest");
75
+ }
76
+ assertNoArgs(args);
77
+ const page = await loadVerifierDiagnosticPage(root, runId, name, {
78
+ offset,
79
+ maxBytes,
80
+ ...(expectedSha256 ? { expectedSha256: expectedSha256 } : {}),
81
+ });
82
+ if (json)
83
+ process.stdout.write(`${JSON.stringify(page, null, 2)}\n`);
84
+ else
85
+ process.stdout.write(page.page.text);
86
+ }
36
87
  //# sourceMappingURL=verifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../../src/cli/commands/verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc,EAAE,IAAY;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,YAAY,CAAC,2BAA2B,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,IAAI,CAAC,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,YAAY,CAAC,0CAA0C,CAAC,CAAC;IACjE,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACzE,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC1G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;IAClD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG;YAChB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;YAC7B,GAAG,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,CAAC;IACzH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC;AAClG,CAAC"}
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../../src/cli/commands/verifier.ts"],"names":[],"mappings":"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"}
@@ -130,6 +130,8 @@ Usage:
130
130
  hitch images unpin <sha256:image-id>
131
131
  hitch trajectory inspect <run-id> [--json]
132
132
  hitch verifier inspect <run-id> [--json]
133
+ hitch verifier artifact <run-id> <name> [--offset <bytes>] [--limit <bytes>] [--sha256 <digest>] [--json]
134
+ hitch verifier repair <run-id> [--source <eval-relative-trial-dir>] [--json]
133
135
  hitch trajectory project <run-id> [--profile analysis] [--max-bytes <bytes>] [--json]
134
136
  hitch trajectory events <run-id> [--types <a,b>] [--seq-start <n>] [--seq-end <n>] [--field <path>] [--canonical-sha256 <digest>] [--limit <n>] [--cursor <opaque>] [--max-bytes <bytes>] [--json]
135
137
  hitch training register --file <PATH|->
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/output.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export { recoverLocalDockerEvalLeases } from "./recovery.js";
22
22
  export { inspectEval, isControlPlaneEval, listEvals } from "./records.js";
23
23
  export { importEvalTrialRun, importEvalTrialRuns, validateEvalTrialReferences } from "./trial-import.js";
24
24
  export { captureVerifierDiagnostics, DEFAULT_VERIFIER_DIAGNOSTIC_MAX_BYTES, MAX_VERIFIER_DIAGNOSTIC_MAX_BYTES, persistTrialVerifierDiagnostics, VERIFIER_ARTIFACT_NAMES, VERIFIER_DIAGNOSTICS_INDEX_REF } from "./verifier-artifacts.js";
25
+ export { repairVerifierDiagnostics } from "./verifier-diagnostic-repair.js";
25
26
  export { captureVerifierScoreEvidence } from "./verifier-score-artifacts.js";
26
27
  export { MAX_VERIFIER_FEEDBACK_BYTES, MAX_VERIFIER_PROCESS_BYTES } from "../domain/index.js";
27
28
  export { createEvalProgress, evalTrialKey, mergeEvalProgressTrial, parseEvalTrialRef, readEvalProgress, replaceInvalidEvalProgressTrial, writeEvalProgress } from "./progress.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/evals/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/evals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,uCAAuC,EAAE,SAAS,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtQ,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAIhI,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/G,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEjH,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhL,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,8BAA8B,EAAE,oCAAoC,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAE3K,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACpG,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAI3G,OAAO,EAAE,oCAAoC,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAErV,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAClH,OAAO,EAAE,0CAA0C,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEjH,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEzG,OAAO,EAAE,0BAA0B,EAAE,qCAAqC,EAAE,iCAAiC,EAAE,+BAA+B,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAEzO,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClL,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE1H,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,iCAAiC,EAAE,4BAA4B,EAAE,mCAAmC,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,+BAA+B,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAGxY,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE/I,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AAEvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACnJ,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACrI,OAAO,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,iCAAiC,EAAE,kCAAkC,EAAE,MAAM,sBAAsB,CAAC;AAC1I,OAAO,EAAE,8BAA8B,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AAEjH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAChI,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,gCAAgC,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAEjH,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AACxG,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,mCAAmC,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAC;AAEhI,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC5K,OAAO,EAAE,iCAAiC,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC"}
@@ -1,17 +1,15 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { realpath } from "node:fs/promises";
3
- import { StringDecoder } from "node:string_decoder";
4
3
  import path from "node:path";
5
4
  import { PROVIDER_ENVIRONMENT_NAMES, atomicWriteJSON, credentialValuesFromEnv, openContainedRegularFile, redactCredentialText, writePrivateFile } from "../foundation/index.js";
5
+ import { sanitizeVerifierJson, sanitizeVerifierText } from "../runs/index.js";
6
6
  import { captureVerifierScoreEvidence } from "./verifier-score-artifacts.js";
7
- export const DEFAULT_VERIFIER_DIAGNOSTIC_MAX_BYTES = 64 * 1024;
8
7
  export const MAX_VERIFIER_DIAGNOSTIC_MAX_BYTES = 16 * 1024 * 1024;
8
+ export const DEFAULT_VERIFIER_DIAGNOSTIC_MAX_BYTES = MAX_VERIFIER_DIAGNOSTIC_MAX_BYTES;
9
9
  export const VERIFIER_DIAGNOSTICS_INDEX_REF = "verifier/diagnostics.json";
10
10
  export const VERIFIER_ARTIFACT_NAMES = [
11
11
  "ctrf.json", "test-stdout.txt", "test-stderr.txt", "stdout.txt", "stderr.txt",
12
12
  ];
13
- const TRUNCATION_MARKER = Buffer.from("\n[... verifier artifact truncated ...]\n", "utf8");
14
- const MAX_LOG_LINE_BYTES = 1024 * 1024;
15
13
  export async function persistTrialVerifierDiagnostics(input) {
16
14
  const env = input.env ?? process.env;
17
15
  const credentialValues = credentialValuesFromEnv([...PROVIDER_ENVIRONMENT_NAMES, ...(input.passEnv ?? [])], env);
@@ -53,25 +51,43 @@ async function copyCandidateIneligibleDiagnostic(trialDirectory, runDirectory, s
53
51
  return;
54
52
  await atomicWriteJSON(path.join(runDirectory, "verifier", "candidate-ineligible.json"), value);
55
53
  }
56
- /** Persist bounded, redacted verifier artifacts in the immutable run bundle. */
54
+ /** Persist complete redacted verifier artifacts up to an explicit hard cap. */
57
55
  export async function captureVerifierDiagnostics(trialDirectory, runDirectory, options = {}) {
58
56
  const maxArtifactBytes = options.maxArtifactBytes ?? DEFAULT_VERIFIER_DIAGNOSTIC_MAX_BYTES;
59
- if (!Number.isSafeInteger(maxArtifactBytes) || maxArtifactBytes <= TRUNCATION_MARKER.length + 2
57
+ if (!Number.isSafeInteger(maxArtifactBytes) || maxArtifactBytes <= 0
60
58
  || maxArtifactBytes > MAX_VERIFIER_DIAGNOSTIC_MAX_BYTES) {
61
59
  throw new TypeError("verifier diagnostic artifact limit is invalid");
62
60
  }
63
61
  throwIfAborted(options.signal);
64
62
  const root = await realpath(trialDirectory);
65
63
  const artifacts = [];
64
+ const losses = [];
66
65
  const redactions = new Map();
67
66
  for (const name of VERIFIER_ARTIFACT_NAMES) {
68
67
  throwIfAborted(options.signal);
69
68
  const safe = await safeArtifact(root, name);
70
69
  if (!safe)
71
70
  continue;
71
+ const mediaType = name === "ctrf.json" ? "application/json" : "text/plain";
72
+ if (safe.size > maxArtifactBytes) {
73
+ try {
74
+ await safe.assertUnchanged();
75
+ }
76
+ finally {
77
+ await safe.handle.close();
78
+ }
79
+ losses.push({
80
+ name,
81
+ media_type: mediaType,
82
+ source_bytes: safe.size,
83
+ loss_reason: "persistence_limit_exceeded",
84
+ persistence_limit_bytes: maxArtifactBytes,
85
+ });
86
+ continue;
87
+ }
72
88
  let captured;
73
89
  try {
74
- captured = await captureText(safe.handle, maxArtifactBytes, options.credentialValues ?? [], options.signal);
90
+ captured = await captureArtifact(safe.handle, safe.size, mediaType, options.credentialValues ?? [], options.signal);
75
91
  await safe.assertUnchanged();
76
92
  if (captured.sourceBytes !== safe.size)
77
93
  throw new TypeError(`verifier artifact changed while being captured: ${name}`);
@@ -79,6 +95,17 @@ export async function captureVerifierDiagnostics(trialDirectory, runDirectory, o
79
95
  finally {
80
96
  await safe.handle.close();
81
97
  }
98
+ if (captured.lossReason || !captured.stored || captured.stored.length > maxArtifactBytes) {
99
+ losses.push({
100
+ name,
101
+ media_type: mediaType,
102
+ source_bytes: captured.sourceBytes,
103
+ source_sha256: captured.sourceSha256,
104
+ loss_reason: captured.lossReason ?? "persistence_limit_exceeded",
105
+ persistence_limit_bytes: maxArtifactBytes,
106
+ });
107
+ continue;
108
+ }
82
109
  mergeCounts(redactions, captured.redactions);
83
110
  const ref = `verifier/${name}`;
84
111
  const destination = path.join(runDirectory, ...ref.split("/"));
@@ -87,22 +114,24 @@ export async function captureVerifierDiagnostics(trialDirectory, runDirectory, o
87
114
  artifacts.push({
88
115
  name,
89
116
  ref,
90
- media_type: name === "ctrf.json" ? "application/json" : "text/plain",
117
+ media_type: mediaType,
91
118
  source_bytes: captured.sourceBytes,
92
119
  source_sha256: captured.sourceSha256,
93
120
  bytes: captured.contentBytes,
94
121
  sha256: captured.contentSha256,
95
122
  stored_bytes: stored.length,
96
123
  stored_sha256: sha256(stored),
97
- truncated: captured.truncated,
124
+ truncated: false,
98
125
  });
99
126
  }
100
- if (artifacts.length === 0)
127
+ if (artifacts.length === 0 && losses.length === 0)
101
128
  return null;
102
129
  const index = {
103
- schema_version: "1",
130
+ schema_version: "2",
104
131
  kind: "verifier-diagnostics",
132
+ hard_cap_bytes: maxArtifactBytes,
105
133
  artifacts,
134
+ losses,
106
135
  redactions: canonicalCounts(redactions),
107
136
  };
108
137
  await atomicWriteJSON(path.join(runDirectory, ...VERIFIER_DIAGNOSTICS_INDEX_REF.split("/")), index);
@@ -118,157 +147,73 @@ async function safeArtifact(root, name, maximumBytes) {
118
147
  throw new TypeError(`unsafe verifier artifact: ${name}`, { cause: error });
119
148
  }
120
149
  }
121
- async function captureText(handle, maxBytes, credentialValues, signal) {
122
- const sourceHash = createHash("sha256");
123
- const contentHash = createHash("sha256");
124
- const decoder = new StringDecoder("utf8");
125
- const bounded = new BoundedBuffer(maxBytes);
126
- const redactions = new Map();
127
- let sourceBytes = 0;
128
- let pending = "";
129
- let discarding = false;
130
- const emit = (value) => {
131
- const redacted = redactCredentialText(value, credentialValues);
132
- mergeCounts(redactions, redacted.redactions);
133
- const bytes = Buffer.from(redacted.text, "utf8");
134
- contentHash.update(bytes);
135
- bounded.append(bytes);
136
- };
137
- const drain = () => {
138
- for (;;) {
139
- const newline = pending.indexOf("\n");
140
- if (discarding) {
141
- if (newline < 0) {
142
- pending = "";
143
- return;
144
- }
145
- pending = pending.slice(newline + 1);
146
- discarding = false;
147
- continue;
148
- }
149
- if (newline >= 0) {
150
- emit(pending.slice(0, newline + 1));
151
- pending = pending.slice(newline + 1);
152
- continue;
153
- }
154
- if (Buffer.byteLength(pending, "utf8") > MAX_LOG_LINE_BYTES) {
155
- emit("[REDACTED OVERSIZED VERIFIER LOG LINE]\n");
156
- increment(redactions, "oversized-verifier-log-line-v1");
157
- bounded.markOmitted();
158
- pending = "";
159
- discarding = true;
160
- }
161
- return;
150
+ async function captureArtifact(handle, expectedBytes, mediaType, credentialValues, signal) {
151
+ throwIfAborted(signal);
152
+ const source = await readExactFile(handle, expectedBytes, signal);
153
+ throwIfAborted(signal);
154
+ let stored;
155
+ let redactions;
156
+ if (mediaType === "application/json") {
157
+ let parsed;
158
+ try {
159
+ parsed = JSON.parse(source.toString("utf8"));
162
160
  }
163
- };
164
- const buffer = Buffer.allocUnsafe(64 * 1024);
165
- let position = 0;
166
- for (;;) {
167
- throwIfAborted(signal);
168
- const { bytesRead } = await handle.read(buffer, 0, buffer.length, position);
169
- if (bytesRead === 0)
170
- break;
171
- position += bytesRead;
172
- const bytes = buffer.subarray(0, bytesRead);
173
- sourceHash.update(bytes);
174
- sourceBytes += bytes.length;
175
- pending += decoder.write(bytes);
176
- drain();
161
+ catch {
162
+ return {
163
+ sourceSha256: sha256(source), sourceBytes: source.length,
164
+ contentSha256: sha256(Buffer.alloc(0)), contentBytes: 0,
165
+ lossReason: "invalid_json", redactions: new Map(),
166
+ };
167
+ }
168
+ if (!isJsonValue(parsed)) {
169
+ return {
170
+ sourceSha256: sha256(source), sourceBytes: source.length,
171
+ contentSha256: sha256(Buffer.alloc(0)), contentBytes: 0,
172
+ lossReason: "invalid_json", redactions: new Map(),
173
+ };
174
+ }
175
+ const sanitized = sanitizeVerifierJson(parsed, credentialValues);
176
+ stored = Buffer.from(JSON.stringify(sanitized.value), "utf8");
177
+ redactions = sanitized.redactions;
178
+ }
179
+ else {
180
+ const sanitized = sanitizeVerifierText(source.toString("utf8"), credentialValues);
181
+ stored = Buffer.from(sanitized.text, "utf8");
182
+ redactions = sanitized.redactions;
177
183
  }
178
- pending += decoder.end();
179
- drain();
180
- if (!discarding && pending)
181
- emit(pending);
182
- throwIfAborted(signal);
183
184
  return {
184
- sourceSha256: `sha256:${sourceHash.digest("hex")}`,
185
- sourceBytes,
186
- contentSha256: `sha256:${contentHash.digest("hex")}`,
187
- contentBytes: bounded.totalBytes,
188
- stored: bounded.value(),
189
- truncated: bounded.truncated,
185
+ sourceSha256: sha256(source),
186
+ sourceBytes: source.length,
187
+ contentSha256: sha256(stored),
188
+ contentBytes: stored.length,
189
+ stored,
190
190
  redactions,
191
191
  };
192
192
  }
193
- class BoundedBuffer {
194
- limit;
195
- payloadLimit;
196
- headLimit;
197
- tailLimit;
198
- totalBytes = 0;
199
- clipped = false;
200
- omitted = false;
201
- complete = [];
202
- head = Buffer.alloc(0);
203
- tail = Buffer.alloc(0);
204
- constructor(limit) {
205
- this.limit = limit;
206
- this.payloadLimit = limit - TRUNCATION_MARKER.length;
207
- this.headLimit = Math.floor(this.payloadLimit / 2);
208
- this.tailLimit = this.payloadLimit - this.headLimit;
209
- }
210
- append(value) {
211
- if (value.length === 0)
212
- return;
213
- this.totalBytes += value.length;
214
- if (!this.clipped) {
215
- this.complete.push(value);
216
- const combined = Buffer.concat(this.complete);
217
- if (combined.length <= this.limit)
218
- return;
219
- this.clipped = true;
220
- this.complete = [];
221
- this.head = combined.subarray(0, this.headLimit);
222
- this.tail = combined.subarray(Math.max(0, combined.length - this.tailLimit));
223
- return;
224
- }
225
- this.tail = rollingTail(this.tail, value, this.tailLimit);
226
- }
227
- value() {
228
- return this.clipped
229
- ? Buffer.concat([
230
- validUtf8Prefix(this.head),
231
- TRUNCATION_MARKER,
232
- validUtf8Suffix(this.tail),
233
- ])
234
- : Buffer.concat(this.complete);
235
- }
236
- markOmitted() {
237
- this.omitted = true;
193
+ async function readExactFile(handle, expectedBytes, signal) {
194
+ const result = Buffer.allocUnsafe(expectedBytes);
195
+ let position = 0;
196
+ while (position < expectedBytes) {
197
+ throwIfAborted(signal);
198
+ const read = await handle.read(result, position, expectedBytes - position, position);
199
+ if (read.bytesRead === 0)
200
+ throw new TypeError("verifier artifact changed while being captured");
201
+ position += read.bytesRead;
238
202
  }
239
- get truncated() {
240
- return this.clipped || this.omitted;
203
+ const probe = Buffer.allocUnsafe(1);
204
+ if ((await handle.read(probe, 0, 1, expectedBytes)).bytesRead !== 0) {
205
+ throw new TypeError("verifier artifact changed while being captured");
241
206
  }
207
+ return result;
242
208
  }
243
- function validUtf8Prefix(value) {
244
- let end = value.length;
245
- while (end > 0 && (value[end - 1] & 0xc0) === 0x80)
246
- end -= 1;
247
- const lead = end - 1;
248
- return lead >= 0 && utf8SequenceLength(value[lead]) > value.length - lead ? value.subarray(0, lead) : value;
249
- }
250
- function validUtf8Suffix(value) {
251
- let start = 0;
252
- while (start < value.length && (value[start] & 0xc0) === 0x80)
253
- start += 1;
254
- return value.subarray(start);
255
- }
256
- function utf8SequenceLength(byte) {
257
- if ((byte & 0x80) === 0)
258
- return 1;
259
- if ((byte & 0xe0) === 0xc0)
260
- return 2;
261
- if ((byte & 0xf0) === 0xe0)
262
- return 3;
263
- if ((byte & 0xf8) === 0xf0)
264
- return 4;
265
- return 1;
266
- }
267
- function rollingTail(current, next, limit) {
268
- if (next.length >= limit)
269
- return next.subarray(next.length - limit);
270
- const keep = Math.max(0, limit - next.length);
271
- return Buffer.concat([current.subarray(Math.max(0, current.length - keep)), next]);
209
+ function isJsonValue(value) {
210
+ if (value === null || typeof value === "string" || typeof value === "boolean")
211
+ return true;
212
+ if (typeof value === "number")
213
+ return Number.isFinite(value);
214
+ if (Array.isArray(value))
215
+ return value.every(isJsonValue);
216
+ return Boolean(value) && typeof value === "object" && Object.values(value).every(isJsonValue);
272
217
  }
273
218
  function canonicalCounts(counts) {
274
219
  return [...counts.entries()]