Skip to content

lab: wfbench — Workflow Editor Agent Benchmark harness (stakwork 58313 twin) - #1650

Merged
Evanfeenstra merged 2 commits into
meta-validate-and-eval-promotefrom
wfbench-harness
Sep 4, 2026
Merged

lab: wfbench — Workflow Editor Agent Benchmark harness (stakwork 58313 twin)#1650
Evanfeenstra merged 2 commits into
meta-validate-and-eval-promotefrom
wfbench-harness

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Collaborator

Stacked on #1648 (needs meta/validate-workflow + the eval/* scoring steps). Design + step map: mcp/src/lab/plans/wfbench-harness.md.

What

wfbench-run is the vein twin of stakwork 58313 (+ nested 54419 / 55741 / 55740 / 58114 / 58414 / 57425 / 58312):

  • roster (graph/* steps, params.namespace): EvalSet { id: task_slug } → EvalRequirement×N { id: <slug>-<criterion_id> } (HAS_REQUIREMENT, ordered) → EvalTrigger { id: <slug>-<runId>, workflow_id, workflow_version_id, workflow_input, project_id }HAS_BASELINE_TRIGGER when the EvalSet had no trigger before, else HAS_TRIGGER. Runs in parallel with the author.
  • author: core agent + agentTools: ["meta/*"] (editor tool only) builds wfbench-<slug>; the version it shipped is resolved as vpin || vactive with a published-vs-vbefore gate (the gaia-evolve-gen lesson).
  • gate + rerun: wfbench/check-input-keys (the input.<key> references in the produced YAML vs the launch payload; mismatch or empty body = harness error, no launch) → meta/run-workflow (own runId = 58313's project_id) → wfbench/classify-run (a runtime-failed rerun is still judged).
  • judge: wfbench/build-materials inlines workflow YAML + custom step sources + launch payload + run output + expected output into one block → wfbench-judge-criterion per criterion (agent schema mode, nothing to read; crash = { error } = honest FAIL) → eval/aggregate-scores.
  • record: wfbench/build-eval-outputgraph/create-batch-triplet: EvalTrigger -HAS_OUTPUT-> EvalTriggerOutput { id: <slug>-<runId>, result, verdict, score, max_score, n_passed, n_total, judge_model }, and per criterion EvalTriggerOutput / EvalRequirement -HAS_CRITERION_RESULT-> CriterionResult { id: <slug>-<runId>-<criterion_id>, … }.
  • callback: wfbench/webhook-body = 58313's 4-way resolve_webhook_payload with the exact Hive keys (harness_error bodies carry no score fields); POSTed to webhook_url and returned as the run's output (58313's set_output diverged on error paths).

Graph attrs are limited to what the jarvis ontology declares (vein rejects the rest): EvalSet.project_id and the name on EvalTrigger/EvalTriggerOutput are omitted; 58312's HAS_CAUSE → Workflow_version is not written (no such relationship). Everything else matches and the smoke asserts it.

Not in v1: batch runner, stakwork-fetch/port-task, edit-existing. No stakwork credentials needed.

Verification

  • npx tsc --noEmit clean.
  • npx tsx src/lab/wfbench/smoke.ts — offline: seeds, discovers 22 steps, static-validates both workflows (0 errors, 0 warnings) through the authoring capability, drives all 10 pure steps, checks every node payload's attributes and every edge against JARVIS_ONTOLOGY. All pass.
  • Not yet run live (needs Neo4j + ANTHROPIC_API_KEY).

…3's twin)

wfbench-run: graph roster (EvalSet / EvalRequirement / EvalTrigger with
58313's ids, HAS_BASELINE_TRIGGER on the first trigger) in parallel with
the meta/* author agent -> resolve the shipped version -> input-key gate
-> rerun via meta/run-workflow -> per-criterion judge subflow ->
eval/aggregate-scores -> record EvalTriggerOutput + CriterionResult per
58312 -> one Hive callback body (POSTed and returned). Ten pure steps,
two workflows, seeded unstamped; wfbench/* is never an agent tool.

Offline smoke (src/lab/wfbench/smoke.ts): seeds, discovers, static-
validates both workflows through the authoring capability, drives every
pure step, and checks every graph payload's attributes and edges against
JARVIS_ONTOLOGY.
…t copies

A workflow's output is its last step's output, so returning fields from
several steps needs a passthrough step — harvey, gaia and wfbench each
carried an identical one, and the wfbench author reached for
gaia/pack-result because it was the first it found. `pack` is that
primitive in core (config = output), discoverable everywhere. Every
harvey/gaia/wfbench workflow, seed, smoke and doc is re-pointed; the
copies are deleted.
@Evanfeenstra

Copy link
Copy Markdown
Collaborator Author

Added on this branch: core pack step (vein) and removed the three per-experiment pack-result copies.

Live run of wfbench-run against local Neo4j + Anthropic (before this last commit): 4/4 pass, 55s, author $0.12 / 8 tool calls. Roster, EvalTriggerOutput and CriterionResult chain verified by Cypher in the wfbench namespace — edges and ids match 58313/58312. The produced workflow used gaia/pack-result as its combiner, which is what motivated the core step.

Verification after the change: vein npm test 665/665 (incl. new pack.test.ts); mcp tsc clean after refresh-vein; smokes green: wfbench, harvey deliver / smoke / evolve-smoke, gaia smoke / evolve-smoke.

@Evanfeenstra
Evanfeenstra merged commit dbc98d5 into meta-validate-and-eval-promote Sep 4, 2026
Evanfeenstra added a commit that referenced this pull request Sep 4, 2026
…3 twin) (#1650) (#1651)

* lab: wfbench — Workflow Editor Agent Benchmark harness (stakwork 58313's twin)

wfbench-run: graph roster (EvalSet / EvalRequirement / EvalTrigger with
58313's ids, HAS_BASELINE_TRIGGER on the first trigger) in parallel with
the meta/* author agent -> resolve the shipped version -> input-key gate
-> rerun via meta/run-workflow -> per-criterion judge subflow ->
eval/aggregate-scores -> record EvalTriggerOutput + CriterionResult per
58312 -> one Hive callback body (POSTed and returned). Ten pure steps,
two workflows, seeded unstamped; wfbench/* is never an agent tool.

Offline smoke (src/lab/wfbench/smoke.ts): seeds, discovers, static-
validates both workflows through the authoring capability, drives every
pure step, and checks every graph payload's attributes and edges against
JARVIS_ONTOLOGY.

* vein: core `pack` step; lab: drop the three per-experiment pack-result copies

A workflow's output is its last step's output, so returning fields from
several steps needs a passthrough step — harvey, gaia and wfbench each
carried an identical one, and the wfbench author reached for
gaia/pack-result because it was the first it found. `pack` is that
primitive in core (config = output), discoverable everywhere. Every
harvey/gaia/wfbench workflow, seed, smoke and doc is re-pointed; the
copies are deleted.

(cherry picked from commit dbc98d5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant