@tangle-network/agent-eval 0.148.0 → 0.150.0

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.
Files changed (137) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +5 -1
  3. package/dist/analyst/index.d.ts +14 -14
  4. package/dist/analyst/index.d.ts.map +1 -1
  5. package/dist/analyst/index.js +4 -4
  6. package/dist/{backend-integrity-Bz8nSrRE.d.ts → backend-integrity-DaeroaEs.d.ts} +2 -2
  7. package/dist/{backend-integrity-Bz8nSrRE.d.ts.map → backend-integrity-DaeroaEs.d.ts.map} +1 -1
  8. package/dist/{benchmark-Cn7ZMFNW.d.ts → benchmark-A0E-JZ1H.d.ts} +3 -3
  9. package/dist/{benchmark-Cn7ZMFNW.d.ts.map → benchmark-A0E-JZ1H.d.ts.map} +1 -1
  10. package/dist/{benchmark-command-Cz4fDmsk.js → benchmark-command-CqGA0SJQ.js} +8 -7
  11. package/dist/benchmark-command-CqGA0SJQ.js.map +1 -0
  12. package/dist/benchmarks/index.d.ts +4 -4
  13. package/dist/benchmarks/index.js +3 -3
  14. package/dist/campaign/index.d.ts +9 -9
  15. package/dist/campaign/index.js +6 -6
  16. package/dist/{campaign-BcfXzmPM.js → campaign-CR6Yt5ZS.js} +80 -7
  17. package/dist/campaign-CR6Yt5ZS.js.map +1 -0
  18. package/dist/{capture-fetch-BAx3Gntt.d.ts → capture-fetch-Im0UN1i6.d.ts} +2 -2
  19. package/dist/{capture-fetch-BAx3Gntt.d.ts.map → capture-fetch-Im0UN1i6.d.ts.map} +1 -1
  20. package/dist/{chat-client-BX8Wh3fn.js → chat-client-sFiClniQ.js} +2 -2
  21. package/dist/{chat-client-BX8Wh3fn.js.map → chat-client-sFiClniQ.js.map} +1 -1
  22. package/dist/cli.js +2 -2
  23. package/dist/{client-BV7icIfy.d.ts → client-w6vVJhSp.d.ts} +2 -2
  24. package/dist/{client-BV7icIfy.d.ts.map → client-w6vVJhSp.d.ts.map} +1 -1
  25. package/dist/contract/index.d.ts +10 -10
  26. package/dist/contract/index.js +5 -5
  27. package/dist/{default-registry-BUtRMRKk.d.ts → default-registry-BhRNsP-D.d.ts} +6 -6
  28. package/dist/{default-registry-BUtRMRKk.d.ts.map → default-registry-BhRNsP-D.d.ts.map} +1 -1
  29. package/dist/{define-agent-eval-CvZQW4u9.js → define-agent-eval-ChrtErmg.js} +3 -3
  30. package/dist/define-agent-eval-ChrtErmg.js.map +1 -0
  31. package/dist/{define-agent-eval-hXLUBKtb.d.ts → define-agent-eval-Cw3mkB4-.d.ts} +6 -7
  32. package/dist/define-agent-eval-Cw3mkB4-.d.ts.map +1 -0
  33. package/dist/{dspy-rlm-engine-BmtOl_kP.js → dspy-rlm-engine-Csi3CUAT.js} +2 -2
  34. package/dist/{dspy-rlm-engine-BmtOl_kP.js.map → dspy-rlm-engine-Csi3CUAT.js.map} +1 -1
  35. package/dist/{engine-CIy18RTX.d.ts → engine-CgQdUh-r.d.ts} +4 -4
  36. package/dist/{engine-CIy18RTX.d.ts.map → engine-CgQdUh-r.d.ts.map} +1 -1
  37. package/dist/{eval-campaign-bmZ6NIIP.js → eval-campaign-Czc2TcW5.js} +2 -2
  38. package/dist/{eval-campaign-bmZ6NIIP.js.map → eval-campaign-Czc2TcW5.js.map} +1 -1
  39. package/dist/{exact-types-rdKFzEnK.d.ts → exact-types-D9_T83Ol.d.ts} +2 -2
  40. package/dist/{exact-types-rdKFzEnK.d.ts.map → exact-types-D9_T83Ol.d.ts.map} +1 -1
  41. package/dist/experiment/index.d.ts +73 -4
  42. package/dist/experiment/index.d.ts.map +1 -1
  43. package/dist/experiment/index.js +175 -1
  44. package/dist/experiment/index.js.map +1 -1
  45. package/dist/{experiment-tracker-D9VHwRm-.d.ts → experiment-tracker-Cp9ougHs.d.ts} +2 -2
  46. package/dist/{experiment-tracker-D9VHwRm-.d.ts.map → experiment-tracker-Cp9ougHs.d.ts.map} +1 -1
  47. package/dist/{external-optimizer-contracts-CSjDLLmr.d.ts → external-optimizer-contracts-mbhR9Ldu.d.ts} +13 -6
  48. package/dist/{external-optimizer-contracts-CSjDLLmr.d.ts.map → external-optimizer-contracts-mbhR9Ldu.d.ts.map} +1 -1
  49. package/dist/{external-optimizer-process-C4AyCcQd.js → external-optimizer-process-tDe72VRO.js} +4 -4
  50. package/dist/{external-optimizer-process-C4AyCcQd.js.map → external-optimizer-process-tDe72VRO.js.map} +1 -1
  51. package/dist/{external-optimizer-subprocess-DU1KM8yV.js → external-optimizer-subprocess-BepyNwtj.js} +341 -25
  52. package/dist/external-optimizer-subprocess-BepyNwtj.js.map +1 -0
  53. package/dist/{feedback-trajectory-niGeR6uJ.d.ts → feedback-trajectory-Cc9M2tNF.d.ts} +3 -3
  54. package/dist/{feedback-trajectory-niGeR6uJ.d.ts.map → feedback-trajectory-Cc9M2tNF.d.ts.map} +1 -1
  55. package/dist/fuzz.d.ts +1 -1
  56. package/dist/hosted/index.d.ts +2 -2
  57. package/dist/{index-gtjtfLEJ.d.ts → index-DL4MJuJL.d.ts} +8 -8
  58. package/dist/{index-gtjtfLEJ.d.ts.map → index-DL4MJuJL.d.ts.map} +1 -1
  59. package/dist/index-DjpxROrT.d.ts +1 -0
  60. package/dist/{index-Dzn8Q3C2.d.ts → index-dh0kp2GM.d.ts} +42 -11
  61. package/dist/index-dh0kp2GM.d.ts.map +1 -0
  62. package/dist/index.d.ts +21 -21
  63. package/dist/index.js +13 -20
  64. package/dist/index.js.map +1 -1
  65. package/dist/{integrity-CGfpTE5-.d.ts → integrity-D2MAlC_K.d.ts} +2 -2
  66. package/dist/{integrity-CGfpTE5-.d.ts.map → integrity-D2MAlC_K.d.ts.map} +1 -1
  67. package/dist/{llm-client-BMuxYoZy.js → llm-client-CxyJ8Oft.js} +15 -6
  68. package/dist/llm-client-CxyJ8Oft.js.map +1 -0
  69. package/dist/{llm-judge-DWq1Ptco.js → llm-judge-D7UuMI2t.js} +4 -3
  70. package/dist/llm-judge-D7UuMI2t.js.map +1 -0
  71. package/dist/{matrix-Bc111FKv.d.ts → matrix-D3hL68uV.d.ts} +2 -2
  72. package/dist/{matrix-Bc111FKv.d.ts.map → matrix-D3hL68uV.d.ts.map} +1 -1
  73. package/dist/meta-eval/index.d.ts +1 -1
  74. package/dist/{multi-layer-verifier-DIguZc8Z.d.ts → multi-layer-verifier-BUaQ4C17.d.ts} +3 -3
  75. package/dist/{multi-layer-verifier-DIguZc8Z.d.ts.map → multi-layer-verifier-BUaQ4C17.d.ts.map} +1 -1
  76. package/dist/multishot/golden/index.d.ts +1 -1
  77. package/dist/multishot/index.d.ts +2 -2
  78. package/dist/openapi.json +1 -1
  79. package/dist/{produced-state-C0oJ4vr-.js → produced-state-WJs_enbZ.js} +3 -3
  80. package/dist/{produced-state-C0oJ4vr-.js.map → produced-state-WJs_enbZ.js.map} +1 -1
  81. package/dist/{promotion-policy-CewdjfCJ.d.ts → promotion-policy-DYRzXdTV.d.ts} +2 -2
  82. package/dist/{promotion-policy-CewdjfCJ.d.ts.map → promotion-policy-DYRzXdTV.d.ts.map} +1 -1
  83. package/dist/{provenance-DA-Pmyfv.d.ts → provenance-Bh9k3sjl.d.ts} +17 -6
  84. package/dist/{provenance-DA-Pmyfv.d.ts.map → provenance-Bh9k3sjl.d.ts.map} +1 -1
  85. package/dist/{registry-CaqJIDdN.d.ts → registry-DhpX9Bsg.d.ts} +4 -4
  86. package/dist/{registry-CaqJIDdN.d.ts.map → registry-DhpX9Bsg.d.ts.map} +1 -1
  87. package/dist/{researcher-BySlpla_.d.ts → researcher-CbCK-ppF.d.ts} +3 -3
  88. package/dist/{researcher-BySlpla_.d.ts.map → researcher-CbCK-ppF.d.ts.map} +1 -1
  89. package/dist/{reward-hacking-Bu8ev6PR.d.ts → reward-hacking-62tojkQd.d.ts} +2 -2
  90. package/dist/{reward-hacking-Bu8ev6PR.d.ts.map → reward-hacking-62tojkQd.d.ts.map} +1 -1
  91. package/dist/rl.d.ts +4 -4
  92. package/dist/rl.js +1 -1
  93. package/dist/{semantic-concept-judge-BI7Rrl5-.js → semantic-concept-judge-B7KPD57W.js} +2 -2
  94. package/dist/{semantic-concept-judge-BI7Rrl5-.js.map → semantic-concept-judge-B7KPD57W.js.map} +1 -1
  95. package/dist/{series-convergence-D2fsoJ2w.d.ts → series-convergence-VhTad5TM.d.ts} +2 -2
  96. package/dist/{series-convergence-D2fsoJ2w.d.ts.map → series-convergence-VhTad5TM.d.ts.map} +1 -1
  97. package/dist/{server-D9wQclzG.js → server-DNiUVirV.js} +2 -2
  98. package/dist/{server-D9wQclzG.js.map → server-DNiUVirV.js.map} +1 -1
  99. package/dist/{skillopt-optimization-method-CrY0OG17.d.ts → skillopt-optimization-method-BtgL6PMH.d.ts} +20 -14
  100. package/dist/{skillopt-optimization-method-CrY0OG17.d.ts.map → skillopt-optimization-method-BtgL6PMH.d.ts.map} +1 -1
  101. package/dist/{skillopt-optimization-method-Donmq4sq.js → skillopt-optimization-method-L8vi4h4m.js} +92 -14
  102. package/dist/skillopt-optimization-method-L8vi4h4m.js.map +1 -0
  103. package/dist/{statistical-heldout-uxSpFEjm.d.ts → statistical-heldout-Caxd30ZF.d.ts} +2 -2
  104. package/dist/{statistical-heldout-uxSpFEjm.d.ts.map → statistical-heldout-Caxd30ZF.d.ts.map} +1 -1
  105. package/dist/{store-tool-spans-D5FhM0_A.d.ts → store-tool-spans-BGg2QFk1.d.ts} +4 -4
  106. package/dist/{store-tool-spans-D5FhM0_A.d.ts.map → store-tool-spans-BGg2QFk1.d.ts.map} +1 -1
  107. package/dist/{tool-groups-zpufabP8.d.ts → tool-groups-BuhFx38z.d.ts} +3 -3
  108. package/dist/tool-groups-BuhFx38z.d.ts.map +1 -0
  109. package/dist/trace-repair/index.d.ts +1 -1
  110. package/dist/traces.d.ts +7 -7
  111. package/dist/{types-ColZlZtc.d.ts → types-B61iI2ZG.d.ts} +2 -2
  112. package/dist/{types-ColZlZtc.d.ts.map → types-B61iI2ZG.d.ts.map} +1 -1
  113. package/dist/{types-BohHewKK.d.ts → types-BNbhD_Vj.d.ts} +2 -2
  114. package/dist/{types-BohHewKK.d.ts.map → types-BNbhD_Vj.d.ts.map} +1 -1
  115. package/dist/{types-DOhGq4S1.d.ts → types-COAJy8Ku.d.ts} +15 -3
  116. package/dist/types-COAJy8Ku.d.ts.map +1 -0
  117. package/dist/{types-C1Bmeb8X.d.ts → types-COEjZMLY.d.ts} +3 -3
  118. package/dist/{types-C1Bmeb8X.d.ts.map → types-COEjZMLY.d.ts.map} +1 -1
  119. package/dist/wire/index.d.ts +2 -2
  120. package/dist/wire/index.js +1 -1
  121. package/docs/campaign-proposers.md +60 -3
  122. package/docs/experiment.md +2 -0
  123. package/docs/feature-guide.md +1 -1
  124. package/docs/multishot-golden-records.md +3 -0
  125. package/package.json +4 -2
  126. package/dist/benchmark-command-Cz4fDmsk.js.map +0 -1
  127. package/dist/campaign-BcfXzmPM.js.map +0 -1
  128. package/dist/define-agent-eval-CvZQW4u9.js.map +0 -1
  129. package/dist/define-agent-eval-hXLUBKtb.d.ts.map +0 -1
  130. package/dist/external-optimizer-subprocess-DU1KM8yV.js.map +0 -1
  131. package/dist/index-CKblBxtr.d.ts +0 -1
  132. package/dist/index-Dzn8Q3C2.d.ts.map +0 -1
  133. package/dist/llm-client-BMuxYoZy.js.map +0 -1
  134. package/dist/llm-judge-DWq1Ptco.js.map +0 -1
  135. package/dist/skillopt-optimization-method-Donmq4sq.js.map +0 -1
  136. package/dist/tool-groups-zpufabP8.d.ts.map +0 -1
  137. package/dist/types-DOhGq4S1.d.ts.map +0 -1
@@ -11,6 +11,7 @@ import { a as inMemoryExperimentStore, r as fileExperimentStore, t as Experiment
11
11
  import { n as pairedEvalueSequence, r as sequentialCrossingHorizon } from "../sequential-CzK5DarL.js";
12
12
  import { n as paretoPolicy, r as paretoSignificanceGate, t as buildEvidenceVector } from "../promotion-policy-xzA40Evo.js";
13
13
  import { n as sequentialPairedGate, t as sequentialDecide } from "../sequential-C458DXNf.js";
14
+ import { z } from "zod";
14
15
  //#region src/experiment/ast.ts
15
16
  /**
16
17
  * The registered-rule AST: every rule an experiment registers is DATA.
@@ -1168,6 +1169,179 @@ function requiredIdentity(value, field) {
1168
1169
  return normalized;
1169
1170
  }
1170
1171
  //#endregion
1172
+ //#region src/experiment/evidence-record.ts
1173
+ /**
1174
+ * The evidence registry record — the canonical, machine-readable unit for a
1175
+ * measured claim about an agent, a prompt, a policy, or an instrument.
1176
+ *
1177
+ * One record answers, in typed fields, the questions a scattered results doc
1178
+ * leaves to prose: what was claimed, what instrument measured it, the exact
1179
+ * command that reproduces it, which arms ran, the denominator, what it cost,
1180
+ * what confounds the comparison, and how much trust the evidence has earned.
1181
+ *
1182
+ * Records live as JSON files in `evidence/records/` at the repo root — one
1183
+ * file per claim, filename `<id>.json`. The registry lives in agent-eval
1184
+ * because the measurement substrate owns evidence legitimacy; every other
1185
+ * repo keeps at most a pointer file. `scripts/render-evidence-index.ts`
1186
+ * generates the human index from these records, so prose can never drift
1187
+ * from data, and `pnpm run evidence:check` (part of `verify:package`) fails
1188
+ * on an invalid record or a stale index.
1189
+ *
1190
+ * The shape extends the `.evolve/experiments.jsonl` session-log vocabulary
1191
+ * (ts/hypothesis/change/result/evidence) into a curated registry record.
1192
+ * Session logs stay append-only diaries; a registry record is the durable,
1193
+ * addressable claim distilled from them.
1194
+ */
1195
+ /**
1196
+ * Trust ladder for a recorded claim, strongest first.
1197
+ *
1198
+ * - `CERTIFIED` — pre-registered rule, sealed or held-out data, and either a
1199
+ * defended challenge or a check that re-runs in the suite.
1200
+ * - `MEASURED-ONCE` — one honest measurement on the real path, not replicated.
1201
+ * - `RESOLVED-NULL` — measured with an adequate instrument; the effect did not
1202
+ * appear under the registered rule. A null is a result, not a failure.
1203
+ * - `UNVERIFIED` — stated somewhere load-bearing, but no independent check has
1204
+ * run. Admitting this state is what keeps folklore out of the other four.
1205
+ * - `KILLED` — refuted, invalidated, or superseded by a stronger record.
1206
+ */
1207
+ const EVIDENCE_STATES = [
1208
+ "CERTIFIED",
1209
+ "MEASURED-ONCE",
1210
+ "RESOLVED-NULL",
1211
+ "UNVERIFIED",
1212
+ "KILLED"
1213
+ ];
1214
+ const idPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
1215
+ const datePattern = /^\d{4}-\d{2}-\d{2}$/;
1216
+ const sha256Pattern = /^[0-9a-f]{64}$/;
1217
+ /** Denominator of the measurement. A claim without an `n` is prose, not evidence. */
1218
+ const evidenceDenominatorSchema = z.strictObject({
1219
+ value: z.number().positive().finite(),
1220
+ /** What one unit is: rows, cases, rollouts, records, leaves… */
1221
+ unit: z.string().min(1),
1222
+ /** Clustering, reps, split names — whatever the bare number hides. */
1223
+ detail: z.string().min(1).optional()
1224
+ });
1225
+ const evidenceRegistryRecordSchema = z.strictObject({
1226
+ /** Stable kebab-case identity; the registry filename is `<id>.json`. */
1227
+ id: z.string().regex(idPattern),
1228
+ /** Date the decisive measurement completed, `YYYY-MM-DD`. */
1229
+ date: z.string().regex(datePattern),
1230
+ /** The one-sentence load-bearing claim, stated so it can fail. */
1231
+ claim: z.string().min(1),
1232
+ /** Domain the claim lives in: trace-repair, multishot, analyst, vertical-bench… */
1233
+ domain: z.string().min(1),
1234
+ /** The instrument that produced the number — script, harness, oracle, judge. */
1235
+ instrument: z.string().min(1),
1236
+ /**
1237
+ * The exact invocation that reproduces the measurement.
1238
+ * `null` means the invocation was not preserved — a named gap, never a guess.
1239
+ */
1240
+ command: z.string().min(1).nullable(),
1241
+ /** Compared arms. Empty for a single-arm measurement. */
1242
+ arms: z.array(z.string().min(1)),
1243
+ n: evidenceDenominatorSchema,
1244
+ /** The measured numbers, with uncertainty when it exists. Numbers, not adjectives. */
1245
+ result: z.string().min(1),
1246
+ evidenceState: z.enum(EVIDENCE_STATES),
1247
+ /** Where the raw data lives: repo paths, PR/gist URLs, run directories. Never empty. */
1248
+ artifacts: z.array(z.string().min(1)).min(1),
1249
+ /**
1250
+ * Measured spend in USD. `0` is a true zero (deterministic, no paid calls);
1251
+ * `null` means spend was not captured — a named gap, never a silent zero.
1252
+ */
1253
+ costUsd: z.number().nonnegative().nullable(),
1254
+ /** Every known asymmetry or threat to validity. Empty only when none is known. */
1255
+ confounds: z.array(z.string().min(1)),
1256
+ /** Repo whose work produced the evidence (the registry itself lives here). */
1257
+ sourceRepo: z.string().min(1),
1258
+ /** Seal digest of the registered experiment (`./experiment`), when one governed the run. */
1259
+ experimentDigest: z.string().regex(sha256Pattern).optional(),
1260
+ /** Ids of records this one supersedes. */
1261
+ supersedes: z.array(z.string().regex(idPattern)).optional(),
1262
+ notes: z.string().min(1).optional()
1263
+ });
1264
+ /** Parse one record; throws with the zod issue list on any violation. */
1265
+ function parseEvidenceRegistryRecord(raw) {
1266
+ return evidenceRegistryRecordSchema.parse(raw);
1267
+ }
1268
+ var EvidenceRegistryError = class extends Error {};
1269
+ /**
1270
+ * Validate a set of records as one registry: every record parses, ids are
1271
+ * unique, and every `supersedes` target exists. Returns records sorted in
1272
+ * the registry's canonical order (trust ladder, then date desc, then id).
1273
+ */
1274
+ function validateEvidenceRegistry(raws) {
1275
+ const records = raws.map((raw) => parseEvidenceRegistryRecord(raw));
1276
+ const seen = /* @__PURE__ */ new Set();
1277
+ for (const record of records) {
1278
+ if (seen.has(record.id)) throw new EvidenceRegistryError(`duplicate evidence record id: ${record.id}`);
1279
+ seen.add(record.id);
1280
+ }
1281
+ for (const record of records) for (const target of record.supersedes ?? []) if (!seen.has(target)) throw new EvidenceRegistryError(`record ${record.id} supersedes unknown record: ${target}`);
1282
+ const stateRank = new Map(EVIDENCE_STATES.map((state, index) => [state, index]));
1283
+ return [...records].sort((a, b) => {
1284
+ const byState = (stateRank.get(a.evidenceState) ?? 0) - (stateRank.get(b.evidenceState) ?? 0);
1285
+ if (byState !== 0) return byState;
1286
+ if (a.date !== b.date) return a.date < b.date ? 1 : -1;
1287
+ return a.id < b.id ? -1 : 1;
1288
+ });
1289
+ }
1290
+ function mdEscape(text) {
1291
+ return text.replace(/\|/g, "\\|").replace(/\n/g, " ");
1292
+ }
1293
+ function formatCost(costUsd) {
1294
+ if (costUsd === null) return "not captured";
1295
+ return `$${costUsd.toFixed(2)}`;
1296
+ }
1297
+ function formatN(n) {
1298
+ const base = `${n.value} ${n.unit}`;
1299
+ return n.detail ? `${base} (${n.detail})` : base;
1300
+ }
1301
+ /**
1302
+ * Render the registry's human index from records. Deterministic: identical
1303
+ * records always produce identical output, so a byte diff against the
1304
+ * committed index is the freshness check. No clocks, no environment.
1305
+ */
1306
+ function renderEvidenceIndex(raws) {
1307
+ const records = validateEvidenceRegistry(raws);
1308
+ const lines = [
1309
+ "# Evidence index",
1310
+ "",
1311
+ "<!-- GENERATED by scripts/render-evidence-index.ts from evidence/records/*.json.",
1312
+ " Edit the records, run `pnpm run evidence:render`, and commit both.",
1313
+ " `pnpm run evidence:check` (inside verify:package) fails when this file drifts. -->",
1314
+ "",
1315
+ `${records.length} records. States: ${EVIDENCE_STATES.join(" > ")}.`,
1316
+ "",
1317
+ "| state | date | id | claim | result |",
1318
+ "| --- | --- | --- | --- | --- |"
1319
+ ];
1320
+ for (const r of records) lines.push(`| ${r.evidenceState} | ${r.date} | [\`${r.id}\`](#${r.id}) | ${mdEscape(r.claim)} | ${mdEscape(r.result)} |`);
1321
+ for (const r of records) {
1322
+ lines.push("", `## ${r.id}`, "");
1323
+ lines.push(`**${r.evidenceState}** · ${r.date} · ${r.domain} · source repo \`${r.sourceRepo}\``);
1324
+ lines.push("", `**Claim.** ${r.claim}`, "", `**Result.** ${r.result}`, "");
1325
+ lines.push(`- **Instrument**: ${r.instrument}`);
1326
+ lines.push(`- **Command**: ${r.command === null ? "not preserved" : `\`${r.command}\``}`);
1327
+ lines.push(`- **Arms**: ${r.arms.length === 0 ? "single-arm" : r.arms.join(" vs ")}`);
1328
+ lines.push(`- **n**: ${formatN(r.n)}`);
1329
+ lines.push(`- **Cost**: ${formatCost(r.costUsd)}`);
1330
+ if (r.experimentDigest) lines.push(`- **Experiment seal**: \`${r.experimentDigest}\``);
1331
+ lines.push(`- **Artifacts**:`);
1332
+ for (const artifact of r.artifacts) lines.push(` - ${artifact}`);
1333
+ if (r.confounds.length === 0) lines.push("- **Confounds**: none recorded");
1334
+ else {
1335
+ lines.push("- **Confounds**:");
1336
+ for (const confound of r.confounds) lines.push(` - ${confound}`);
1337
+ }
1338
+ if (r.supersedes && r.supersedes.length > 0) lines.push(`- **Supersedes**: ${r.supersedes.map((s) => `\`${s}\``).join(", ")}`);
1339
+ if (r.notes) lines.push(`- **Notes**: ${r.notes}`);
1340
+ }
1341
+ lines.push("");
1342
+ return lines.join("\n");
1343
+ }
1344
+ //#endregion
1171
1345
  //#region src/experiment/power.ts
1172
1346
  /**
1173
1347
  * Design-time power for task-clustered paired designs, with a refusal verdict.
@@ -1336,6 +1510,6 @@ function mixSeed(seed, effect) {
1336
1510
  return (seed ^ Math.round(effect * 1000003) * 2654435769) >>> 0 | 0;
1337
1511
  }
1338
1512
  //#endregion
1339
- export { BOOTSTRAP_GATE_MIN_N, DecisionTableNotTotalError, DesignRefusalError, EVIDENCE_AUTHORITY_KINDS, EVIDENCE_RECEIPT_VERSION, ExperimentTracker, FunnelIntegrityError, INDEPENDENT_EVIDENCE_AUTHORITY_KINDS, MatchedBudgetError, SealIntegrityError, amendExperiment, assertDesignAdequate, assertFunnelReconciles, assertMatchedBudgets, benjaminiHochberg, bonferroni, buildEvidenceVector, buildFunnel, canonicalize, classifyReissue, clusteredPower, comparePairedArms, composeFunnels, computeEstimand, computeInterval, createEvidenceReceipt, defineExperiment, eProcess, evaluateCondition, evaluateHaltRule, evaluateHypothesis, evaluateIdentityGate, evaluateOracleDeterminismGate, evaluatePopulationReproducibilityGate, evaluatePowerFloorGate, evaluatePredicate, evaluateProvenanceGate, executeAdmissionRule, executeDecisionRule, fileExperimentStore, hashJson, heldoutSignificance, holm, inMemoryExperimentStore, isIndependentEvidence, mcnemar, mcnemarPower, mcnemarRequiredN, mulberry32, openSealedExperiment, pairArms, pairHoldout, pairRunRecords, pairedBootstrap, pairedEvalueSequence, pairedMde, pairedRiskDifference, pairedRiskDifferenceExact, pairedRiskDifferenceScore, paretoPolicy, paretoSignificanceGate, powerPreflight, projectNLadderBudget, readField, renderFunnelTable, requiredPairedSampleSize, requiredSampleSize, runSelectionRule, runUniformPassBudget, sealExperiment, sequentialCrossingHorizon, sequentialDecide, sequentialPairedGate, signManifest, verifyEvidenceReceipt, verifyManifest, verifyMatchedBudgets, verifySealedExperiment, wilson };
1513
+ export { BOOTSTRAP_GATE_MIN_N, DecisionTableNotTotalError, DesignRefusalError, EVIDENCE_AUTHORITY_KINDS, EVIDENCE_RECEIPT_VERSION, EVIDENCE_STATES, EvidenceRegistryError, ExperimentTracker, FunnelIntegrityError, INDEPENDENT_EVIDENCE_AUTHORITY_KINDS, MatchedBudgetError, SealIntegrityError, amendExperiment, assertDesignAdequate, assertFunnelReconciles, assertMatchedBudgets, benjaminiHochberg, bonferroni, buildEvidenceVector, buildFunnel, canonicalize, classifyReissue, clusteredPower, comparePairedArms, composeFunnels, computeEstimand, computeInterval, createEvidenceReceipt, defineExperiment, eProcess, evaluateCondition, evaluateHaltRule, evaluateHypothesis, evaluateIdentityGate, evaluateOracleDeterminismGate, evaluatePopulationReproducibilityGate, evaluatePowerFloorGate, evaluatePredicate, evaluateProvenanceGate, evidenceDenominatorSchema, evidenceRegistryRecordSchema, executeAdmissionRule, executeDecisionRule, fileExperimentStore, hashJson, heldoutSignificance, holm, inMemoryExperimentStore, isIndependentEvidence, mcnemar, mcnemarPower, mcnemarRequiredN, mulberry32, openSealedExperiment, pairArms, pairHoldout, pairRunRecords, pairedBootstrap, pairedEvalueSequence, pairedMde, pairedRiskDifference, pairedRiskDifferenceExact, pairedRiskDifferenceScore, paretoPolicy, paretoSignificanceGate, parseEvidenceRegistryRecord, powerPreflight, projectNLadderBudget, readField, renderEvidenceIndex, renderFunnelTable, requiredPairedSampleSize, requiredSampleSize, runSelectionRule, runUniformPassBudget, sealExperiment, sequentialCrossingHorizon, sequentialDecide, sequentialPairedGate, signManifest, validateEvidenceRegistry, verifyEvidenceReceipt, verifyManifest, verifyMatchedBudgets, verifySealedExperiment, wilson };
1340
1514
 
1341
1515
  //# sourceMappingURL=index.js.map