Skip to content

evolve: guard the author summary channel against filler echoes - #1620

Merged
Evanfeenstra merged 1 commit into
mainfrom
author-output-hardening
Aug 30, 2026
Merged

evolve: guard the author summary channel against filler echoes#1620
Evanfeenstra merged 1 commit into
mainfrom
author-output-hardening

Conversation

@Evanfeenstra

Copy link
Copy Markdown
Collaborator

What

On a live prod gaia-evolve run, the generation authors' structured output came back with summary: "" (gen 0) and summary: "placeholder" (gen 1) — the known schema-mode failure where one no-tool-call text turn ends the agent loop and becomes the structured output. The existing version fallback kept grading honest (real versions were graded, the climb was genuine), but the summary channel is load-bearing in two places it silently poisoned:

  • briefings — the EXPLORE directive tells the next author "every approach summarized above has been tried — pick one that is none of them", which is only checkable against real summaries
  • the human reportgenerations[].summary is the primary "what changed" record

Fix

  1. eval/evolve-loop (generic — harvey + gaia): usableSummary() rejects empty/short/filler echoes and substitutes an honest marker ((no usable approach summary reported … read this version's YAML diff)) in both the live and journal-replay paths. AI SDK Output.object doesn't enforce schema constraints like minLength locally, so the guard lives harness-side where it has teeth.
  2. Author prompts (gaia + harvey evolve-gen authorSystem): explicit final-message discipline — the structured answer is harvested from the final turn, every field real, never filler, even when the budget runs out.
  3. Smoke: gaia evolve-smoke's gen-0 fixture now echoes placeholder and asserts the marker (never the filler) reaches the next briefing and the report.

Testing

tsc --noEmit clean · npx tsx src/lab/gaia/evolve-smoke.ts and src/lab/harvey/evolve-smoke.ts pass.

🤖 Generated with Claude Code

Observed live (gaia, prod): a schema-mode author ended on a bare text
turn and echoed summary '' / 'placeholder' into two generations. The
version fallback kept grading honest, but the junk summaries poisoned
the briefing channel — the EXPLORE directive's 'pick an approach that
is none of the above' is only checkable against real summaries — and
left the human report unreadable.

- eval/evolve-loop: usableSummary() rejects empty/short/filler echoes
  (placeholder, todo, n/a, …) and substitutes an honest marker pointing
  at the version YAML diff, in both the live and journal-replay paths.
- gaia/harvey evolve-gen authorSystem: explicit final-message discipline
  — every schema field filled with real values, never filler, even when
  the step budget runs out.
- gaia evolve-smoke: gen-0 fixture now echoes 'placeholder' and asserts
  the marker (not the filler) reaches the next briefing and the report.

tsc clean; gaia + harvey evolve smokes pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Evanfeenstra
Evanfeenstra merged commit f2666d4 into main Aug 30, 2026
6 checks passed
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