@tangle-network/agent-eval 0.110.0 → 0.110.1

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/dist/index.d.ts CHANGED
@@ -32,8 +32,8 @@ import { a as TraceAnalystSpan } from './store-C1YxJDEK.js';
32
32
  export { D as DEFAULT_TRACE_ANALYST_BUDGETS, b as DatasetOverview, E as ErrorCluster, Q as QueryTracesPage, S as SearchSpanResult, c as SearchTraceResult, d as SpanMatchRecord, e as TRACE_ANALYST_TRUNCATION_MARKER_PREFIX, T as TraceAnalysisStore, f as TraceAnalystByteBudgets, g as TraceAnalystFilters, h as TraceAnalystSpanKind, i as TraceAnalystSpanStatus, j as TraceAnalystTraceSummary, V as ViewSpansResult, k as ViewTraceOversized, l as ViewTraceResult } from './store-C1YxJDEK.js';
33
33
  import { b as JudgeConfig, J as JudgeScore, S as Scenario$1, g as Gate } from './types-v--ctu-b.js';
34
34
  import { A as AnalyzeRunsOptions } from './analyze-runs-Dmz6LA9e.js';
35
- import { q as Objective, t as ParetoResult, h as GepaProposerConstraints, a as RunImprovementLoopResult } from './gepa-BUNP3606.js';
36
- export { u as DEFAULT_RED_TEAM_CORPUS, D as Direction, e as RedTeamCase, v as RedTeamCategory, w as RedTeamFinding, x as RedTeamPayload, y as RedTeamReport, z as crowdingDistance, A as dominates, B as paretoFrontier, E as paretoFrontierWithCrowding, F as redTeamDataset, H as redTeamReport, I as scalarScore, J as scoreRedTeamOutput, K as toolNamesForRun } from './gepa-BUNP3606.js';
35
+ import { q as Objective, t as ParetoResult, h as GepaProposerConstraints, a as RunImprovementLoopResult } from './gepa-T8T215nw.js';
36
+ export { u as DEFAULT_RED_TEAM_CORPUS, D as Direction, e as RedTeamCase, v as RedTeamCategory, w as RedTeamFinding, x as RedTeamPayload, y as RedTeamReport, z as crowdingDistance, A as dominates, B as paretoFrontier, E as paretoFrontierWithCrowding, F as redTeamDataset, H as redTeamReport, I as scalarScore, J as scoreRedTeamOutput, K as toolNamesForRun } from './gepa-T8T215nw.js';
37
37
  import { S as SandboxDriver, H as HarnessConfig, a as SandboxHarnessResult } from './test-graded-scenario-mzYBKspu.js';
38
38
  export { D as DockerSandboxDriver, c as SandboxHarness, d as SandboxResult, e as SubprocessSandboxDriver, f as SubprocessSandboxDriverOptions, g as TestGradedRunOptions, b as TestGradedRunResult, T as TestGradedScenario, h as TestOutputParser, i as composeParsers, j as jestTestParser, p as pytestTestParser, r as runTestGradedScenario, v as vitestTestParser } from './test-graded-scenario-mzYBKspu.js';
39
39
  export { b as RunIntegrityError, R as RunIntegrityExpectations, c as RunIntegrityIssue, d as RunIntegrityIssueCode, a as RunIntegrityReport, e as assertRunCaptured, t as throwIfRunIncomplete } from './integrity-qemeBAyx.js';
package/dist/index.js CHANGED
@@ -59,7 +59,7 @@ import {
59
59
  llmJudge,
60
60
  parseCorrectnessResponse,
61
61
  verifyCompletion
62
- } from "./chunk-RNB2NICW.js";
62
+ } from "./chunk-GBI5J5DB.js";
63
63
  import {
64
64
  DEFAULT_MUTATION_PRIMITIVES,
65
65
  DEFAULT_RED_TEAM_CORPUS,
@@ -83,7 +83,7 @@ import {
83
83
  scoreRedTeamOutput,
84
84
  surfaceContentHash,
85
85
  toolNamesForRun
86
- } from "./chunk-GTERJI6Q.js";
86
+ } from "./chunk-J4AKLZEV.js";
87
87
  import {
88
88
  MODEL_PRICING,
89
89
  MetricsCollector,
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": "0.110.0",
5
+ "version": "0.110.1",
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.0.0. Bumps on breaking changes to request/response schemas.",
7
7
  "contact": {
8
8
  "name": "Tangle Network",
@@ -1,5 +1,5 @@
1
1
  import { S as Scenario, g as Gate, G as GateResult, n as GateContext, C as CampaignResult, p as Mutator, f as SurfaceProposer, M as MutableSurface, h as GateDecision } from './types-v--ctu-b.js';
2
- import { e as RedTeamCase, D as Direction, b as RunCampaignOptions } from './gepa-BUNP3606.js';
2
+ import { e as RedTeamCase, D as Direction, b as RunCampaignOptions } from './gepa-T8T215nw.js';
3
3
  import { R as RunRecord } from './run-record-DksGsfgv.js';
4
4
  import { a as PairedBootstrapResult } from './statistics-D88peojY.js';
5
5
  import { HostedClient, TraceSpanEvent } from './hosted/index.js';
@@ -61,25 +61,26 @@ Start at the top row and only move down when the row's *"reach for it when"* mat
61
61
  | `gepaProposer` | You want the strong default: reflective full-surface prompt rewrites, grounded in findings, keeping a Pareto frontier of complementary winners. | prompt string | **Yes — `improve({ surface: 'prompt' })` default.** Proven live. |
62
62
  | `skillOptProposer` | You are editing a structured `SKILL.md`/runbook and want small anchored add/delete/replace patches that preserve earlier rules. | skill/prompt string | **Yes — `improve({ surface: 'skills' })` default.** Not yet proven live. |
63
63
  | `parameterSweepProposer` | The likely fix is a config knob, not words — `retrieval.k`, `temperature`, `max_tokens`. You give it candidate patches; it applies them to a JSON surface. | JSON config string | Yes, but you supply the candidate list. |
64
- | `fapoProposer` | You want *evidence to decide when to escalate*: try prompt edits first, move to parameters, then to structural code — one scoped change per cycle, only escalating when the cheaper level is exhausted. **This is the composite/orchestration proposer** (there is no separate `compositeProposer`). | whatever its level proposers return | Exported; you wire the level proposers. |
64
+ | `fapoProposer` | You want *evidence to decide when to escalate*: try prompt edits first, move to parameters, then to structural code — one scoped change per cycle, only escalating when the cheaper level is exhausted. | whatever its level proposers return | Exported; you wire the level proposers. |
65
+ | `compositeProposer` | You want several proposers to share one candidate-generation budget in the same round. It allocates the population by declared weights, preserves member provenance, deduplicates surfaces, and isolates a member failure unless every member fails. | whatever its member proposers return | Exported; you wire the member proposers. |
65
66
  | `aceProposer` | You are accumulating hard-won lessons into a playbook and must **never** summarize an old lesson away (append-only, provenance-tagged). | playbook string | Exported. |
66
67
  | `memoryCurationProposer` | Same as ACE but you want a compact, deduped, re-ranked memory instead of append-only growth. | memory string | Exported. |
67
68
  | `evolutionaryProposer` | You want blind population search (mutate → measure → select) with no reflection over findings — a cheap control or a baseline to beat. | any string | Exported. |
68
69
  | `traceAnalystProposer` | Bench-only: race our trace-analysis evidence engine head-to-head inside `compareProposers`. | prompt string | Bench-only. |
69
70
  | `haloProposer` | Bench-only: race the external `halo-engine` analysis against ours. | prompt string | Bench-only, external. |
70
71
 
71
- Default path: `gepaProposer` for prompts; add `parameterSweepProposer` when a config knob is the suspect; wrap both in `fapoProposer` when you want the loop to decide *when* to escalate from words to knobs to code.
72
+ Default path: `gepaProposer` for prompts; add `parameterSweepProposer` when a config knob is the suspect; wrap levels in `fapoProposer` when the loop should decide *when* to escalate, or use `compositeProposer` when multiple proposer families must split one fixed population budget.
72
73
 
73
- ## Composing proposers — the only three ways, with runnable code
74
+ ## Composing proposers — four distinct shapes
74
75
 
75
- There is deliberately **no** `chainProposer`/`compositeProposer` primitive.
76
- Composition happens in exactly three shapes:
76
+ Choose the shape that matches the experiment:
77
77
 
78
- 1. **Escalate** — `fapoProposer` wraps a prompt + parameter + structural proposer into one, spending the cheapest level first.
79
- 2. **Race** — `compareProposers` runs N proposers on one holdout and returns a per-proposer lift CI + pairwise "who won".
80
- 3. **Plug in** — hand any composed proposer to the gated loop via `runImprovementLoop({ proposer })`, or the one-liner `improve({ surface, generator })` in `@tangle-network/agent-runtime`.
78
+ 1. **Portfolio** — `compositeProposer` splits one generation's population across member proposers by fixed weights and returns one provenance-labelled pool.
79
+ 2. **Escalate** — `fapoProposer` wraps prompt + parameter + structural levels into one proposer and spends on the cheapest level until evidence says to escalate.
80
+ 3. **Race** — `compareProposers` gives proposers separate loops, then re-scores their winners on one holdout and returns per-proposer lift intervals plus pairwise results.
81
+ 4. **Plug in** — hand any proposer to `runImprovementLoop({ proposer })`, or use `improve({ surface, generator })` in `@tangle-network/agent-runtime`.
81
82
 
82
- ### 1 + 3 — compose by escalation, then run the gated loop
83
+ ### 2 + 4 — compose by escalation, then run the improvement loop
83
84
 
84
85
  ```ts
85
86
  import {
@@ -93,8 +94,8 @@ import {
93
94
  const llm = { baseUrl: process.env.TANGLE_BASE_URL, apiKey: process.env.TANGLE_API_KEY }
94
95
  const model = 'deepseek-v4-flash'
95
96
 
96
- // Compose: prompt edits first (GEPA), escalate to a config knob only when
97
- // prompt-level search plateaus. `fapoProposer` IS the composite proposer.
97
+ // Compose by escalation: prompt edits first (GEPA), then a config knob only
98
+ // when prompt-level search plateaus. This is distinct from a peer portfolio.
98
99
  const proposer = fapoProposer({
99
100
  scope: { allowedLevels: ['prompt', 'parameter'] }, // no structural/code tier here
100
101
  promptProposer: gepaProposer({ llm, model, target: 'agent system prompt' }),
@@ -147,7 +148,7 @@ const out = await improve(profile, findings, {
147
148
  if (out.shipped) deploy(out.profile) // out.lift is the held-out winner − baseline
148
149
  ```
149
150
 
150
- ### 2 — race proposers head-to-head for a lift CI
151
+ ### 3 — race proposers head-to-head for a lift CI
151
152
 
152
153
  ```ts
153
154
  import {
@@ -196,7 +197,7 @@ Every entrant is re-scored on the **same** holdout with the **same** judges, so
196
197
  - Do not put eval logic inside a proposer — scoring lives in `dispatch` + `judges`, proposing lives in the proposer.
197
198
  - Do not let a proposer read held-out judge scores — `ProposeContext` makes that a compile error on purpose; a proposer that games the acceptance axis is an oracle, not an optimizer.
198
199
  - Do not read `lift` without `result.power`/MDE — a "+4" on a valset too small to detect +4 is noise wearing a number.
199
- - Do not look for a `compositeProposer` `fapoProposer` is the composite; `compareProposers` is the race; `runImprovementLoop`/`improve` is the plug.
200
+ - Do not confuse `compositeProposer` with `fapoProposer`: the former allocates one fixed population across peers, while the latter escalates through ordered levels from cheaper to more structural changes.
200
201
 
201
202
  ### neutralizationGate — the placebo / content-causality control
202
203
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-eval",
3
- "version": "0.110.0",
3
+ "version": "0.110.1",
4
4
  "description": "Evaluate and improve AI agents from runs, traces, judges, and feedback. Compare candidates, cluster failures, measure lift, and gate releases.",
5
5
  "homepage": "https://github.com/tangle-network/agent-eval#readme",
6
6
  "repository": {