@tangle-network/agent-eval 1.0.1 → 1.0.2

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/CHANGELOG.md CHANGED
@@ -4,6 +4,129 @@ All notable changes to `@tangle-network/agent-eval` and its sibling `agent-eval-
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.0.2] — 2026-10-29
8
+
9
+ - Read archived Runtime bytes without changing logical run identity (#1159)
10
+ - fix(adopt-stack): set up pnpm with action-setup v6.1.0 so pnpm 12 callers install (#1158)
11
+ - fix(adopt-stack): plan and deliver on every manual run (#1157)
12
+ - chore(release): 1.0.1
13
+ - Refresh the live benchmark dependency identity after interface updates
14
+ - Preserve exact execution controls in evaluation-backed analysts
15
+ - ci(release): admit the release version before publishing (#1154)
16
+ - fix(adopt-stack): dedupe the lockfile after locking the planned versions (#1153)
17
+ - wip
18
+ - wip
19
+ - wip
20
+ - Lock per importer, keep npm ranges, deliver after 20 h
21
+ - Adopt compatible releases through the lockfile, once a day
22
+ - docs(readme): drop the unmeasured 30-second promise; link the no-change gate example (#1151)
23
+ - fix(adopt-stack): restart an updater-only proposal that no longer merges (#1147)
24
+ - fix(deps): adopt agent-interface 5.10.2 (#1150)
25
+ - fix(deps): adopt agent-interface 5.10.1 for the Zod advisory (#1149)
26
+ - feat(statistics): export meanConfidenceInterval and studentTCritical, a one-sample Student-t interval on the mean
27
+ - factory: Student t mean interval in agent eval
28
+ - feat(analyst): export the behavioral failure-class mapping, its load-time guard and pinBehavioralFailureClass
29
+ - factory: Failure mapping in agent eval
30
+ - fix(adopt-stack): an untracked file the gate wrote does not change the gated tree (#1145)
31
+ - refactor(trace): OTLP ids, encoding and decoding from agent-trace-contract (#1144)
32
+ - feat(redaction): publish shared detectors with safe substring ranges (#1139)
33
+ - chore(release): 1.0.0 (#1142)
34
+ - test(adopt-stack): explain a refusal by any peer whose latest is an excluded major; post-pin cases use a manifest with no 0.x peer
35
+ - test(adopt-stack): the live-registry plans hold across a package's first 1.0 release
36
+ - deps: repin the analyst benchmark's dependency-lock digest
37
+ - deps: lock agent-core 1.0.0, harness-sessions 1.0.1, agent-interface 5.8.1 and agent-trace-contract 2.2.0
38
+ - deps: floor agent-interface at 5.8.1 and agent-trace-contract at 2.2.0
39
+ - deps: agent-core ^1.0.0 and harness-sessions ^1.0.1
40
+ - chore(release): 0.223.0 (#1140)
41
+ - feat(storyboard): one tool classifier, classifyTool, shared by scenes and extractVisual
42
+ - refactor: use statistics mean helpers instead of private copies (#1137)
43
+ - fix(adopt-stack): restart a branch that outlived another's squash merge (#1136)
44
+ - fix(analyst): repin the benchmark dependency lock after the zod range (#1135)
45
+ - chore(release): 0.222.1 (#1134)
46
+ - fix(deps): depend on zod ^4.6.6 so consumers resolve one copy (#1133)
47
+ - chore(test): retire incomplete Runtime adoption snapshot
48
+ - fix(release): build public exports before integration tests
49
+ - chore(release): 0.222.0
50
+ - feat(campaign): share concurrency for measured scenario adapters
51
+ - fix(supervisor-run): staged play-check reward is stages passed, read from the SCORE line only (#1126)
52
+ - refactor(statistics): delete duplicate numeric summary helpers
53
+ - fix(rollout): import survives a damaged deliverables archive; named ids are not keys (#1125)
54
+ - feat(supervisor-run): rollouts importer for Discovery runs, harness sessions and gate receipts (#1124)
55
+ - feat(statistics): extend series summaries with nearest-rank evidence
56
+ - test(rollout): isolate bundle permission probe from runner identity
57
+ - fix(rollout): license class is provenance and an opt-in filter, not a default exclusion (#1121)
58
+ - fix(rollout): allow nonroot images to read the base bundle
59
+ - feat(rollout): license class on rollout lines and whole-row privacy drop in rollout-release (#1119)
60
+ - test(rollout): inherit configured identity for Git fixtures
61
+ - test(rollout): capture empty tool definitions at the ledger boundary
62
+ - feat(rollout): write verified episodes as Harbor tasks
63
+ - feat(rollout): project captured policy steps into Tinker data
64
+ - adopt-stack: delete the adoption branch when its squash merge lands (#1115)
65
+ - chore(deps)!: require Python 3.11 for patched locks and refresh dependencies
66
+ - feat(rollout): read retained Codex sessions through the shared reader
67
+ - chore(release): 0.221.8
68
+ - test(adopt): retain failed browser child outcomes
69
+ - docs: leave changelog preparation to the release workflow
70
+ - chore(release): 0.221.7
71
+ - feat(multishot): conversation legs report the USD they spent
72
+ - chore(release): 0.221.6
73
+ - docs(traces): bound the incomplete usage coverage claim
74
+ - feat: own judge-panel calibration, multishot conversation legs and served-panel identity
75
+ - test(traces): typecheck OTLP usage integration proof
76
+ - fix(traces): retain incomplete OTLP token usage
77
+ - chore(release): 0.221.5
78
+ - ci: retain private adopter failure evidence (#1106)
79
+ - test(process): isolate process-tree fixture environment
80
+ - fix(adopt): invoke each resolved Playwright CLI (#1096)
81
+ - test(systemone): close disposable provider connections
82
+ - chore(release): 0.221.4
83
+ - test(adoption): inherit the maintained integration deadline
84
+ - fix(adoption): scope guard allowance to disposable Git fixtures
85
+ - fix(analyst): carry root-cause target into failure-mode rubric
86
+ - ci: check locally and in publication paths
87
+ - test(adopt): give real-git fixtures their own commit identity (#1101)
88
+ - chore(release): 0.221.3 (#1099)
89
+ - fix(analyst): repin the benchmark implementation digest after #1097 (#1098)
90
+ - fix(trace-analyst): build OTLP stores from bytes, not one joined string
91
+ - fix(adopt): prepare caller-locked Chromium before gates
92
+ - test(adopt): retain admitted identity in real Git fixtures
93
+ - fix(adopt): retain the sparse caller entrypoint
94
+ - fix(adopt): settle pushed proposal reads against remote refs
95
+ - chore(release): 0.221.2
96
+ - Return plain analyst findings from decision replay
97
+ - chore(release): 0.221.1 (#1091)
98
+ - fix(deps): pin zod 4.6.6 (GHSA-mrhx-c7xc-m3w5) (#1088)
99
+ - Give the disposable adoption fixture its own Git author
100
+ - Fix real adoption drift fixture under the declared package manager
101
+ - Capture supporting trace events in the original native decision
102
+ - test: inherit the integration default for behavioral questions
103
+ - test: set the integration default from the observed loaded tail
104
+ - chore(release): 0.221.0
105
+ - test: own the measured integration deadline in Vitest config
106
+ - test: await observed integration completion across tool paths
107
+ - feat: preserve finding composition and assigned arm populations
108
+ - test: await decision-point HTTP and ledger completion
109
+ - test: await durable readiness in filesystem integration cases
110
+ - test(process): wait for argv child readiness before abort
111
+ - feat(analyst): add bounded calibrated trace question observations
112
+ - fix(analyst): reject surrounding whitespace in caller gold ids
113
+ - test(analyst): reproduce whitespace source-id bypass
114
+ - test(optimizer): retire fake CLI metering harness
115
+ - test(analyst): isolate recorded gold admission scenarios
116
+ - fix(systemone): validate decision boundaries before routing
117
+ - ci: pin the eval publication dispatcher body
118
+ - fix(analyst): reserve excluded source ids across caller gold
119
+ - fix(analyst): validate root provenance before gold admission
120
+ - fix(analyst): preserve actor boundaries in AgentRx calibration gold
121
+ - Preserve manual drafts observed while recording failed adoption (#1076)
122
+ - Recover updater-owned failure drafts while preserving manual holds (#1075)
123
+ - feat(systemone): persist calibrated decision points and outcomes
124
+ - ci: move eval verification and Python publishing to owned runners
125
+ - chore(deps): bump opentelemetry-api in /clients/python (#1068)
126
+ - fix(adopt): quote optional workflow flags
127
+ - fix(adopt): preserve shallow history and caller-owned dependency references
128
+ - fix(adopt): reconcile effective workspace pins and preserve proposal history
129
+
7
130
  ## [1.0.1] — 2026-10-28
8
131
 
9
132
  - Refresh the live benchmark dependency identity after interface updates
package/dist/cli.js CHANGED
@@ -9,7 +9,7 @@ import { t as createChatClient } from "./chat-client-D0me8iwq.js";
9
9
  import { t as runAnalystBenchmarkCommand } from "./benchmark-command-BeDZB3BQ.js";
10
10
  import { i as buildOpenApi, l as handleVersion, o as runRpcBatch, r as startServerAsync, s as runRpcOnce } from "./server-CPKyf3bz.js";
11
11
  import { b as editCreditText, f as landscape, g as surfaceTextEdits, l as metaSearch, m as formatLandscape, n as taskMatrix, o as skillManifold, r as formatSkillManifold, s as renderMetaSearchText, t as tree, v as front, y as editCredit } from "./tree-C2N31CoI.js";
12
- import { c as discoveryRunRolloutLines, i as analyzeSupervisorRun, n as renderSupervisorRunHeadline, r as renderSupervisorRunMarkdown } from "./render-aB58Be3N.js";
12
+ import { c as discoveryRunRolloutLines, i as analyzeSupervisorRun, n as renderSupervisorRunHeadline, r as renderSupervisorRunMarkdown } from "./render-CFrJ7M0o.js";
13
13
  import { createHash } from "node:crypto";
14
14
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
15
15
  import { dirname, join, resolve } from "node:path";
package/dist/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "@tangle-network/agent-eval — wire protocol",
5
- "version": "1.0.1",
5
+ "version": "1.0.2",
6
6
  "description": "HTTP and stdio RPC interface to agent-eval. The TypeScript runtime is the source of truth; this spec is the contract that cross-language clients (Python, Rust, Go) generate from.\n\nWire-protocol version: 1.1.0. Bumps on breaking changes to request/response schemas.",
7
7
  "contact": {
8
8
  "name": "Tangle Network",
@@ -682,16 +682,17 @@ function analyzeSupervisorRunSources(src, now = Date.now) {
682
682
  * analyst reads communication and steer edges from it.
683
683
  */
684
684
  const COORDINATION_FILE = "coordination-log.jsonl";
685
+ const readFileText = (path) => readFile(path, "utf8");
685
686
  /** File text, or null when the file does not exist. Any other read error throws. */
686
- async function readMaybe(path) {
687
- return readFile(path, "utf8").catch((error) => {
687
+ async function readMaybe(path, read = readFileText) {
688
+ return read(path).catch((error) => {
688
689
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") return null;
689
690
  throw error;
690
691
  });
691
692
  }
692
693
  /** The run's coordination log, or null when Runtime wrote none. */
693
- function readCoordinationLog(runDir) {
694
- return readMaybe(join(runDir, COORDINATION_FILE));
694
+ function readCoordinationLog(runDir, read = readFileText) {
695
+ return readMaybe(join(runDir, COORDINATION_FILE), read);
695
696
  }
696
697
  // src/supervisor-run/runtime-source-limits.ts
697
698
  function spendRecord(value) {
@@ -1015,10 +1016,10 @@ const HARNESS_SESSION_FILE = {
1015
1016
  opencode: /(^|\/)(\.local\/share\/opencode\/(opencode\.db|storage\/session\/.+\.json|export\/.+\.json)|\.opencode\/sessions\/.+)$/u
1016
1017
  };
1017
1018
  /** Session files the receipt's transcript blob lists, or undefined when it cannot say. */
1018
- async function receiptSessionFiles(file) {
1019
+ async function receiptSessionFiles(file, read) {
1019
1020
  let descriptor;
1020
1021
  try {
1021
- descriptor = JSON.parse(await readFile(file, "utf8"));
1022
+ descriptor = JSON.parse(await read(file));
1022
1023
  } catch {
1023
1024
  return;
1024
1025
  }
@@ -1055,7 +1056,7 @@ function nativeTraceSummary(workers, root) {
1055
1056
  const gaps = [count("partial") > 0 ? `${count("partial")} only a partial copy` : null, count("no-session-file") > 0 ? `${count("no-session-file")} a receipt with no session file` : null].filter((gap) => gap !== null);
1056
1057
  return `per node — ${count("complete")} of ${workers.length} workers carry a complete native session receipt (workers[].nativeSession)${gaps.length > 0 ? `; ${gaps.join("; ")}` : ""}; root: ${rootText} (result.json rootHarnessTranscript)`;
1057
1058
  }
1058
- async function workspaceCapturesFromOutput(runDir, ref) {
1059
+ async function workspaceCapturesFromOutput(runDir, ref, read) {
1059
1060
  const outRef = typeof ref === "string" ? ref : null;
1060
1061
  const blobPath = blobFile(runDir, ref);
1061
1062
  const missing = (projectionGap) => ({
@@ -1070,7 +1071,7 @@ async function workspaceCapturesFromOutput(runDir, ref) {
1070
1071
  });
1071
1072
  if (blobPath === null) return [missing("Runtime output has no valid content address")];
1072
1073
  if (!await isFile(blobPath)) return [missing("Runtime output blob is missing or not a file")];
1073
- const raw = await readMaybe(blobPath);
1074
+ const raw = await readMaybe(blobPath, read);
1074
1075
  if (raw === null) return [missing("Runtime output blob is missing")];
1075
1076
  let output;
1076
1077
  try {
@@ -1146,7 +1147,7 @@ async function workspaceCapturesFromOutput(runDir, ref) {
1146
1147
  * Blob files are checked on disk: a receipt that names a blob the directory no longer holds is
1147
1148
  * not a retained transcript.
1148
1149
  */
1149
- async function nodeTranscripts(runDir, events, nodeIds, root) {
1150
+ async function nodeTranscripts(runDir, events, nodeIds, read, root) {
1150
1151
  const facts = /* @__PURE__ */ new Map();
1151
1152
  const entry = (id) => {
1152
1153
  let found = facts.get(id);
@@ -1193,14 +1194,14 @@ async function nodeTranscripts(runDir, events, nodeIds, root) {
1193
1194
  retained.push(file);
1194
1195
  if (turn) retainedTurns += 1;
1195
1196
  }
1196
- workspaceCaptures.push(...await workspaceCapturesFromOutput(runDir, ref));
1197
+ workspaceCaptures.push(...await workspaceCapturesFromOutput(runDir, ref, read));
1197
1198
  }
1198
1199
  let nativeSession = null;
1199
1200
  if (fact.receipt !== null) {
1200
1201
  if (fact.receipt.status === "available") {
1201
1202
  const file = blobFile(runDir, fact.receipt.transcriptRef);
1202
1203
  if (file !== null && await isFile(file)) {
1203
- const sessionFiles = await receiptSessionFiles(file);
1204
+ const sessionFiles = await receiptSessionFiles(file, read);
1204
1205
  const coverageComplete = fact.receipt.coverageComplete;
1205
1206
  nativeSession = {
1206
1207
  status: "available",
@@ -1230,11 +1231,6 @@ async function nodeTranscripts(runDir, events, nodeIds, root) {
1230
1231
  return out;
1231
1232
  }
1232
1233
  /**
1233
- * Sources for a run dir whose spawn journal does not exist. Mirrors the
1234
- * absent shape the reader returns for a missing store: every
1235
- * journal-dependent metric downstream reads `unavailable`, never 0.
1236
- */
1237
- /**
1238
1234
  * The run identity a terminal record names when no journal exists yet: the
1239
1235
  * settle record's `tree.root`, else the failure record's `runId`. Both are
1240
1236
  * Runtime's own `runId`, so the report names the run the record is about
@@ -1290,12 +1286,13 @@ function absentRuntimeSupervisorRun(runDir, resultText, failureText, instanceId)
1290
1286
  * verdict.
1291
1287
  */
1292
1288
  async function readRuntimeSupervisorRun(runDir, opts = {}) {
1289
+ const read = opts.readFile ?? readFileText;
1293
1290
  const journalPath = join(runDir, JOURNAL_FILE);
1294
- const rawJournal = opts.strict === true ? await readFile(journalPath, "utf8") : await readMaybe(journalPath);
1291
+ const rawJournal = opts.strict === true ? await read(journalPath) : await readMaybe(journalPath, read);
1295
1292
  const resultPath = join(runDir, RESULT_FILE);
1296
1293
  const failurePath = join(runDir, FAILURE_FILE);
1297
- const resultText = await readMaybe(resultPath);
1298
- const failureText = await readMaybe(failurePath);
1294
+ const resultText = await readMaybe(resultPath, read);
1295
+ const failureText = await readMaybe(failurePath, read);
1299
1296
  const failure = parseOptionalRecord(failureText, failurePath);
1300
1297
  assertFailureRecord(failure, failurePath);
1301
1298
  const result = parseOptionalRecord(resultText, resultPath);
@@ -1304,7 +1301,7 @@ async function readRuntimeSupervisorRun(runDir, opts = {}) {
1304
1301
  assertResultMatchesJournal(normalized.root, result, resultPath);
1305
1302
  const childSpawns = normalized.events.filter((event) => event.kind === "spawned" && nonEmptyString(event.id) !== null).filter((event) => event.id !== normalized.root);
1306
1303
  const workerIds = new Set(childSpawns.map((event) => nonEmptyString(event.id)).filter((id) => id !== null));
1307
- const transcripts = await nodeTranscripts(runDir, normalized.events, /* @__PURE__ */ new Set([normalized.root, ...workerIds]), {
1304
+ const transcripts = await nodeTranscripts(runDir, normalized.events, /* @__PURE__ */ new Set([normalized.root, ...workerIds]), read, {
1308
1305
  id: normalized.root,
1309
1306
  receipt: recordOrNull(result?.rootHarnessTranscript)
1310
1307
  });
@@ -1346,7 +1343,7 @@ async function readRuntimeSupervisorRun(runDir, opts = {}) {
1346
1343
  judgeSource: null,
1347
1344
  patch: null,
1348
1345
  driverLog: null,
1349
- coordinationLog: await readCoordinationLog(runDir),
1346
+ coordinationLog: await readCoordinationLog(runDir, read),
1350
1347
  harnessWorkerTokens: null,
1351
1348
  harnessMissingReason: "Runtime FileRunContext has no external worker-token join",
1352
1349
  limits: sourceLimits(normalized.root, normalized.events, workerIds),
@@ -1365,10 +1362,13 @@ async function isRuntimeSupervisorRunDir(runDir) {
1365
1362
  return false;
1366
1363
  }
1367
1364
  async function isFile(path) {
1368
- return stat(path).then((entry) => entry.isFile()).catch((error) => {
1369
- if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR")) return false;
1365
+ try {
1366
+ return (await stat(path)).isFile();
1367
+ } catch (error) {
1368
+ const code = error !== null && typeof error === "object" && "code" in error ? error.code : null;
1369
+ if (code === "ENOENT" || code === "ENOTDIR") return false;
1370
1370
  throw error;
1371
- });
1371
+ }
1372
1372
  }
1373
1373
  // src/supervisor-run/discovery-rollouts.ts
1374
1374
  /**
@@ -1866,4 +1866,4 @@ function renderSupervisorRollupMarkdown(rollup, title = "Round rollup") {
1866
1866
  }
1867
1867
  export { findSupervisorRunDirs as a, discoveryRunRolloutLines as c, analyzeSupervisorRunSources as d, parsePatch as f, analyzeSupervisorRun as i, isRuntimeSupervisorRunDir as l, renderSupervisorRunHeadline as n, discoveryPlayCheckReward as o, renderSupervisorRunMarkdown as r, discoveryPursuitOf as s, renderSupervisorRollupMarkdown as t, readRuntimeSupervisorRun as u };
1868
1868
 
1869
- //# sourceMappingURL=render-aB58Be3N.js.map
1869
+ //# sourceMappingURL=render-CFrJ7M0o.js.map